Position einer zur Laufzeit erstellten Komponente abfragen

Rund um die LCL und andere Komponenten
Antworten
MagneThilo
Beiträge: 2
Registriert: Fr 8. Mai 2015, 13:47
OS, Lazarus, FPC: Win (L 1.2.6 FPC2.6.4)
CPU-Target: 64Bit

Position einer zur Laufzeit erstellten Komponente abfragen

Beitrag von MagneThilo »

Hallo erstmal!
Ich bin neu im Forum, also entschuldigt mich bitte, wenn ich das falsche Unterforum erwischt habe. ;)

Und zwar soll ich für die Schule (Ja, wir lernen tatsächlich Lazarus in der Schule...) das Problem der "Türme von Hanoi" graphisch umsetzen.
Dabei geht es um eine Anzahl n an Scheiben, die auf einer Stange gestapelt sind. Diese müssen zur Lösung auf einer zweiten Stange gestapelt sein,
außerdem gibt es noch eine dritte Stange als "Hilfsposition".

Mein Programm soll jetzt erst einmal alle Scheiben als TShapes mit relativer Größe und Position zeichnen.
Das klappt auch schon ganz gut.
Jetzt soll beim Verschieben einer Scheibe dem Programm in einem TMemo-Feld mitgeteilt werden, wie die neue Verteilung der Scheiben auf den Stangen aussieht.
Dazu muss die zu verschiebende Scheibe ausgewählt werden (fertig)
und anhand deren .Left-Property festgestellt werden, auf welcher Stange sie liegt.
Und da liegt jetzt mein Problem.
Ich habe eine Variable "ShapeName" in der einfach der Name der Scheibe als String gespeichert ist.
Anhand dieser wird eine TComponent-Variable gesucht, die die Bezeichnung "ShapeComp" trägt.
Wenn ShapeComp jetzt ein TShape (also eine Scheibe) ist, dann soll seine Position abgefragt werden.

Code: Alles auswählen

 
procedure TForm1.ZeichneScheibe(Scheibe, Stange, Pos: Integer);
var Shape: TShape;
      ShapeName: String;
      ShapeComp: TComponent;
      Stange: Integer;
begin
ShapeName := 'Scheibe' + IntToStr(Scheibe);
ShapeComp := FindComponent(ShapeName);
 
//Hier kommt der problematische Teil
if ShapeComp is TShape then
  if ShapeComp.Left < 284
    then Stange := 1
    else if ShapeComp.Left < 534
      then Stange := 2
      else Stange := 3;
{...}
Hier wird mir allerdings der Fehler "Error: identifier idents no member 'Left' " angezeigt.
Warum hat dieses TShape keine .Left-Property?
Liegt das daran, dass es zur Laufzeit erstellt wurde?
Oder daran, dass es eine allgemeine Variable TComponent ist?
Obwohl ja extra noch geprüft wird, ob es sich um ein TShape handelt und eigentlich ja alle Komponenten eine Position haben..

Ich bin gerade ziemlich am verzweifeln. :D
Wäre nett, wenn mir jemand helfen könnte..
Dankeschön :)

Code: Alles auswählen

 
  try
    TypeCode;
  except on E: Verzweiflung 
             do Watch(YouTube)[Catvideos];
 

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Position einer zur Laufzeit erstellten Komponente abfrag

Beitrag von Komoluna »

Hi,

du testest zwar ob dein ShapeComp vom typ TShape ist, aber dannach greifst du wieder auf die TComponent Eigenschaften von ShapeComp zu.
Du muss dem Compiler sagen, dass er das Objekt als TShape behandeln soll(nennt man typencasting):
also

Code: Alles auswählen

TShape(ShapeComp).Left;
//oder
(ShapeComp as TShape).Left;
oder du legst noch eine Variable an z.b. Shape vom typ TShape und schreibst dann nach deiner FindComponent zeile das:

Code: Alles auswählen

if ShapeComp is TShape then
begin
  Shape := TShape(ShapeComp);
  //<hier deine ifs und elses>
end;
{...}
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

MagneThilo
Beiträge: 2
Registriert: Fr 8. Mai 2015, 13:47
OS, Lazarus, FPC: Win (L 1.2.6 FPC2.6.4)
CPU-Target: 64Bit

Re: Position einer zur Laufzeit erstellten Komponente abfrag

Beitrag von MagneThilo »

Dankeschön, hat funktioniert! :)

Code: Alles auswählen

 
  try
    TypeCode;
  except on E: Verzweiflung 
             do Watch(YouTube)[Catvideos];
 

Antworten