Auslesen von TEdit-Feldern mit For-Schleife

Folgendes Problem: Ich habe 30 Eingabefelder vom Typ TEdit. Ich möchte den Inhalt auslesen und einer Variablen zuordnen - hintereinander und durch | getrennt.

string = feld1.text + ‚|‘ + feld2.text +…

Das funktioniert zwar, aber es ist ziemlich umständlich. Gibt es irgendwie die Möglichkeit das durch eine For-Schleife und einer durchlaufenden Variablen i zu ersetzen?

Danke für Eure Hilfe.

Hallo,

ja, es geht.

mit FindComponent kannst du dir die Komponente unter Angabe eines Namens zurückgeben lassen. Der Name wäre bei dir dann „feld“+intToStr(i), wobei i die Laufvariable ist.

Denk dran, dass du ein Type-casting machen mußt (also den Rückgabewert von FindComponent am einfachsten mit TEdit() in einen TEdit-Typ umwandeln), um auf die Eigenschaft Text zugreifen zu können.

Jochen

Hallo,

alternativ zu Jochens Lösung könntest du ein Array of TEdit verwenden. Dem musst du deine TEdits zuweisen und kannst dann über den Index darauf zugreifen. Solltest du nur einmal den Zugriff in einer for-next-schleife brauchen, ist Jochens Lösung sicher besser weil die Initialisierung entfällt. Bei häufigerem Benutzen des Index, dürfte das Array vorteilhaft sein.

implementation
var
 MyTEdits = Array [1..30] of TEdit; 

procedure TForm1.Create;
var
 i: Integer;

begin
 //hier Initialisierung des Arrays
 for i := low(MyEdits) to high(MyEdits) do
 MyEdits[i] := TEdit(Form1.FindComponent('Feld' + IntToStr(i)));
end;

procedure XY;
var
 MyString: String;
 i : Integer;

begin
 MyString := '';
//Auslesen des Arrays
 for i := low(MyEdits) to high(MyEdits) do
 MyString := MyString + MyEdits[i].text;
end;

In der For-Schleife verwendest do low(Array) und high(Array). Das gibt den niedrigsten und höchsten Index des Arrays zurück. Auf diese Weise kannst du die Anzahl der Editfelder ändern und brauchst dann nur die Arraygröße anzupassen ohne im Code noch alle Zählschleifen ändern zu müssen.

Gruß, Niels

Hi ChairWalk,

hier noch eine Lösung, die denke ich etwas universeller einsetzbar ist und deiner Frage nach einer Lösung mit einer for-Schleife eher gerecht wird.

Ich gehe jetzt einfach davon aus, dass deine Form „Form1“ heist.

function TForm1.LeseFelder: String;
 var I : Integer;
begin
 Result := '';
 for I := 0 to Pred(ComponentCount) do
 if (Components[I] is TEdit) then
 if Length(Result) = 0 then
 Result := TEdit(Components[I]).Text
 else
 Result := Result + '|' + TEdit(Components[I]).Text;
end;

Gruß Michi

Hallo,

function TForm1.LeseFelder: String;
var I : Integer;
begin
Result := ‚‘;
for I := 0 to Pred(ComponentCount) do
if (Components[I] is TEdit) then
if Length(Result) = 0 then
Result := TEdit(Components[I]).Text
else
Result := Result + ‚|‘ + TEdit(Components[I]).Text;
end;

du solltest aber vielleicht erwähnen, dass auf diese Weise ALLE TEdits, die sich auf der Form befinden, in das Result eingefügt werden und dass die Reihenfolge des Einfügens durch die Eigenschaft TabOrder der TEdits bestimmt wird. Soll also nur ein zusammengehöriger Satz an TEdits berücksichtigt und andere ausgelassen werden, funktioniert das nicht mehr. Ob das jetzt universeller ist als die beiden anderen Ansätze?
Zumal zB der Ansatz über das Array auch den direkten Aufruf des TEdit über seinen Index ermöglicht, während die TabOrder sich ja über alle Komponenten auf der Form erstreckt.

Dein Code lässt sich aber sehr gut für die Initialisierung des Arrays verwenden. Man kann ein dynamisches Array nehmen und mit deinem Code die Komponenten durchgehen. Sollte man auf ein TEdit mit dem Namen ‚Feldx‘ stoßen, so kann man das x extrahieren und das TEdit dem entsprechenden Array-Member zuweisen. Bei bedarf wird vorher das Array redimensioniert. Auf diese Weise könnte man einfach zur Entwurfszeit oder auch zur Laufzeit neue TEdits in die Form einfügen und sie würden automatisch in das Array übernommen sobald eine Neuinitialisierung durchgeführt wird.

Gruß, Niels

Gruß, Niels

Danke für die Vielen Antworten
Vielen Dank für die vielen Antworten.

Nach dem Hinweis von „Jo…“ hab ich’s hinbekommen. Mir fehlte nur der entscheidende Tipp es mit „FindComponent“ zu versuchen.

LG!