![]() |
Form zur Laufzeit neu erstellen
Hallo zusammen,
ich erstelle am Anfang eine Anmeldemaske. Nachdem das Passwort richtig eingegeben wurde mache ich folgendes:
Delphi-Quellcode:
Wenn ich diese Form dann zur Laufzeit des Programmes wieder neu erstellen möchte, wollte ich das so machen:
FormAnmeldung.Free;
Delphi-Quellcode:
Da tritt aber eine Zugriffsverletzung auf.
Application.CreateForm(TFormAnmeldung, FormAnmeldung);
FormAnmeldung.Show; Was mache ich falsch ? Gruss Holger |
Re: Form zur Laufzeit neu erstellen
Versuch es mal mit
Delphi-Quellcode:
FormAnmeldung := TFormAnmeldung.Create(Application);
|
Re: Form zur Laufzeit neu erstellen
Ich mach das immer so:
Delphi-Quellcode:
implementation
uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var myForm2 : TForm2; begin myForm2 := TForm2.Create(self); try myForm2.ShowModal; finally myForm2.Free; end; end; |
Re: Form zur Laufzeit neu erstellen
Dann könntest du die Form auch ohne Owner erzeugen
|
Re: Form zur Laufzeit neu erstellen
Zitat:
Ja, ich weiss. Ist mehr so "die Macht der Gewohnheit". |
Re: Form zur Laufzeit neu erstellen
Zitat:
ist ja nicht falsch aber unnötig. |
Re: Form zur Laufzeit neu erstellen
Vielen dank an euch.
Wenn ich nun
Delphi-Quellcode:
gemacht habe, müsste ich doch mit
FormAnmeldung.Free;
Delphi-Quellcode:
abfragen können ob die Form da ist oder nicht ?
if FormAnmeldung <> nil then ...
-> Weil bei mir sagt er Sie wäre da obwohl ich ja vorher Free gemacht habe ? Gruss Holger |
Re: Form zur Laufzeit neu erstellen
Nein, Du musst entweder FreeAndNil verwenden oder den Objektzeiger selbst entwerten.
|
Re: Form zur Laufzeit neu erstellen
So ???
Delphi-Quellcode:
FormAnmeldung <> FreeAndNil;
|
Re: Form zur Laufzeit neu erstellen
Entweder
Delphi-Quellcode:
oder
FormAnmeldung.Free;
FormAnmeldung := nil;
Delphi-Quellcode:
FreeAndNil(FormAnmeldung);
|
Re: Form zur Laufzeit neu erstellen
Nein satt
Delphi-Quellcode:
Kompo.free;
Delphi-Quellcode:
verwenden. dann kannst du mit
FreeAndNil ( kompo);
Delphi-Quellcode:
abfragen ob das Objekt noch existent ist.
if assigned( kompo)
|
Re: Form zur Laufzeit neu erstellen
Warum hat FormClose einen Parameter ?
Delphi-Quellcode:
So sieht das normalerweise aus. Alles andere ist überflüssig. Bei kleineren Programmen ohne OOP auch das inherited. FreeAndNil-Orgien besorgt Delphi automatisch. :zwinker:
procedure Tfrm.FormClose(Sender: TObject;
var Action: TCloseAction); begin inherited; Action := caFree; end; |
Re: Form zur Laufzeit neu erstellen
Das ist natürlich bei modalen Eingabeformularen sehr geschickt, nach schließen des Formualar sind die Eigaben gleich weg. :gruebel:
|
Re: Form zur Laufzeit neu erstellen
Nun folgt das nächste Problem:
Wenn ich nun die Form "gefreet und genilt" habe und während der Laufzeit wieder erstelle, kommt hier eine Zugriffsverletzung:
Delphi-Quellcode:
Warum ?
procedure TFormAnmeldung.BitBtnOKClick(Sender: TObject);
begin //Kein Passwort if FormAnmeldung.CB_Anwender.text = '' then ... Muss ich die ComboBox u.s.w. auch noch erstellen. Die müssten doch mit erstellt werden da ich ja hiermit erstelle:
Delphi-Quellcode:
FormAnmeldung := TFormAnmeldung.Create(Application);
FormAnmeldung.ShowModal; |
Re: Form zur Laufzeit neu erstellen
Ja und ? Wenn der User das so will ? Das caFree wird im FormClose tätig. Es ist nicht dafür zuständig, dass dieses ausgelöst wird ! Außerdem gibts auch FormCloseQuery um gezielt vorzugehen.
Edit : bezieht sich hierdrauf : Zitat:
|
Re: Form zur Laufzeit neu erstellen
Delphi-Quellcode:
procedure TFormAnmeldung.BitBtnOKClick(Sender: TObject);
begin //Kein Passwort if {FormAnmeldung.}CB_Anwender.text = '' then ... |
Re: Form zur Laufzeit neu erstellen
Ich hab auch mal Action := caFree ausprobiert, der Verweis ist aber noch da. Da muss man also := nil noch nachschieben.
Grüße, Messie |
Re: Form zur Laufzeit neu erstellen
Welcher Verweis ist noch da ? :shock: Habe hier zig Forms. Alle werden zum Anzeigen per create erzeugt und ohne Firlefanz mithilfe von cafree beim Close entfernt. Bei Bedarf werden sie also immer wieder neu erzeugt und das wars. Das gab noch nirgendwo einen Fehler.
|
Re: Form zur Laufzeit neu erstellen
Zitat:
Zitat:
Grüße, Messie |
Re: Form zur Laufzeit neu erstellen
Wenn ich die Form mit Form.Show anstatt Showmodal anzeige klappt es ... Warum ?
|
Re: Form zur Laufzeit neu erstellen
Zitat:
Wenn ich ein Fenster schliesse, dann brauche ich auch die Eingabefelder nicht mehr. Beim Schliessen (z.B. OK-Button) soll das Fenster (Formular) selber dafür sorgen, dass die relevanten Eingaben dauerhaft gespeichert werden. Entweder in einer ini oder in Variablen einer Daten-Unit. |
Re: Form zur Laufzeit neu erstellen
Nun, manchem mag es zB gefallen, die Eingaben eines modalen Dialogs in der aufrufenden Routine auszuwerten:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin with TForm2.Create(nil) do try ShowModal; //Eingaben auswerten finally Free; end; end; |
Re: Form zur Laufzeit neu erstellen
Zitat:
|
Re: Form zur Laufzeit neu erstellen
Hallo,
@Peinhard: Es ist doch ohne weiteres möglich mit dem out – Parameter noch nachträglich eine Auswertung vorzunehmen.
Delphi-Quellcode:
Im Hautprogramm wird dann der out – Parameter ausgewertet. Im meinem Beispiel wird das Programm nur beendet, wenn das richtige Passwort eingegeben worden ist.
class function TFormSPSDAPPassWort.PassWortFreigabe (out Rueckgabe : Boolean): Boolean;
begin with TFormSPSDAPPassWort.Create(nil) do try Result := ShowModal=mrok; // ModalResult auf mrOk if Result then Rueckgabe := TRUE // Rückgabe-Wert else Rueckgabe := FALSE; finally free; // Speicherfreigabe end; end; procedure TFormSPSDAPPassWort.Edit1Change(Sender: TObject); begin if Edit1.Text = 'P' then // Das Paßwort muss noch geändert werden. BitBtn3.Enabled := TRUE; // Der Button wird freigegeben end;
Delphi-Quellcode:
Bis bald Chemiker
procedure TSPSDAPHauptForm.Beenden1Click(Sender: TObject);
begin TFormSPSDAPPassWort.PassWortFreigabe (PRG_Ende); if Prg_Ende then begin close; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz