Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Form1 aus Form2 schluießen (https://www.delphipraxis.net/130248-form1-aus-form2-schluiessen.html)

jaenicke 6. Mär 2009 10:37

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:
http://msdn.microsoft.com/en-us/library/ms644931.aspx

ChrisE 6. Mär 2009 10:42

Re: Form1 aus Form2 schluießen
 
Also erstmal: Kein Problem. Hab gerne geholfen :thumb:

Zum Nächsten mit den Messages:

Aus der Hilfe:
Zitat:

The WM_USER constant is used by applications to help define private messages for use by private window classes, usually of the form WM_USER+X, where X is an integer value.
Es Basiert also darauf, dass es Nummern sind. Es gibt vergebene Nummern (unterhalb von WM_USER) wie z.B. WM_CLOSE. Diese dürfen halt nicht verwendet werden.
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:
procedure WMMachJetztWeiter(var Msg: TMessage);
selber dürfte ja klar sein. Durch das dahinter schreiben von
Delphi-Quellcode:
message WM_MACH_JETZT_WEITER;
erkläre ich, dass diese Methode ausgelöst werden soll, wenn eine Nachricht mit dieser Nummer - WM_MACH_JETZT_WEITER - kommt.

Und das ist alles.

Und den Aufwand betreiben wir quasi nur, um den Thread von dem MainThread zu entkoppeln :-)

Gruß, Chris

BAMatze 6. Mär 2009 10:53

Re: Form1 aus Form2 schluießen
 
Danke an Chris und jaenicke für die Erklärung

BAMatze 9. Mär 2009 09:53

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:
  const M_MACH_WEITER = WM_USER +1;
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?

jaenicke 9. Mär 2009 09:58

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.

ChrisE 9. Mär 2009 10:36

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

Dipl Phys Ernst Winter 23. Mai 2009 16:02

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:
isAborted: boolean;
Form2 wird geöffnet mit
Delphi-Quellcode:
procedure TForm1.btnForm2ShowClick(Sender: TObject);
begin
  Form2.ShowModal;
  if isAborted then Close
end;
Zum Schließen von Form2 gibt es die Buttons btnClose und btnAbort
Delphi-Quellcode:
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;
die dem Hauptprogramm mit isAborted übermitteln, ob das Programm beendet werden soll oder nicht.

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 07:54 Uhr.
Seite 2 von 2     12   

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