Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Editfeld aus Schleifenvariable?


Henneberg - So 11.03.12 20:17
Titel: Editfeld aus Schleifenvariable?
Ausgangssituation ich habe 4 Edits in denen jeweils 4 zahlen stehen. Nun sollen siese Zahlen an ihren stellen in ein 16 Felder langes Array kommen
dafür ich will zwei for-Schleifen ineinandergeschachtelt durchlaufen lassen. Die erste von i=1 zu 4 und die andere ii=1 zu 4. Jetzt will ich in der zweiten prozedur nun erst ein Edit abklappern. dann das nächste usw. Ich hatte mir das so gedacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for I := 1 to 4 do
  begin
   for ii := 1 to 16 do
     begin
        Edit(I).Text
     end;
  end;


Also es soll immer das Edit genommen werden mit dem Wert der ersten Zählvariable. So wie es oben steht funktioniert es nicht. Hat jemand eine Idee?

PS: Das ist mein erster Post hier also bitte seid gnädig mit mir^^

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 11.03.2012 um 19:36


haentschman - So 11.03.12 20:24

Hallo...

Stichworte:
- FindComponent
- Edits in einer ObjectList ablegen und über den Index abarbeiten

:wave:


Henneberg - So 11.03.12 20:39

:S bin leider noch ein neuling. Könnten sie das bitte etwas genauer erklären?


jaenicke - So 11.03.12 20:45

Erstens: Wir duzen uns hier im Forum ;-)

Zweitens: FindComponent eingeben, F1 drücken ;-)
In der Dokumentation gibt es sogar ein Beispiel, das ziemlich exakt das macht was du vorhast...
http://docwiki.embarcadero.com/CodeSamples/en/FindComponent_(Delphi)
Wobei du dir das with dort nicht abschauen solltest, das macht alles nur unübersichtlich. Aber du siehst dort wie FindComponent benutzt wird.


Henneberg - So 11.03.12 21:02

ok :)

also ich bin derzeit soweiz und habe nur noch das als Kommentar abgegebene Problem:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var Feld:Array[1..16of Integer;
  I,ii: Integer;
  edittext:string;
  const  NamePrefix = 'MyEdit';
begin
for I := 1 to 4 do
  begin
   for ii := 1 to 4 do
     begin
       TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
       edittext:=TEdit(FindComponent(NamePrefix + IntToStr(i))); // Hier sagt er jetzt "inkompatible Typen string und TEdit
       Feld[i*ii]:=strtoint(edittext[5]);
     end;
  end;

  for ii := 1 to 16 do
  Listbox1.Items.Add(IntToStr(Feld[iii]));


end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - So 11.03.12 21:36

Die Meldung sagt doch schon was das Problem ist. Die Variable edittext ist ein String. Deshalb kannst du da nicht ein ganzes Editfeld hineinlegen.

Das ist als ob du eine Tiefkühltruhe hast und eine Lieferung per LKW bekommst. Du versuchst nun den ganzen LKW in die Kühltruhe zu legen. Stattdessen musst du den Inhalt herausnehmen und in die Kühltruhe legen.

Analog musst du den Text aus dem Editfeld herausnehmen und diesen in die Variable legen.

Delphi-Quelltext
1:
2:
3:
4:
// also nicht (MyEdit ist einfach mal als Beispiel ein Editfeld):
edittext := MyEdit;
// sondern:
edittext := MyEdit.Text;

Davon abgesehen scheint dir nicht wirklich klar zu sein was du da tust. In der Zeile mit TEdit.Create wird ein neues Editfeld erzeugt. Das willst du ja wohl kaum, oder? Heißt: Diese Zeile brauchst du nicht.


Henneberg - So 11.03.12 21:51

Tut mir leid ich habe eben nur mein bisheriges Schul Delphi und diese Aufgabe war eine zusatzaufgabe. Deswegen arbeite ich derzeit nach dem Motto: Einfugen testen verstehen. ;)
Tut mit Leid ich vestehe deine Antwort immer noch nicht. Blicke da noch nicht so durch :S


jaenicke - So 11.03.12 22:42

Leg doch einfach mal in einem neuen Projekt nur ein Editfeld und einen Button auf das Formular und probiere nur FindComponent aus. In den Buttonklick kannst du schreiben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var
  FoundEditField: TEdit;
begin
  FoundEditField := FindComponent('Edit1'as TEdit;
  FoundEditField.Text := 'Ein Text';
end;
Damit suchst du das Editfeld mit dem Namen Edit1, legst das in FoundEditField und setzt dann den Text darin.


Henneberg - Di 13.03.12 21:10

Aber wie mach ich das nun das er das editfeld nimmt mit dem index der schleifenvariablen?


bummi - Di 13.03.12 23:22


Delphi-Quelltext
1:
FoundEditField := FindComponent('Edit' + IntToStr(i)) as TEdit;                    


Xion - Mi 14.03.12 01:57

Ich möchte mal anmerken, dass ich mit FindComponent immer ziemlich unzufrieden war, da das ziemlich langsam ist.

Da man ja ohnehin keine x Edits platzieren will, mache ich das meist durch Erstellung zur Laufzeit (wie oben schon angedeuted):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var Edits: array of TEdit;
[...]
procedure TForm1.CreateEdits;
var E: integer;
begin
  SetLength(Edits, 1000); //ganz viele Edits
  for E:= 0 to High(Edits) do
    begin
      Edits[E]:=TEdit.Create(Form1);
      Edits[E].Parent:=Form1;
      Edits[E].Text:=inttostr(E);
      Eidts[E].Top:=42*E;
    end;
end;


Genau wie die Schleife zeigt kannst du natürlich auch weitere Schleifen nutzen.