Befehle zwischen zwei Forms / Child zum Parent

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Latze
Beiträge: 60
Registriert: Sa 4. Jul 2009, 09:11
OS, Lazarus, FPC: Win7 / Linux (Lazarus 1.4.0)
CPU-Target: 32Bit/64Bit

Befehle zwischen zwei Forms / Child zum Parent

Beitrag von Latze »

Ich stecke mal wieder fest. Ich habe mit Form1 einen Hauptbildschirm erstellt. Über mehrere Buttons wähle ich den Inhalt eines TPanels. Beim Start kommt direkt Form2, wo eine Datenbankverbindung hergestellt werden soll. Alle Menübuttons in Form1 habe ich zu diesem Zeitpunkt disabled. Sobald in Form2 eine Verbindung ausgewählt wurde, möchte natürlich, in Form1, die Buttons auf enabled setzen und die Datenbank öffnen.

Form2 bringe ich wie folgt in das TPanel:

Code: Alles auswählen

var
  FForm2 : TForm2;
.
.
.
procedure TForm1.FormCreate(Sender: TObject);
begin
  FForm2 := TForm2.Create(Panel1);
  FForm2.Parent := Panel1;
  FForm2.BorderStyle := bsnone;
  FForm2.Align := alClient;
  FForm2.Show;
end;


Ich suche also eine Möglichkeit, von Form2 auf Form1 zuzugreifen. Meine Versuche sind bisher gescheitert.
Wer glaubt, etwas zu sein, hat aufgehört, etwas zu werden.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Befehle zwischen zwei Forms / Child zum Parent

Beitrag von Scotty »

Da gibt es eine Menge Lösungen.

1. Aufnahme der unit1 unter uses wodurch Zugriff auf Funktionen und Eigenschaften, die als public definiert wurden, gewährt wird.

2. Definition eines callback-Mechanismus (man korrigiere meine Bezeichnung 8)) über entweder TNotification oder eigene Prozeduren

Code: Alles auswählen

(unit2)
type
   TOnData=procedure(Sender:TObject; const aValue:TMyData) of object;
   ...
   private
      FOnData : TOnData;
   public
     OnData : TOnData read FOnData write FOnData;
  ...
procedure unit2.xyz()
    if assigned(FOnData) then FOnData(self,12345);


In der behandelnden Klasse muss eine entsprechende Prozedur definiert werden.

Code: Alles auswählen

(unit1)
  private
    procedure DoOnData(Sender:TObject; const aValue:TMyData);
...
  procedure FormCreate
     <unit2>.OnData:=@DoOnData;


3. Per Send|PostMessage oder Perform, die an Fenster verschickt werden kann. Ein Beispiel dafür:
eine global bekannte Funktion, die dadurch überall aufgerufen werden kann

Code: Alles auswählen

const WM_MYDATA=WM_USER+100;
 
procedure BroadCastMessage(Msg:Word);
var i:integer;
begin
  for i:=0 to Screen.FormCount-1 do
     Screen.Forms[i].Perform(Msg,0,0);
end;
 
(unit1)
private
  procedure OnData(var Msg: TMessage); message WM_MYDATA;
...
 
procedure uni1.OnData()
   showmessage(unit2.caption);
 
(unit2 oder sonstwo)
BroadCastMessage(WM_MYDATA);


4. Datenaustausch über das Filesystem, z.B. Memory Mapped File
Zuletzt geändert von monta am Mo 17. Aug 2009, 11:12, insgesamt 1-mal geändert.
Grund: So ein bisschen codeformatierung sieht einfach besser aus ;)

Latze
Beiträge: 60
Registriert: Sa 4. Jul 2009, 09:11
OS, Lazarus, FPC: Win7 / Linux (Lazarus 1.4.0)
CPU-Target: 32Bit/64Bit

Re: Befehle zwischen zwei Forms / Child zum Parent

Beitrag von Latze »

Danke, Tip 3 hat mich auf eine gute Lösung gebracht. Ich habe einfach eine eigene unit für die SQL-Verbindung erstellt. Dadurch muss ich auch nicht in jedem Form eine eigene Verbindung auf- und abbauen. Die Buttons steuere ich mit einem Timer, der TMySQL××Connection.connected überwacht.

Tip1 funktioniert leider nicht, da ich in form1 für das aufrufen von form2 ja schon unit2 haben muss. wenn ich in unit2 nun wiederum unit1 einbinde, meckert lazarus, was ja auch Sinn macht oder übersehe ich da was?
Wer glaubt, etwas zu sein, hat aufgehört, etwas zu werden.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Befehle zwischen zwei Forms / Child zum Parent

Beitrag von Scotty »

Binde die unit1 nicht unter interfaces sondern unter implementation ein. Dann ist das nicht rekursiv.

Latze
Beiträge: 60
Registriert: Sa 4. Jul 2009, 09:11
OS, Lazarus, FPC: Win7 / Linux (Lazarus 1.4.0)
CPU-Target: 32Bit/64Bit

Re: Befehle zwischen zwei Forms / Child zum Parent

Beitrag von Latze »

Danke Scotty,

kleine Ursache, große Wirkung. Ich hab jetzt mal ein kleines Testprogramm dafür Geschrieben und es klappt einwandfrei. :)
Wer glaubt, etwas zu sein, hat aufgehört, etwas zu werden.

Antworten