Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wie kann ich FindComponent bei Record-Typ anwenden?


Kay E. - Fr 19.11.10 22:34
Titel: Wie kann ich FindComponent bei Record-Typ anwenden?
Hallo!

Am besten zuerst einmal der Code (Ausschnitt):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
type
  TStatistik= record
    Feld:TLabel;
    AnzahlK:Integer;
    AnzahlT:Integer;
  end;

  TStatistikpanelKlein=class(TPanel)
  private
    L00:TStatistik;
    L01:TStatistik;
    L02:TStatistik;
    L10:TStatistik;
    L11:TStatistik;
    L12:TStatistik;
    L20:TStatistik;
    L21:TStatistik;
    L22:TStatistik;
    Erzeugt:boolean;
  end;

var
  StatistikpanelKlein:TstatistikpanelKlein;

procedure StatistikBauen(Owner:TComponent);


implementation

procedure StatistikBauen(Owner:Tcomponent; Wiesetyp:TWiesetyp);
var
i,j:integer;
begin
  StatistikPanelKlein:=TStatistikpanelKlein.Create(Owner);
  StatistikPanelKlein.Parent:=Form1;
  StatistikpanelKlein.Left:=25;
  StatistikpanelKlein.Top:=25;

  StatistikpanelKlein.L00.Feld:=TLabel.Create(StatistikpanelKlein);
  StatistikpanelKlein.L00.Feld.Parent:=StatistikpanelKlein;
  StatistikpanelKlein.L00.Feld.Caption:='Testerle';

  i:=0; j:=0;
  with StatistikpanelKlein do begin
    TStatistik(FindComponent('l'+inttostr(i)+inttostr(j)).Feld.caption:='Hat funktioniert';
    invalidate;
  end;
end;


Ich baue hier einen Record, in dem ein TLabel ist, welches ich nachher 9 mal (als Raster) in dem Panel als Container unterbringen will. Mit jedem Label sollen noch weitere Informationen gespeichert werden, deswegen das Record.
Damit ich dann nicht alle 9 Labels umständlich manuell ausrichten, benennen, Parent zuweisen, etc muss, würd ich das gern in ne Schleife verpacken und würde dafür die FindComponent-Funktion nutzen.
Bei dem Code oben wird mir allerdings der Fehler ausgegeben "TComponent" does not contain a member named "Feld" und undeclared identifier "caption".
Ich entdecke von der Logik her keinen Fehler in meinem Code, aber vlt. könnt ihr mir ja helfen.
Wie kann ich meine Labelkomponente in den Records elegant ansteuern?


Danke für eure Hilfe!


jaenicke - Fr 19.11.10 23:17

Ich markiere dir mal deine zusammengehörigen Klammern...

Delphi-Quelltext
1:
    TStatistik(FindComponent('l'+inttostr(i)+inttostr(j)).Feld.caption:='Hat funktioniert';                    
Da Delphi die ja auch hervorhebt, die zusammengehören, sieht man das eigentlich ganz gut. :gruebel:


Xion - Fr 19.11.10 23:18

Also direkt auf die Frage hab ich auch keine präzise Antwort (nur Vermutungen).

ABER:

Warum so kompliziert?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
  TStatistikpanelKlein=class(TPanel)
  private
    L: array [0..2of array [0..2of TStatistik;
    Erzeugt:boolean;
  end;

var
  StatistikpanelKlein:TstatistikpanelKlein;

procedure StatistikBauen(Owner:TComponent);


implementation

procedure StatistikBauen(Owner:Tcomponent; Wiesetyp:TWiesetyp);
var
i,j:integer;
begin
  StatistikPanelKlein:=TStatistikpanelKlein.Create(Owner);
  StatistikPanelKlein.Parent:=Form1;
  StatistikpanelKlein.Left:=25;
  StatistikpanelKlein.Top:=25;

  StatistikpanelKlein.L00.Feld:=TLabel.Create(StatistikpanelKlein);
  StatistikpanelKlein.L00.Feld.Parent:=StatistikpanelKlein;
  StatistikpanelKlein.L00.Feld.Caption:='Testerle';

  i:=0; j:=0;
  StatistikpanelKlein.L[i,j].Feld.caption:='Hat funktioniert';
end;


//Edit:
Das ist zudem auch noch deutlich schneller als FindComponent.

Achtung: Nicht vergessen, die Labels zu createn, bevor du was reinschreiben willst


Kay E. - So 21.11.10 14:08

Oh mann, wie kann man nur so auf dem Schlauch stehen? *g*
Die Lösung mit den Arrays ist natürlich naheliegend - Danke!


der organist - So 21.11.10 15:25

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
[...]

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
[...]

procedure StatistikBauen(Owner:Tcomponent; Wiesetyp:TWiesetyp);
var
i,j:integer;
begin
  [...]
  i:=0; j:=0;
  StatistikpanelKlein.L[i,j].Feld.caption:='Hat funktioniert';

end;
[...]



Reicht euch das hier nicht aus? xD


Delphi-Quelltext
1:
StatistikpanelKlein.L[0,0].Feld.caption:='Hat funktioniert';                    


Kay E. - So 21.11.10 15:59

In diesem speziellen Fall schon, aber wenn du meinen Text unter dem Code gelesen hättest:

Zitat:
Damit ich dann nicht alle 9 Labels umständlich manuell ausrichten, benennen, Parent zuweisen, etc muss, würd ich das gern in ne Schleife verpacken


und genau dafür sind die Laufvariablen gedacht. Sozusagen als Dummys in einer Trockenübung eingesetzt.


der organist - So 21.11.10 22:53

Da war aber keine Schleife mehr...... ich würd mal sagen, dass jemand anders deinen Text nich gelesen hat...


Xion - Mo 22.11.10 08:43

Ähm...auch im Originalcode war es keine Schleife ;)