![]() |
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:
Soweit eine Lösung ich habe nur für mich das "Problem" , dass ich bei 40 Labels allein 80 Zeilen Code zum einlesen habe.
procedure TForm1.Timer1Timer(Sender: TObject);
var i : integer; begin inc(i); ShapeRot.top:=topwerte[i]; ShapeRot.left:=leftwerte[i]; end; Hätte jemand die Lösung wie ich das mit dem Arrays umgehen kann? LG Zeref |
AW: Label[i]
zwei Zeilen ... eine Schleife und
![]() |
AW: Label[i]
Könnte dich das Folgende auf den richtigen Weg führen:
Delphi-Quellcode:
Achtung, der Source ist nur einfach mal hingetippt.
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; |
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 |
AW: Label[i]
Dann etwas anders:
Delphi-Quellcode:
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.
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; |
AW: Label[i]
Delphi-Quellcode:
myLabel := TLabel(FindComponent('Label' + IntToStr(i)));
|
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 |
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. |
AW: Label[i]
Warum nicht so
Delphi-Quellcode:
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.
var
myLabel: TLabel; begin myLabel := TLabel(FindComponent('Label' + IntToStr(i))); 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; |
AW: Label[i]
Zitat:
|
AW: Label[i]
Vielen Dank für die ganzen Vorschläge ich werde mir sie merken und anwenden, danke :D
LG Zeref |
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) |
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; |
AW: Label[i]
Oder Referenzen der benötigten Labels( oder allg. Controls) in einem/einer Array/Liste ablegen
|
AW: Label[i]
Zitat:
|
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