Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Label[i] (https://www.delphipraxis.net/195873-label%5Bi%5D.html)

Zeref Darkmage 3. Apr 2018 10:06

Delphi-Version: 2007

Label[i]
 
Heyho, ich habe in einem Programm sagen wir mal 4 Labels als Positionsmarker gesetzt und möchte deren Eigenschaften top,left mit einem Timer auf Shapes übertragen, dass die Shapes wissen wo sie

hin müssen.

da dachte ich im groben an so was

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i : integer;
begin

inc(i);

ShapeRot.top:=Label[i].top;
ShapeRot.left:=Label[i].left;

end;

So, dass das nicht klappen kann ist mit bewusst. Ich hatte nach StringToComponent gesucht, allerdings nichts passendes gefunden.

Eine lösung für mich war dann, die Label Eigenschaften zu Beginn in 2 Arrays einzulesen. Ein Array für top und ein Array für left.


Delphi-Quellcode:

const maxarr = 4;

...

topwerte : array[1..maxarr] of integer;
leftwerte : array[1..maxarr] of integer;

...

//um dann im form create die werte einzulesen...

topwerte[1]:=Label1.top;
leftwerte[1]:=Label1.left;
.
.
.

topwerte[4]:=Label4.top;
leftwerte[4]:=Label4.left;
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i : integer;
begin

inc(i);

ShapeRot.top:=topwerte[i];
ShapeRot.left:=leftwerte[i];

end;
Soweit eine Lösung ich habe nur für mich das "Problem" , dass ich bei 40 Labels allein 80 Zeilen Code zum einlesen habe.



Hätte jemand die Lösung wie ich das mit dem Arrays umgehen kann?

LG Zeref

himitsu 3. Apr 2018 10:12

AW: Label[i]
 
zwei Zeilen ... eine Schleife und Delphi-Referenz durchsuchenFindComponent.

Jasocul 3. Apr 2018 10:17

AW: Label[i]
 
Könnte dich das Folgende auf den richtigen Weg führen:
Delphi-Quellcode:
var
  mylabel : TLabel;
  i : Integer;
begin
  for i := 1 to 10 do
  begin
    myLabel := FindComponent('Label' + IntToStr(i));
    if Assigned(myLabel) then
    begin
      ShapeRot.top:=myLabel.top;
      ShapeRot.left:=myLabel.left;
    end;
  end;
end;
Achtung, der Source ist nur einfach mal hingetippt.

Zeref Darkmage 3. Apr 2018 10:34

AW: Label[i]
 
vielen Dank für die Mühe :)

doch,

Delphi-Quellcode:
myLabel := FindComponent('Label' + IntToStr(i));


unit1.pas(66,16) Error: Incompatible types: got "TComponent" expected "TLabel"

LG Zeref

Jasocul 3. Apr 2018 10:39

AW: Label[i]
 
Dann etwas anders:
Delphi-Quellcode:
var
   mylabel : TComponent;
   i : Integer;
begin
   for i := 1 to 10 do
   begin
     myLabel := FindComponent('Label' + IntToStr(i));
     if Assigned(myLabel) then
     begin
       ShapeRot.top := TLabel(myLabel).top;
       ShapeRot.left := TLabel(myLabel).left;
     end;
   end;
end;
Aber Vorsicht! Type-Casting in dieser Form nur, wenn du sicher bist, dass es auch wirklich von diesem Typ ist. Sollte aber eigentlich der Fall sein.

DeddyH 3. Apr 2018 10:40

AW: Label[i]
 
Delphi-Quellcode:
myLabel := TLabel(FindComponent('Label' + IntToStr(i)));

Zeref Darkmage 3. Apr 2018 10:44

AW: Label[i]
 
vielen dank das fuktioniert super.. :)

ich will mich nicht aus dem Fenster lehnen, aber das TLabel davor sagt einfach bloß welche Komponente es direkt ist oder ? :D

Jasocul 3. Apr 2018 10:47

AW: Label[i]
 
Nein, nicht wirklich.
Es wandelt das, was in Klammern steht, in den angegebenen Type um. In diesem Fall TLabel.
Eine Prüfung erfolgt nicht. Du könntest zum Beispiel auch TLabel(i) schreiben. Nur würde das mit Sicherheit zu Fehlern führen.

günni0 3. Apr 2018 10:51

AW: Label[i]
 
Warum nicht so
Delphi-Quellcode:
var
 myLabel: TLabel;
begin
 myLabel := TLabel(FindComponent('Label' + IntToStr(i)));
Man castet ja eh auf TLabel ohne zu prüfen, ob es wirklich ein Label ist. Dann kann man es auch gleich als TLabel deklarieren.

Oder eben so
Delphi-Quellcode:
var
 Comp: TComponent;
 myLabel: TLabel;
begin
 Comp:= FindComponent('Label' + IntToStr(i));
 if Comp is TLabel then
  begin
    myLabel: TLabel(Comp);
  end;

Zeref Darkmage 3. Apr 2018 10:52

AW: Label[i]
 
Zitat:

Zitat von günni0 (Beitrag 1397981)
Warum nicht so
Delphi-Quellcode:
var
 myLabel: TLabel;
begin
 myLabel := TLabel(FindComponent('Label' + IntToStr(i)));
Man castet ja eh auf TLabel ohne zu prüfen, ob es wirklich ein Label ist. Dann kann man es auch gleich als TLabel deklarieren.

Jo ok hatte bei mir nicht funtioniert weil s noch als TComponent deklariert war :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz