FindComponent bei zur Laufzeit erstellen Edit-Feldern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TM4rkuS
Beiträge: 6
Registriert: Mi 3. Feb 2010, 21:34
OS, Lazarus, FPC: Windows 7 (L 0.9.28Beta FPC 2.2.4)
CPU-Target: 64Bit

FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von TM4rkuS »

Ich erstelle zur Laufzeit ein Edit-Feld:

Code: Alles auswählen

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:

Code: Alles auswählen

(FindComponent('Edit'+IntToStr(i+5) as 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

Code: Alles auswählen

if TMethod(@Self.GetTextBuf).Code = Pointer(@TControl.GetTextBuf)


und markiert diese grau... Was tun?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von theo »

TM4rkuS hat geschrieben:

Code: Alles auswählen

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



Das wird wohl kaum kompilieren. Da fehlt eine Klammer-zu vor dem "as".
Ausserdem ist es ziemlich waghalsig.
Ich würde die Rückgabe erst mal mit Assigned oder mit "is TEdit" checken und erst dann zum TEdit casten und was damit machen.

TM4rkuS
Beiträge: 6
Registriert: Mi 3. Feb 2010, 21:34
OS, Lazarus, FPC: Windows 7 (L 0.9.28Beta FPC 2.2.4)
CPU-Target: 64Bit

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von TM4rkuS »

wie genau funktioniert die is TEdit funktion?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von theo »

So kann man das z.B. machen, damit es keine seltsamen Fehler gibt:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender:TObject);
var aComponent:TComponent;
i:integer;
CompName:String;
begin
  i:=5;
  CompName:='Edit'+IntToStr(i);
  aComponent:= FindComponent(CompName);
  if aComponent is TEdit then TEdit(aComponent).Text := 'Hallo' else
    raise Exception.Create('Komponente '+CompName+' wurde auf '+  Self.Name+' nicht gefunden');
end;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von pluto »

Bei FindComponent muss du immer drauf achten, welche Komponente wo drin ist. In deinen Fall hast du nur From1, aber es währe auch Möglich, dass du Komponenten in einem Panel1 erstellst, dann muss du Panel1.FindComponent(...) aufrufen und nicht From1.FindComponent.

Das dient nur als Hinweis, jedenfalls, habe ich das so beobachtet.
MFG
Michael Springwald

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von mschnell »

Alternativ kannst Du auch die "Components" Tabelle des "Owners" (den Du beim Erstellen Deiner Komponenten angegeben hast) durchlaufen und die passende Komponente finden.

-Michael
Zuletzt geändert von mschnell am Sa 6. Feb 2010, 23:52, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: FindComponent bei zur Laufzeit erstellen Edit-Feldern

Beitrag von pluto »

Das habe ich gemeint...
MFG
Michael Springwald

Antworten