Mehrere TEdits besser verwalten

Hallo,
ich stehe schon seit einiger Zeit vor einem Problem. 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. Man sollte dem irgendwie aus dem Weg gehen können.
Ich habe bisher nur folgenden Ansatz gefunden:

var
editx:array[1…10] of TEdit;

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. :frowning:
Wer weiß Rat?

_Dirk

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

Hi Martin,
vielen Dank für Deine Ausführungen!!! Wie Du Dir denken kannst, haben sie meine Probleme vollkommen gelöst. (Na ja, wenigstens was das anbelangt. :wink: )

Eine Frage bleibt nur noch offen:

… 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.

Das hatte ich auch schon mal versucht. In der private-Rubrik klappt es. Ich weiß, es gibt auch noch „public“, „published“ und „protected“; aber warum ist die Deklaration davor (dort wo sonst edit1, edit2 etc. deklariert werden) nicht zulässig?

Grüße,Dirk

type
TForm1 = class(TForm)

private
{ Private-Deklarationen }
editx:array[1…10] of TEdit;
public
{ Public-Deklarationen }
end;

Hallo Dirk,

Das hatte ich auch schon mal versucht. In der private-Rubrik
klappt es. Ich weiß, es gibt auch noch „public“, „published“
und „protected“; aber warum ist die Deklaration davor (dort wo
sonst edit1, edit2 etc. deklariert werden) nicht zulässig?

sie ist nicht zulässig, weil dieser Bereich ausschließlich den Elementen, die Delphi automatisch hinzufügt und löscht, vorbehalten ist. Mit diesen Elementen sind dabei alle die gemeint, die Du mit der Maus zur Entwurfszeit in ein Formular einfügst oder wieder daraus entfernst (Buttons, Scrollbars, Timer, Menüs, Edits…)

Du kannst das sozusagen „live“ verfolgen, wenn Du das Codefenster so anordnest, daß Du es zusammen mit dem Formular sehen kannst. Setzt Du nun mit der Maus z. B. eine neue Checkbox auf das Formular, so erweitert sich augenblicklich die Deklarationsliste im Formular (Bereich unter „CLASS“) um den Eintrag z. B. „Checkbox7“. Löschst Du die Checkbox wieder, so verschwindet auch sofort der Eintrag. Damit die VCL das verwaltungsmäßig ordentlich auf die Reihe kriegt, darfst Du keine eigenen Deklarationen in dem erwähnten Bereich unterbringen (aber dazu besteht ja auch gar keine Notwendigkeit, oder?)

Mit freundlichem Gruß
Martin