Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - FindComponent bei zur Laufzeit erstellen Edit-Feldern


TM4rkuS - Mi 03.02.10 23:00
Titel: FindComponent bei zur Laufzeit erstellen Edit-Feldern
Ich verwende Lazarus, aber da es keine gescheiten Lazarus-Foren gibt, und Lazarus und Delphi ja sehr ähnlich sind, frage ich einfach mal hier nach...
Ich erstelle zur Laufzeit ein Edit-Feld:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
my_edit := TEdit.create(Form1);               
with my_edit do begin
        Top := 20;               
         Left  := 20;                         
         Width := 20;                       
         Name  := 'Edit'+IntToStr(i+5); //habe schon 5 Edits
end;


so... und in einer anderen Prozedur versuche ich diese Edit-Felder aufzurufen:


Delphi-Quelltext
1:
(FindComponent('Edit'+IntToStr(i+5as TEdit).Text := 'Hallo';                    



so, während der Laufzeit erstelle ich jetzt ein Edit(1+5), und da i im ersten Durchlauf 1 ist, habe ich also ein Edit6. (es erscheint übrigens auch auf dem Formblatt). Dieses will ich dann über die findcomponent-methode aufrufen. Sinnvollerweise heißt das dann sozusagen (FindComponent('Edit6' as TEdit).Text := 'Hallo';
Aber er bricht mir mit einer exception class "External: SIGSEGV" ab und spring im Quelltext der control.inc zur Zeile

Delphi-Quelltext
1:
if TMethod(@Self.GetTextBuf).Code = Pointer(@TControl.GetTextBuf)                    


und markiert diese grau... Was tun?


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Mi 03.02.2010 um 22:27


FinnO - Mi 03.02.10 23:20

Edit als Variable Deklarieren und über den Variablennamen drauf zugreifen?


Georg08 - Mi 03.02.10 23:28

mit einem Array

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//!nicht getestet!
var
  i: integer;
  editfelder: Array [1..10of TEdit;
begin
  for i:= 1 to 10
  editfelder[i]:= TEdit.Create;
  editfelder[i].parent:= self;
  editfelder[i].Top:= 20+i+editfelder[i].height;
  editfelder[i].Left:= 20;
end
editfelder[3].Text:= 'Dies ist das Editfeld3';
end;