Hi Dirk,
Wie kann man eigentlich mehrere TEdits innerhalb eines Formulars in
einer Struktur (z. B. einem Array) ansprechen?
Die automatisch deklarierten Edit1, Edit2, … Editn müßte man
bei der Verarbeitung jeweils einzeln ansprechen - was ziemlich
dumm ist.
Stimmt.
Ich habe bisher nur folgenden Ansatz gefunden:
var
editx:array[1…10] of TEdit;
Das ist schon mal der Anfang. Du solltest diese Deklaration aber nicht „irgendwohin“ in die Unit schreiben. Denk daran, daß Du ja vielleicht mal mehrere Instanzen des Formulars starten willst – dann sind Probleme vorprogrammiert (im wahrsten Sinne des Wortes). Es gibt nur einen einzigen richtigen Platz für diese Deklaration, und das ist die Deklaration des Formulars, dem diese Edit-Controls gehören = das Formular, das der „Owner“ der Edit-Controls ist.
editx[1]:=tedit.create(form1);
editx[1].width:=100;
editx[1].height:=20;
editx[1].invalidate;
invalidate;
Aber (natürlich?) ist nichts nach dem Programmstart zu sehen.
Alles, was noch fehlt, ist, den Edit-Controls ein Parent-Control zuzuweisen. Wenn Du das nicht tust, siehst Du nix. Das Parent-Control kann das Owner-Formular sein; es kann aber auch ein Panel oder eine Groupbox auf dem Formular sein. Diese Controls sind alle „Parent-fähig“, denn sie sind sogenannte „Container“ für andere Controls. Ein Button etwa kann dagegen nicht als Parent genommen werden, da ihm die Containereigenschaft fehlt.
Also:
editx[1]:=tedit.create(form1);
// die folgende Zeile ist wichtig!
editx[1].parent:=form1; // oder „:= form1.panel4 ?“
editx[1].width:=100;
editx[1].height:=20;
// und vielleicht noch an „.left“ und „.top“ denken!
editx[1].invalidate; // überflüssig
invalidate; // überflüssig
Wenn Du die Edits zur Laufzeit erzeugst, siehst Du sie im Entwurfszustand des Formulars natürlich nicht.
Du mußt die Edits übrigens nicht notwendigerweise zur Laufzeit erzeugen, damit Du sie als Array ansprechen kannst. Du kannst auch einfach jedes EditX-Array-Element einzeln auf das entsprechende vorhandene Edit-Control setzen. Das sollte natürlich möglichst früh geschehen; andererseits müssen die Edits bereits instantiiert worden sein. Der richtige Zeitpunkt ist der, zu dem das OnCreate-Event des Formulars aufgerufen wird.
Erzeuge Dir also die OnCreate-Ereignisbearbeitungsprozedur per Doppelklick im Objektinspktor (auf „OnCreate“) und schreibe hinein:
PROCEDURE TForm6.Create(…);
begin
EditX[1] := Edit1;
EditX[2] := Edit2;
EditX[3] := Edit3;
EditX[4] := Edit4;
EditX[5] := Edit5;
EditX[6] := Edit6;
…
end;
Das „Edit4“ z. B. kannst Du nun sowohl durch „Edit4“ als auch durch „EditX[4]“ im Programmcode ansprechen. Beides ist völlig gleichwertig, weil beides auf dieselbe Speicheradresse im RAM zeigt (beachte, daß Objekte nur Zeiger auf einen dynamisch verwalteten Speicherbereich darstellen, der die eigentlichen Objektdaten enthält).
MfG
Martin