Delphi-PRAXiS

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

Zeref Darkmage 3. Apr 2018 10:55

AW: Label[i]
 
Vielen Dank für die ganzen Vorschläge ich werde mir sie merken und anwenden, danke :D


LG Zeref

himitsu 3. Apr 2018 11:23

AW: Label[i]
 
Delphi-Quellcode:
HardCast := TLabel(FindComponent('Label' + IntToStr(i))); // weißt einfach zu, ohne den Typ zu prüfen
SoftCast := (FindComponent('Label' + IntToStr(i)) as TLabel); // knallt, wenn es kein Label ist (NIL ist aber erlaubt, da es ja kein "falscher" Typ ist)
if FindComponent('Label' + IntToStr(i)) is TLabel then ...; // prüft ob der Typ stimmt (nil ist nicht möglich, da nicht dieser Typ drin ist)

bernau 3. Apr 2018 11:49

AW: Label[i]
 
Oder einfach eine Funktion basteln, die mir die Labels übergibt.

Damit bist du unabhängig von der Namensgebung deiner Labels und kannst gezielt nur die Labels ansprechen, die wirklich benötigt werden, wenn noch mehr Label auf deiner Form vorhanden sind.

Delphi-Quellcode:

Function TForm1.GetLabel(aIndex:Integer):TLabel;
begin
  case aIndex of
    1:Result := Label1;
    2:Result := Label2;
    3:Result := LabelXYZ;
    4:Result := Labelqqq;
    5:Result := LabelWasWeisIch;
  else
    Result := nil; // Oder eine Exception
  end;
end;

mkinzler 3. Apr 2018 11:52

AW: Label[i]
 
Oder Referenzen der benötigten Labels( oder allg. Controls) in einem/einer Array/Liste ablegen

Redeemer 3. Apr 2018 12:18

AW: Label[i]
 
Zitat:

Zitat von himitsu (Beitrag 1397990)
Delphi-Quellcode:
HardCast := TLabel(FindComponent('Label' + IntToStr(i))); // weißt einfach zu, ohne den Typ zu prüfen
SoftCast := (FindComponent('Label' + IntToStr(i)) as TLabel); // knallt, wenn es kein Label ist (NIL ist aber erlaubt, da es ja kein "falscher" Typ ist)
if FindComponent('Label' + IntToStr(i)) is TLabel then ...; // prüft ob der Typ stimmt (nil ist nicht möglich, da nicht dieser Typ drin ist)

Ah, danke, wollte das gerade fragen, weil ich bei Objekten immer das zweite mache, hier aber nur das erste gepostet wurde. Mir war nur bekannt, dass bei Pointern nur das erste geht.

himitsu 3. Apr 2018 12:31

AW: Label[i]
 
IS und AS sind für Klassen/Objekte. (und neuerdings auch für Interfaces).

Pointer und alle anderen Typen kann man nur Hart casten, da in den "Daten" nirgendwo der Typ gespeichert/verlinkt wird, kann es da auch keine Laufzeitprüfung (Runtime) geben.
Dort geht halt nur zur CompileTime.


HardCast macht der Compiler (daher ist das auch ein paar Nanosekunden schneller)
und SoftCast dein Programm.

Achtung, es gibt beim Compiler ein paar Casts, die auch erst zur Laufzeit passieren.
Reine HartCasts ändern keine Daten, sondern lassen dich nur anders rauf zugreifen.
Bei WideString > AnsiString und ebenso bei Variants werden vom Compiler "Übersetungsfunktionen" aufgerufen.
Und z.B. bei Interger zu Byte, mit aktiver Bereichsprüfung, wird nach dem Cast noch ein Prüfcode eingeaut. (
Delphi-Quellcode:
if WarÜberlauf then RaiseError
)

Delphi-Quellcode:
{$RANGECHECKS ON}
EinWord := EinInteger; // knallt, wenn nicht im Bereich von 0..65535
EinWord := Word(EinInteger); // harter Cast ohne Prüfung (einfach die höheren 2 Byte wegwerfen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.

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