Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Von Form2 auf Form1 zugreifen


Goaznic - Fr 16.09.11 13:10
Titel: Von Form2 auf Form1 zugreifen
Hey, ich bin's mal wieder. :P

Ich habe in meinem Programm mehrere Formen. Von Form1 aus kann ich ganz normal auf die anderen Formen zugreifen, muss dafür ja lediglich Form2 usw den uses zufügen ...
Aber wie kann ich von Form2 auf Form1 zugreifen? Da geht das nicht. Ich hab i-wo gelesen, dass man das uses unter dem implementations-teil machen muss, aber auch damit habe ich keinen zugriff auf form1-komponenten.
Bsp.: Ich habe ein memForm2 und möchte per Klick auf btnForm2 den Inhalt von memForm2 in das memForm1 schreiben.


Nersgatt - Fr 16.09.11 13:16

Zeig doch mal ein paar Zeilen Quellcode. Und sag uns, was "kein Zugriff" heißt. Wie lautet die Fehlermeldung genau?


Goaznic - Fr 16.09.11 13:28

Naja, also bei Form1 (uCrossword) hab ich erstmal die beiden anderen Formen (uSearches und uGridSize) unter "uses" hinzugefügt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit uCrossword;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, AppEvnts, Menus, ComCtrls, Math, uSearches,
  uGridSize;


und dann hab ich in Form1 ein Menü. wenn man in dem Menü z.B. auf "Suchbegriffe erstellen" klickt, dann soll sich ein neues Fenster öffnen, also die Form "uSearches". Das hab ich wie folgt gemacht:


Delphi-Quelltext
1:
2:
3:
4:
procedure TFormMain.Begrifflisteerstellen1Click(Sender: TObject);
begin
  FormSearches.Visible := True;
end;


Und jetzt hab ich in dieser neuen Form halt das Memo mit Begriffen und ich möchte, dass die Begriffe, die dort drinn stehen, per Klick auf einen Button in das Memo auf der MainForm geschrieben werden.




Jetzt hab ich irgendwo wie gesagt gelesen, dass man bei der zweiten Form einfach unter implementation nochmal uses uCrossword; schreiben müsste.
Das hab ich gemacht.
aber dann müsste ich doch im Quelltext von Form2 einfach schreiben können TFormMain.memTerms.lines.add(memSearches.lines). das geht i-wie nicht ...


Nersgatt - Fr 16.09.11 13:34

Ich persönlich mache sowas immer gern etwas anders. Ich würde wollen, dass man das Suchformular überall im Programm aufrufen kann. Dazu ist es notwendig, dass es dem Suchformular egal sein muss, WER es geöffnet hat.
Bei Deiner Vorgehensweise, muss das Suchformular wissen, wohin das Ergebnis gehört (nämlich in die erste Form).

Daher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if FormSearches.ShowModal = mrOk then 
begin

  DeinMemo.Text := FormSearches.DeinMemo.Text;

end;

So muss das aufgerufene Formular gar nicht vom aufrufenden Formular wissen.

Im Ok-Button vom Suchformular fehlt dann nur ncoh ein:

Delphi-Quelltext
1:
ModalResult := mrOk                    


Und fertig. So vermeidest Du diese Zirkelbezüge.


Goaznic - Fr 16.09.11 13:47

Das versteh ich nicht ganz. Wo trag ich denn den ersten teil ein? Also das mit if FormSearches ...


Nersgatt - Fr 16.09.11 13:48

in TFormMain.Begrifflisteerstellen1Click


Goaznic - Fr 16.09.11 13:52

Fehlermeldung: Aus einem sichtbaren Fenster kann kein modales gemacht werden.


Nersgatt - Fr 16.09.11 13:54

Hast Du die Zeile FormSearches.Visible := True; entfernt? Das solltest Du tun.
Denn ShowModal zeigt das Formular auch an. Daher kann man auf das .visible := true verzichten.


Goaznic - Fr 16.09.11 13:59

Stimmt, die stand da noch...
Ich hab allerdings grad per Zufall die Lösung für meine Variante gefunden. :D
Naja, funktioniert beides. Also vielen Dank! :)


Nersgatt - Fr 16.09.11 14:00

user profile iconGoaznic hat folgendes geschrieben Zum zitierten Posting springen:
Naja, funktioniert beides. Also vielen Dank! :)

Meine Variante ist aber aus oben genannten Gründen die schönere. :P