![]() |
Re: Form1 aus Form2 schluießen
Es gibt einen Bereich mit Konstanten für Botschaften des Systems. Diese darf man natürlich nicht selbst nutzen, das wäre dann ja vielleicht z.B. der selbe Wert wie WM_PAINT. Deshalb gibt es die Grenze WM_USER, ab diesem Wert kann man eigene Konstanten definieren für die Botschaften.
Deshalb zählt man zu diesem ersten möglichen Wert noch etwas dazu um einen gültigen Konstantenwert für die eigenen Botschaften zu bekommen. ;-) Wichtig: Botschaften zwischen WM_USER und WM_APP dürfen nur innerhalb der Anwendung benutzt werden! Sollen die Botschaften systemweit verwendet werden, dann müssen diese oberhalb von WM_APP liegen. Mehr dazu findet sich in der Dokumentation von Microsoft: ![]() |
Re: Form1 aus Form2 schluießen
Also erstmal: Kein Problem. Hab gerne geholfen :thumb:
Zum Nächsten mit den Messages: Aus der Hilfe: Zitat:
Du erzeugst dir als eine Konstante für eine Message im Bereich WM_USER +X und unterhalb von WM_APP um eigene Nachrichten zu verarbeiten - also solche die es noch nicht gibt. Um jetzt auf so eine Nachricht reagieren zu können muss man ein paar Regeln einhalten. Ich denke aber, da gibt es weit aus qualifiziertere Leute hier die das erklären könnten. Im groben kann ich dir aber erklären was ich gemacht habe. Die Methode
Delphi-Quellcode:
selber dürfte ja klar sein. Durch das dahinter schreiben von
procedure WMMachJetztWeiter(var Msg: TMessage);
Delphi-Quellcode:
erkläre ich, dass diese Methode ausgelöst werden soll, wenn eine Nachricht mit dieser Nummer - WM_MACH_JETZT_WEITER - kommt.
message WM_MACH_JETZT_WEITER;
Und das ist alles. Und den Aufwand betreiben wir quasi nur, um den Thread von dem MainThread zu entkoppeln :-) Gruß, Chris |
Re: Form1 aus Form2 schluießen
Danke an Chris und jaenicke für die Erklärung
|
Re: Form1 aus Form2 schluießen
Hallo hier nochmal eine kleine Frage zu meinem Verständnis zu den Windows-Messages und ihrem Gültigkeitsbereich.
Wenn ich in einer Unit eine:
Delphi-Quellcode:
definiere, ist diese rein für diese Form/Unit und nicht für das gesamte Projekt gültig, so dass ich für eine andere Form/Unit diese WM_User+1-Message nochmal benutzen könnte oder?
const M_MACH_WEITER = WM_USER +1;
|
Re: Form1 aus Form2 schluießen
Du versendest diese Botschaft als Windowsbotschaft. D.h. es darf nicht passieren, dass zwei verschiedene Nachrichten mit dem selben Wert an die selbe Adresse gehen. Denn für den Empfänger wäre diese ja dann anhand des Wertes nicht mehr zu unterscheiden.
Deshalb ist es keine gute Idee mehrere Botschaften mit dem selben Wert zu benutzen. Am besten gib immer verschiedene Werte, dann kann auch nichts durcheinander gehen. |
Re: Form1 aus Form2 schluießen
Hallo,
sehe ich ähnlich wie jaenicke allerdings mit einer Unterscheidung. Da bei jedem Post/SendMessage eine Adresse angegeben werden muss - der Handle des Fensters das diese Botschaft verarbeiten soll - kann man durchaus ein und die selbe Nummer vergeben für unterschiedliches verhalten. Schliesslich sind die Aufgaben oftmals sehr Fensterbezogen, also doch sehr nah an dem Fenster für das die Nachricht ist. Da man aber eben in der Programmierung nie weiß was noch kommt sollte man vielleicht schon den Weg der Eindeutigkeit gehen :-) Dann sollten diese aber auch global in einer Deklarationsunit liegen. Sonst wird die Suche nach diesen Variablen um die entsprechend nächste Konstante anzulegen doch etwas aufwendig :-) Gruß, Chris |
Re: Form1 aus Form2 schluießen
Liste der Anhänge anzeigen (Anzahl: 1)
Versuchts doch einmal ganz einfach:
Das Hauptformular exportiert eine logische Variable
Delphi-Quellcode:
Form2 wird geöffnet mit
isAborted: boolean;
Delphi-Quellcode:
Zum Schließen von Form2 gibt es die Buttons btnClose und btnAbort
procedure TForm1.btnForm2ShowClick(Sender: TObject);
begin Form2.ShowModal; if isAborted then Close end;
Delphi-Quellcode:
die dem Hauptprogramm mit isAborted übermitteln, ob das Programm beendet werden soll oder nicht.
procedure TForm2.btnCloseClick(Sender: TObject); // Form2 schließen
begin isAborted:= false; Close end; procedure TForm2.btnAbortClick(Sender: TObject); // Programm beenden begin isAborted:= true; Close end; Mit ModalResult kann man's eleganter ausdrücken, es ist dann aber nicht mehr so einfach zu überblicken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:19 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-2025 by Thomas Breitkreuz