Zugriff auf TEdit´s mit Index (wie Tabelle)

habe eine ‚Tabelle‘ / ‚Matrix‘ von TEdit´s und ComboBox´s, die in meinem Formular wie eine Tabelle in Zeilen und Spalten angeordnet sind. (dieses brauche ich so, weil die Eingaben der verschiedenen Elemente unterschiedlich gehandhabt werden sollen).

TEdit_1_a TEdit_2_a TEdit_3_a
TEdit_1_b TEdit_2_b TEdit_3_b
TEdit_1_c TEdit_2_c TEdit_3_c
TEdit_1_d TEdit_2_d TEdit_3_d
TEdit_1_e TEdit_2_e TEdit_3_e

Nun sollen innerhalb einer/jeder Spalte bestimmte Operationen ausgeführt werden.
Wie kann ich den Quellcode schreiben, ohne dass ich für jede `Spalte``sie Operationen wiederholt schreiben muss?
(Das übertragen in eine Matrix oder Array of Record in Hintergrund ist mir bekannt geht hier aber nicht)

Vielen Dank

E. B.

Hallo,

es gibt zwei Möglichkeiten:

  1. du erzeugst die TEdits dynamisch mit TEdit.create:

    var
    EditFelder: Array[n…m, x…y] of TEdit;

    for i=n to m do
    for j = x to y do begin
    EditFelder[i, j] = TEdit.create;
    EditFelder[i,j].Top = …
    //komplette Initialisierung des Feldes
    end;

Hat den Nachteil, dass du zur Entwicklungszeit keine Properties setzen kannst.

  1. Du erzeugst zur Entwicklungszeit die Felder wie normal und lässt dann ein Pointer-Array darauf zeigen.

    var
    pEditFelder: Array[n…m, x…y] of ^TEdit;

    pEditFelder[n, x] := @Edit_nx;
    pEditFelder[n+1, x+1] := @Edit_n1x1;
    :
    :
    pEditFelder[m, y] := @Edit_my;

Auf die Felder kannst du dann zugreifen mit

MyString := pEditFelder[o, p]^.Text;

Gruss, Niels

Vielen Dank, die 2. Methode ist die für mich gebrauchbare.
Nun meine Frage: die Zuweisung der Pointerwerte
pEditFelder[n,x]:=@Edit_nx erfolgt doch nicht unter „var“ oder doch ?

Vielen Dank

E. B.

Nein, natürlich nicht. Das ist normaler Programmcode.

Gruss, Niels

Hallo,

  1. Du erzeugst zur Entwicklungszeit die Felder wie normal und
    lässt dann ein Pointer-Array darauf zeigen.

…und wenn Du stattdessen einfach ein Array von TEdits drauf zeigen läßt, was bedeutet, daß Du in diesem Code…

var
pEditFelder: Array[n…m, x…y] of ^TEdit;

pEditFelder[n, x] := @Edit_nx;
pEditFelder[n+1, x+1] := @Edit_n1x1;
:
:
pEditFelder[m, y] := @Edit_my;

…alle „^“ und „@“ wegläßt, dann hast Du weniger Schreibarbeit. Funktionieren tut es immer noch, weil hinter Klassen stets nur Pointer stecken. Der Clou hier besteht nämlich nicht in den „^“ und „@“, sondern darin, daß die Elemente von „pEditFelder“ nicht instantiiert werden. Ich würde so weit gehen, zu behaupten, daß das Wissen um diese Zusammenhänge grundlegend zum Verständnis der objektorientierten Programmierung ist. Oder anders und etwas überspitzt ausgedrückt: Die OOP stellt ein – extrem mächtiges und elegantes – Werkzeug dar, um niemals mehr „^“ und „@“ verwenden zu müssen.

Mit freundlichem Gruß
Martin

Hallo,

du hast natürlich recht. (Ich glaube, ich habs selber mal so gemacht. habs aber wieder vergessen).

Die OOP stellt ein – extrem mächtiges
und elegantes – Werkzeug dar, um niemals mehr „^“ und „@“
verwenden zu müssen.

Ganz wirst du wohl nicht darauf verzichten können (siehe Artikel weiter unten bzgl. Pointern). Wie willst du auch sonst eine Funktionsbibliothek dynamisch einbinden.

Gruss, Niels

Danke
Danke, Niels und Martin,

das war eine prima Idee

Viele Grüße aus dem frühlingshaften Brandenburg

E. B.