Koponenten variable Namen

Rund um die LCL und andere Komponenten
Antworten
USchoch
Beiträge: 28
Registriert: Do 16. Mär 2017, 14:01

Koponenten variable Namen

Beitrag von USchoch »

Hallo
Ich schreibe eine Anwendung, die 104 TImage-Komponenten hat. Diese heissen ImgF0Z0 bist ImgF12Z7. Ich möchte das Picture.Bitmap von einer dieser Kompnenten zu einer anderen kopiern. z.B. so: ImgF2Z7.Picture.Bitmap:=ImgF4Z12.Picture.Bitmap. Das geht.
Ich möchte jedoch die Namen der beiden beteiligten Komponenten beliebig wählen können.
Den Namen der Komponente möchte ich so erstellen: Beispiel:

f:=2; z:=7; KompName:= 'ImgF'+Inttostr(f)+'Z'+Inttostr(z);
Das egibt den Namen 'ImgF2Z7' als String.

Wie kann ich jetzt über diesen Namen auf diese Komponente zugreifen? Mit TImage(KompName).Picture.Bitmap geht es nicht

Gruss
Uli

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Koponenten variable Namen

Beitrag von Winni »

Hi!

Da hast Du Dir ja etwas ausgedacht .....

Kompliziert, aber geht

Code: Alles auswählen

Procedure TForm1.CopyPicture (img1,img2: string);
var who : string;
     i : integer;
     im1,im2 : TImage;
begin
for i := 0 to Component.Count - 1 do
  begin
      WriteStr(who, Components[i]);
      if img1= who then im1 := components[i];
      if img2 = who then im2 := components[i]:
  end;
  im2.Picture.Bitmap := im1.Picture.Bitmap;
end;
Winni

wp_xyz
Beiträge: 5158
Registriert: Fr 8. Apr 2011, 09:01

Re: Koponenten variable Namen

Beitrag von wp_xyz »

Warum ordnest du die TImage-Komponenten nicht in einem 2D-Array an?

Code: Alles auswählen

type
  TForm1 = class(TForm)
  private
    FImages: array[0..12, 0..7] of TImage;
    ...
  end;
Die Images erzeugst du zur Laufzeit und kannst sie dabei gleich in das 2D-Array einsortieren; die Eigenschaft "Name" jeder Komponente bleibt dabei leer (wird zur Laufzeit eigentlich nicht benötigt). Damit kannst du dann über FImages[F, Z] (F = 0..12, Z=0..8 ) auf jedes Image zugreifen.

Falls du unbedingt auf der Stringlösung bestehst, dann kannst du mit der Formular-Method FindComponent(name_der_komponente) jede Komponente aufgrund der Wertes der Property "Name" finden. Der Rückgabewert ist aber ein TComponent, daher musst du, um ein TImage zu erhalten, einen Type-cast durchführen:

Code: Alles auswählen

functionTForm1.FindeImage(AName: String): TImage;   // AName z.B. 'ImgF2Z7'
var
  C: TComponent;
begin
  C := FindComponent(AName);
  if C is TImage then
    Result := TImage(C)  // Image mit diesem Namen gefunden
  else
    Result := nil;  // kein Image mit diesem Namen gefunden
end;

USchoch
Beiträge: 28
Registriert: Do 16. Mär 2017, 14:01

Re: Koponenten variable Namen

Beitrag von USchoch »

Hallo mitenand

Das mit dem Findcomponent funktioniert mit ein paar Anpassungen:

Var c : TComponent in TImage geändert
...
c:=FindComponent('NamederComponente') as TImage; { as TImage angehänt }


Besten Dank und Gruss

Uli

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1647
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Koponenten variable Namen

Beitrag von fliegermichl »

USchoch hat geschrieben: Mo 17. Jan 2022, 10:32 Hallo mitenand

Das mit dem Findcomponent funktioniert mit ein paar Anpassungen:

Var c : TComponent in TImage geändert
...
c:=FindComponent('NamederComponente') as TImage; { as TImage angehänt }


Besten Dank und Gruss

Uli
Das geht aber schief, wenn die gefundene Komponente nicht vom Typ TImage ist.
Deshalb die Prüfung von wp_xyz's Beispiel.

Antworten