Modaler Dialog: Wie kann eine Member-Variable kurz vor Ausführung belegt werden?
-
Hallo,
ich habe eine Form-Klasse erstellt, die für modalen Dialog genutzt werden soll.//h class TModalForm : public TForm { __published: TDBGrid* dbGrid; private: UnicodeString FSQLBefehl; void __fastcall SetSQLBefehl(UnicodeString Value); public: __fastcall TModalForm(TComponent* Owner); __property UnicodeString SQLBefehl = {read=FSQLBefehl, write=SetSQLBefehl}; };
wie z.B:
//cpp void __fastcall TForm1:Button1Click(TObject *Sender){ TModalForm* FormA; FormA = new TModalForm(Application); FormA->ShowModal(); delete FormA; }
Nach diesem Schema soll es auch noch eine FormB und FormC geben. Im modalen Dialog wird jeweils ein DBGrid mit einer SQL-Abfrage befüllt. Die Datenmenge bezieht das DBGrid aus einer angeschlossenen Datenbank. Der Aufbau der Form erfolgt im wesentlichen im Konstruktor von TModalForm.
Für die Dialoge von FormB und FormC möchte ich Instanzen dieser Klasse einsetzen. Der einzige Unterschied
zwischen denen wäre der unterschiedliche SQL-Befehl zum Befüllen des DBGrids. Ich möchte den entsprechenden Befehls-String
an die Form vor der Ausführung/Aufbau übergeben, kriege das aber leider nicht hin.Ich hatte mir gedacht, dass ich das durch eine __property lösen könnte, etwa wie im Quelltext oben.
Aber leider wird das nichts.
Ich muß ja zuerst die Instanz erzeugen und kann dann nurFormA->SetSQLBefehl("select blabla...")
hinterher meine String abgeben. Dann ist der Zug aber schon abgefahren, weil ja zuerst der Konstruktor aufgerufen wird.
Hoffentlich kann mir jemand weiterhelfen?
-
du kannst einfach den Konstruktor überschreiben/erweitern, z.B.
//im Header ... __fastcall TModalForm(TComponent* Owner, String SQLCommand); ...
in der CPP kannst du dann im Konstruktor auf den String zugreifen
-
Recht vielen Dank @Linnea, Du hast mir schon oft mit Deinen Tipps weitergeholfen, ich glaube auch diesmal wird es klappen.
Werde mich gleich an die Arbeit machen, das umzusetzen.Schade nur, daß ich jetzt meine sorgfältig erstellten __properties alle wieder eindampfen kann.
Naja, dann hab' ich das auch schon 'mal geübt.
-
Du benutzt ja schon eine eigene Funktion zum Setzen des SQL Kommandos, kannst du nicht in dieser Methode das DBGrid füllen? Damit würde das Formular bei jedem Setzen des SQLKommandos automatisch seine Daten aktualisieren.
-
Hallo @DocShoe,
mit den __properties bin ich nicht weiter gekommen.Ich habe deshalb den Konstruktor, wie es @Linnea vorgeschlagen hat, erweitert und nun klappt alles wunderbar.
Eine Lösung mit __properties hätte mir auch sehr gut gefallen. Das Problem dabei ist nur, dass die Daten der __property bereits im Konstruktor der Form zum Aufbau benötigt werden.
Wenn ich ein Objekt neu erzeuge fehlen mir genau diese Daten zum Aufbau der Form bzw. Befüllung des DBGrids und ich erhalte Fehlermeldungen, dass z.B der Befehlstring für den SQL "" ist (oder ähnlich, exakter Wortlaut habe ich nicht parat).
Ich müßte quasi das Ganze so aufbauen könnenTModalForm* FormA; FormA->SetSQLBefehl("SELECT blalbla"); FormA = new TModalForm(Application); FormA->ShowModal(); delete FormA;
und das geht nicht!
Oder siehst Du hier noch eine weitere Möglichkeit das Problem zu lösen?
(Mehr wissen ist immer gut :D)
-
Hallo
Wenn du im Konstruktor keinen vernünftigen Standardwert für deinen SQL-Befehl hast, dann kannst du eben im Konstruktor nicht schon alles zusammensatzen. Las die Abfrage im Konstruktor deaktiv, und aktivier sie erst wenn ein gültiger Wert über deine property SQLBefehl zugewiesen wird. Dazu kannst du der property ja eine Set-Methode zuweisen.
bis bald
akari
-
Besten Dank @akari,
jetzt hat's gefunkt. Meine __properties funktionieren nun wie gewünscht, supi.Habe alles, was vorher im Konstruktor geparkt war, in eine eigene Funktion ausgelagert und folgende Sequenz laufen lassen:
TModalForm* FormA; FormA = new TModalForm(Application); FormA->SetSQLBefehl("SELECT blalbla"); FormA->WarVorherimKonstruktor(); FormA->ShowModal(); delete FormA;