Re: Problem mit 2. Formular
@ Elvis
NEIN! - Ich bin nicht eingeschnappt! :-D Sorry, wenn der Eindruck entstanden ist. Manchmal nervt es mich selber, wenn ich mit allzu simplen Fragen ins Forum muss. Im übrigen ist es oft so, dass ich aus der Diskussion, die sich über die ursprüngliche Frage hinweg entwickelt, noch zusätzliche Informationen bekomme, die mir helfen, besser durch zu blicken. Dein Tip mit dem SDK hilft mir im Moment nicht wirklich weiter, da C# und Konsorten für mich noch echte Fremdsprachen sind. Aber irgendwie werd' ich mich schon durchbeißen. Servus aus München gfjs |
Re: Problem mit 2. Formular
Moin Thorsten,
Du hattest als Beispiel einen Dialog bentzt, richtig. Direkt danach kam diese Frage: Zitat:
Zitat:
Oh und nun zu den Dialekten... KhabaDings ist ein C# Fan, während ich eher ein Chrome Fan bin. Biedes sind aber .Net Sprachen und es ist in der .Net Szene durchaus üblich, Dinge, die nicht sprachbezogen in der eigenen Sprache zu erklären... (home is where...). Die Klassen und deren Verhalten sind ja absolut identisch. Es mag vllt noch hinzukommen dass anscheinend keiner von uns beiden einen D.Net compiler zur Hand hat. ;) |
Re: Problem mit 2. Formular
So, ich glaube ich weiss jetzt warum wir immer aneinander vorbeireden und ich versuche mein Problem jetzt nochmal zu beschreiben.
In Delphi (Win32) kann man sich ja Fenster beim Start automatisch initialisieren lassen. Diese Vorgehenweise finde ich sehr schlecht (Ausnahme natürlich die Hauptform). Wenn ich andere Fenster öffnen will, erstelle ich sie mir, zeige sie mit ShowModal und gebe den Speicher dann wieder frei. Das war ja auch das Beispiel was ich auf den Anfangspost geschrieben habe. Nun gibt es aber ja auch die Möglichkeit mit Show das Fenster anzuzeigen. Bei Delphi (Win32) bleibt das gleiche Fenster immer aktiv auch wenn es geschlossen wird und wird beim Beenden des Programms automatisch freigeben. Oder man erstellt es selber und gibt es auch wieder selber frei. Das Entscheidene ist jetzt das man in (Win32) immer das gleiche Fenster behält, während bei NET immer ein neues Fenster erstellt wird. Das heisst mein Aufrufbeispiel...
Delphi-Quellcode:
erstellt immer ein neues Fenster, wenn ich also ein zweites Fenster sehe und nochmal auf der Hauptform obiges Ereignis auslöse, dann wird noch ein zweites Fenster angelegt und sichtbar. Das ist denke ich manchmal sinnvoll, aber was ist wenn es nicht sinnvoll ist? Wenn man immer nur ein Fenster haben möchte? Wie müsste man das dann realisieren? Der Benutzer kann das zweite Fenster schliessen, ich möchte ihm aber den Inhalt wieder präsentieren, wenn er dieses zweite Fenster wieder über die Hauptform sichtbar macht.
with TWinForm1.create do
show; Aber ich denke das führt schon zu weit. Bleiben wir bei der einfachen Frage: "ich möchte nur ein zusätzliches Fenster sehen", egal wie oft ich die zweite Form mit Show aufrufe. Gut das geht zum Beispiel über eine Private-Variable, die ich ja initialisieren kann. Allerdings was ist wenn der Benutzer das Fenster schliesst? Dann wird das Fenster freigegeben und die Private-Variable zeigt nicht mehr auf ein gültiges Objekt. Wie weiss ich jetzt das ich das Fenster neu initialisieren muss? Hoffe mein eigentliches Problem wurde jetzt etwas verständlicher. Den mit ShowDialog (ShowModal) ergeben sich diese Probleme ja nicht, mit Show allerdings schon und genau das ist meine Verständnisfrage, wie könnte man soetwas sauber lösen. Wieder hoffnungsvolle Grüsse, Thorsten |
Re: Problem mit 2. Formular
Du willst also die globale Variable des d32 Designers simulieren?
Der Trick wäre eine class property, die beim Zugriff eine Instanz anlegt und dieser AllowDisposing false über gibt.
Delphi-Quellcode:
class property Instance : Form1 read get_Instance;
property AllowDisposing : Boolean := true;
Delphi-Quellcode:
Im FormClosing event noch das hier:
class function Form1.get_Instance: Form1;
begin if not assigned(fInstance) then begin fInstance := new Form1(); fInstance.AllowDisposing := false; end; result := fInstance; end;
Delphi-Quellcode:
Damit ein Disosed fInstance auch wieder neu angelegt wird, müsste Dipose angepasst werden:
procedure Form1.Form1_FormClosing(sender: Object; e: FormClosingEventArgs);
begin if not AllowDisposing then begin e.Cancel := true; Hide(); end; end;
Delphi-Quellcode:
Im HauptForm sowas:
method Form1.Dispose(disposing: boolean);
begin if disposing then begin if assigned(components) then components.Dispose(); if self = fInstance then fInstance := nil; end; inherited Dispose(disposing); end;
Delphi-Quellcode:
Form1.Instance.Show();
Das hätte auch den Vorteil, dass man weiter hin neue Instanzen von Form1 anlegen könnte, die sich beim Close zertören. Edit, bin etwas handicapped, da ich eine andere Tastatur benutze... (Zu oft Alt + S statt Alt + D getippt :wall: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz