Variable mit Objektnamen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Variable mit Objektnamen

Beitrag von u-boot »

Ich habe eine Variable in der der Objektname (Shapename) steht worauf ich zugreifen will. Nun geht sowas wie Variable1.top statt Shape1.top schlecht was mir auch einleuchtet.

So aber wie muss man abändern, damit es funktioniert ?

Kurzfassung falscher Code:
Variable1:=Shape1
Variable1.top
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Variable mit Objektnamen

Beitrag von Euklid »

Hmmm. ich habe zugegebenermaßen dein Problem nicht ganz verstanden. Aber wenn die Variable zum Objekt werden soll, mit dem du dann umgehen kannst, gehst du wie folgt vor:

Code: Alles auswählen

var variable1:TShape;
[...]
begin
variable1:=TShape.create;
[...]
//Jetzt kannst du das Objekt variable1 verwenden.
[...]
variable1.free;
end;


Gruß, Euklid

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Variable mit Objektnamen

Beitrag von u-boot »

Gut anscheinend hab ich das Problem ungenügend genau beschrieben. Dann muss ich wohl doch etwas ausholen wie ich das gemeint habe.

mal mein Quelltext ... das Problem findet sich ganz unten
Sry falls die Formatierung nich so hinhauen sollte

Code: Alles auswählen

var
  k:Integer;                //Zähler für die Namensvergebung der Shapes 
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 var
 Shapeq: TShape;
 Labelz: TLabel;
begin
  if k<0 Then
  k:=0;
  k:=k+1;
  Shapeq:=TShape.Create(Form1);            //Erstelle einen Shape an der Stelle an der ein  Mausklick erfolgt.
  Shapeq.parent:=Form1;
  Shapeq.left:=X;
  Shapeq.Top:=Y;
  Shapeq.Shape:=stCircle;
  Shapeq.Width:=30;
  Shapeq.Height:=30;
  If k <10 Then
    Shapeq.name:='K0' + InttoStr(k)                                 //gib dem Shape den Namen Kxx  xx ist eine Zahl
  Else
    Shapeq.name:='K'  + InttoStr(k);
  Labelz:=TLabel.Create(Form1);                                   //Beschrifte den Shape mit dem Namen in Form eines Labels
  Labelz.parent:=Form1;
  Labelz.left:=X+4;
  Labelz.Top:=Y+10;
  If k <10 Then
    Labelz.name:='L0' + InttoStr(k)
  Else
    Labelz.name:='L'  + InttoStr(k);
  Labelz.Caption:=Shapeq.Name;
  Labelz.Font.Color:=0;
  Labelz.Visible:=True;
end;
 
procedure TForm1.LinieClick(Sender: TObject);             // So nun soll das eine Prozedur geben die letzten beiden Shapes zu verbinden
var
    x1: integer;
    x2: integer;
    y1: integer;
    y2: integer;
    t0: shortstring;
    t1: shortstring;
 
begin
    if k>=11 Then                                                           // weise t0 den  Namen des vorletzten Shapes zu
      t0:='K' + inttostr(k-1)
    Else
      t0:='K0' + inttostr(k-1);
 
    if k>=10 Then                                                           //weise t1 den Namen des letzten erstellten Shapes zu
      t1:='K' + inttostr(k)
    Else
      t1:='K0' + inttostr(k);                                                     
 
 
   x1:=                                                // so hier soll nun x1 der X-Wert des vorletzten Shapes zugewiesen werden
                                                         //  also um genau zu sein der X-Wert des Shapes dessen name in t0 als string gespeichert ist
 
    y1:=t0.top                                      //analog für den y-wert....so gehts nicht und ist auch halbwegs logisch dass es nicht geht
 
   x2:=                                                                        //hier  dann analog dann mit t1 für x2 und y2
   y2:=
 
    canvas.Line(x1,y1,x2,y2);
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Variable mit Objektnamen

Beitrag von monta »

Typecasting heißt das Zauberwort ;)

Also erst finden nach dem Namen und dann auf TShape casten.

Kleines Beispiel:

Code: Alles auswählen

with FindComponent('Shape1') as TShape do
    Width := 200;
Johannes

Antworten