Zugriff auf Inhalte in Form2
-
Hallo,
ich habe habe ein Form1 und ein Form2. Beim Start der Anwendung wird Form1 als MainForm gestartet. Auf dem Form2 habe ich verschiedene Werte bereits zur Designzeit als Defaultoptionen drinne stehen. Klickt der Nutzer auf Form1 einen Button soll z.B. ein Text von einem Memo auf Form2 verwendet werden.
Nun das Problem:
Wurde die Anwendung gestartet und der Nutzer hat sich noch nicht Form2 anzeigen (Form2->Show()) lassen, liefert es mir nicht den Inhalt des Memos zurück, den ich zur Designzeit voreingestellt habe. Erst nach dem Form2 das erste Mal angezeigt wurde, bekomme ich Zugriff auf den Inhalt!Wie kann ich also schon beim Start von Form1 sicherstellen, dass mir Form2->Memo schon Inhalte liefert?
Vielen Dank
Saxony
-
Hallo
Die Reihenfolge dürfte bei dir sein (Pseudocode)
Form1->Create
Form2->Create
Form1->Show
Form2->Show
Wenn du also Komponenten von Form2 im Konstruktor mit Daten füllst, sind diese Daten in Form1->Show auch vorhanden.bis bald
akari
-
Aha - also füll ich die Defaultwerte lieber im Konstruktor und nicht über den Objektinspektor!
Nagut versuch ich mal.
[edit]
Ja so gehts auf einmal!
Schade, dass das net glei über den OI geht, weil so habsch nu alles in TForm::Create() drinne.
[/edit]bis bald
Saxony
-
Hallo
Also der OI sorgt dafür das die Werte schon zur Designtime feststehen, also auch im Konstruktor. Ich glaube wir haben hier ein Mißverständnis, und der Fehler liegt wo anders?
bis bald
akari
-
So naja - also folgendes:
Ich habe auf meinem Form2 ein TMemo dort drinne steht ein SQL SELECT.
Starte ich nun meine Anwendung und möchte sofort eine DB Abfrage machen, kommt der Fehler:Fehler schrieb:
Query1: No SQL statement available
Zuweisen tue ich den Inhalt des TMemos im OnClick Ereignis des Buttons, welcher die DB Abfrage durchführt so:
Query2->SQL = Form2->Memo1->Lines;
Lasse ich mir aber Form2 vor der ersten DB Abfrage schon mal anzeigen und schließe es wieder ohne Änderung und mache dann die gleiche Abfrage, funktioniert es auf einmal!
Fülle ich das Memo per Hand im FormCreate von Form2 mit Memo->Append(), dann funktioniert es auch gleich beim ersten Mal ohne vorherige Anzeige von Form2!
[edit]
Interessanterweise zeigt mir ein ShowMessage(Form2->Memo1->Text); schon den richtigen Memoinhalt an, ohne dass ich vorher Form2 geöffnet habe!
Vielleicht sind ja die TStrings von Memo->Lines noch nicht fertig initialisiert ohne vorheriges Show von Form2!?!
[/edit]bye Saxony
-
Möglicherweise löschst Du den Text an irgendeiner Stelle (Konstruktor, OnCreate)? Wenn der Text zur Designzeit eingetragen wird, kann er verwendet werden, ohne dass Form2 sichtbar gemacht werden muss.
Wie akari schon angemerkt hat, der Fehler muss an anderer Stelle liegen.
-
Saxony schrieb:
[edit]
Interessanterweise zeigt mir ein ShowMessage(Form2->Memo1->Text); schon den richtigen Memoinhalt an, ohne dass ich vorher Form2 geöffnet habe!
Vielleicht sind ja die TStrings von Memo->Lines noch nicht fertig initialisiert ohne vorheriges Show von Form2!?!
[/edit]Also so gesehen funktioniert unmittelbar nach Start der Anwendung ein Zugriff mit Memo->Text um den Inhalt zu bekommen, aber eine Zuweisung der Memo->Lines erst nachdem ich mind. einmal Form2->Show() gemacht habe.
Damit kann man ausschließen, dass ich den Inhalt irgendwo(Form::OnCreate, Form::OnShow) schon lösche! Zusätzlich habe ich alle diese Methoden von Form1 abgesucht, ob da etwas mit Form2->Memo gemacht wird - aber da mache ich gar nix mit dem Memo!
Tja schau mer mal dann seh mer schon!
[edit]
So ein ShowMessage(Form2->Memo1->Lines->Strings[0]); zeigt mir auch schon die erste richtige Zeile des Memos an, also gibt es Memo->Lines auch ohne Form2->Show() schon! Hehe - nun wirds knifflig!
[/edit]bye Saxony
-
So und um die Sache noch mehr zu verwirren, habe ich mal folgendes getestet:
ShowMessage(Form2->Memo1->Text); Query2->SQL = Form2->Memo1->Lines; ShowMessage(Query2->SQL->Text);
Die erste Meldung enthält den vollständigen Inhalt von Form2->Memo, Meldung 2 enthält nix! Erst wenn ich vorher mir Form2 anzeigen lasse, enthält auf einmal auch Meldung 2 den gleichen Inhalt wie Meldung 1!
bye Saxony
-
So ich nochmal
Also nun hab ich mal angefangen rum zu spielen:
ShowMessage(Form2->Memo1->Text); ShowMessage(Form2->Memo1->Lines->Strings[0]); ShowMessage(Form2->Memo1->Lines->Count); Query2->SQL = Form2->Memo1->Lines; ShowMessage(Query2->SQL->Text);
Lasse ich die Zeile mit ShowMessage(Form2->Memo1->Lines->Strings[0]); weg zeigt mir ein Lines->Count den Wert 0? Und in Query2->SQL steht nix drinne!
Lasse ich die Zeile drinne, zeigt mir Lines->Count den richtigen Wert und auf einmal hat auch Query2->SQL den Inhalt von Form2->Memo->Lines!!Langsam dreh ich am Rad hier! Hehe
[edit]
Lösung
So da ja anscheinend der Memo->Lines->Text immer da ist, mach ich es nun so:Query2->SQL->Text = Form2->Memo1->Lines->Text;
Das funktioniert nun auch beim ersten Mal!! Nur mit Lines ohne voriges anzeigen von Form2 gehts net! Klingt komisch is aba so!
[/edit]bye Saxony
-
Query2->SQL = Form2->Memo1->Lines;
Hier weist du ja auch Zeiger zu. Wenn SQL eine Property ist, würdest du den Zeiger deines TStrings-Members von TMemo nur einem temporären Zeiger zuweisen, so dass nichts pasasiert.
Schau bitte, bevor du sowas machst in die Hilfe zu diesen Objekten um was für Typen es sich handelt. Man kann nicht einfach etwas zuweisen und hoffen das das dann stimmt.
Text ist vom Typ AnsiString und kann somit auch zugewiesen werden. Es ist außerdem eine Property, was bedeutet bei einer Zuweisung kann im Hintergrund eine Setter-Methode aufgerufen werden. Es wäre gut, wenn du dich zu diesem Thema mal informieren würdest.