Delphi 5 + Eigenschaften erzeugter Komponenten

blck

Mitglied
Hallo,
Ich habe mir in einer Schleife mehrere Shapes und Timer erstellt und ihnen Namen zugewiesen. Diese übergebe ich an eine Prozedur Shapecontroll. Das klappt soweit auch, nur weiß ich jetzt nicht, wie ich die jeweiligen Objekteigenschaften der Shapes und Timer anspreche.
Code:
SName.top:=SName.top+5
klappt nicht, da bekomme ich die Fehlermeldung:
Code:
Record, Object oder Klassentyp erforderlich
Was muss ich also tuen, um mit den jeweiligen Eigenschaften arbeiten zu können?
Hier mal der gesamte Quellcode:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var
j:integer;
begin
 randomize;
 Leben := 20;
 schritt:= 10;

 Label1.caption := inttostr(Leben);

 for j:=6 to 15 do
 begin
  SName:='Shape'+inttostr(j);
  TName:='Timer'+inttostr(j);
  MyTShape:=TShape.Create(Self);
  MyTShape.Parent:=Form1;
  MyTShape.Show;
  MyTShape.Name:=SName;
  MyTShape.Brush.Color:=clred;
  MyTShape.height:=random(30)+10;
  MyTShape.width:=random(30)+10;
  MyTShape.top:=16;
  MyTShape.left:=random(193)+40-MyTShape.width;
  MyTTimer:=TTimer.Create(Form1);
  MyTTimer.Name:=TName;
  Shapecontrol(SName,TName);
 end;

end;

procedure TForm1.Shapecontrol(SName,TName:string);
begin
  label1.caption:=TName;
  label2.caption:=SName;

  SName.top:=SName.top+5;
end;

In den Labels werden die erzeugten Namen angezeigt, allerdings weiß ich nicht ob das auch heißt, dass die Objekte erzeugt sind, wobei die Shapes zu sehen sind.

MfG Blck
 

CSANecromancer

Erfahrenes Mitglied
Hallo,
Code:
SName.top:=SName.top+5
klappt nicht, da bekomme ich die Fehlermeldung:
Code:
Record, Object oder Klassentyp erforderlich
Was muss ich also tuen, um mit den jeweiligen Eigenschaften arbeiten zu können?
Wie die Fehlermeldung sagt: Einen Record, ein Objekt oder einen Klassentyp verwenden, der die Eigenschaft "Top" besitzt. SName ist ein String und dieser hat eben keine Eigenschaft "Top".
 

vop

Erfahrenes Mitglied
Du hättest in ShapeControll stattdessen Parameter von den Typen Shape : TShape und Timer TTimer verwenden sollen
Code:
....
  ShapeControl(MyTShape, MyTTimer);

...
  procedure ShapeControl( Shape: TShape, Timer : TTimer);
 ...
  Shape.Top := Shape.Top +5;
  ....

vop
 

blck

Mitglied
Hallo,
ja sowas hatte ich mir beinahe gedacht. Wie erzeuge ich den jetzt für den generierten Timer MyTTimer eine Prozedur zur Überprüfung, also wie bei einem normalen Timer?

MfG Blck
 

vop

Erfahrenes Mitglied
Du kannst dem OnTimer-Ereignis deines Timers eine Prozedur zuweisen. Dabei muß die Prozedur von demselben Typ sein wie eine normale OnTimer-Prozedur also etwa
Code:
  type
     procedure MyTimerProc(Sender:TObject);
...
  implementation
  procedure MyTimerProc(Sender:TObject);
  begin
     // Dein Code
     // Sender ist dabei dann jeweils dein Timer
    // über (Sender as TTImer).Tag beispielsweise kannst du
    // erkennen, welcher Timer es ist, wenn du bei der 
    // Erzeugung der Timer das Property Tag zuweist.
    // Das kannst du natürlich auch über
    // (Sender as TTimer).Name
  end;
 ...
  // So wird die Prozedur dem Timer zugewiesen
   MyTTimer.OnTimer := MyTimerProc;
 

blck

Mitglied
Hallo,
Vielen Dank für deine Hilfe!
Ich hab das jetzt mit drin und das läuft auch. Nur wie kriege ich folgendes Szenario zum laufen(Dynamisch erzeugt, statisch ist das kein Problem):
Timer1 kümmert sich um Shape1 (Shape1.top:=Shape1.top+1)
Timer2 kümmert sich um Shape2 (Shape2.top:=Shape2.top+1)
Timer3 kümmert sich um Shape3 (Shape3.top:=Shape3.top+1)
.
.
.
Mfg Blck
 

vop

Erfahrenes Mitglied
Schreibe deine Timer-Prozedur selbst dynamisch, indem du in er Verarbeitungsroutine für den Timer abfragst, welcher Timer sie ausgelöst hat (Sender)

über (Sender as TComponent).Name beispielsweise erhältst du den Namen des Sender-Objekte (beispielsweise 'MyTimer1')

Oder aber wie bereits erwähnt könntest du bei der Erzeugung der Timer die Eigenschaft Tag verwenden und diese in der Verarbeitungsroutine wieder auslesen etwa

Code:
  Nummer := (Sender as TTimer).Tag;

Hast Du den Namen einer gewünschten Komponente, kannst du folgendermaßen auf sie zugreifen (nur runtergeschrieben, nicht getestet)
Code:
var
  Comp : TComponent;
  Name : string;
  Shape : TShape;
  Nummer : int;
begin
  ...
  Nummer := (Sender as TTimer).Tag;
  Name := 'Shape' + IntToStr(Nummer);
  Comp := FindComponent(Name);
  Shape := TShape( Comp);
 Shape.Left := Shape.Left+5;
...
Damit solltest du weiterkommen,

Gruß vop
 

blck

Mitglied
Hallo,
Entschuldigung für die späte Rückmeldung! Ich hatte in letzter Zeit nicht viel Muße um mich damit zu beschäftigen!
So dein Script funktioniert, nur das nach einiger Zeit ein Laufzeitfehler auftritt und die Zeile:
Code:
  shape.top:=shape.top+5;
als schuldigen deklariert. Ich bin beim dynamischen Erzeugen & Verarbeiten von Shape total unerfahren, deswegen die vielen NAchfragen.

MfG Blck