tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
2126
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    blck blck ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    70
    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 :
    1
    
    SName.top:=SName.top+5
    klappt nicht, da bekomme ich die Fehlermeldung:
    Code :
    1
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    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
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von blck Beitrag anzeigen
    Hallo,
    Code :
    1
    
    SName.top:=SName.top+5
    klappt nicht, da bekomme ich die Fehlermeldung:
    Code :
    1
    
    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".
     

  3. #3
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Du hättest in ShapeControll stattdessen Parameter von den Typen Shape : TShape und Timer TTimer verwenden sollen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    ....
      ShapeControl(MyTShape, MyTTimer);
     
    ...
      procedure ShapeControl( Shape: TShape, Timer : TTimer);
     ...
      Shape.Top := Shape.Top +5;
      ....

    vop
     

  4. #4
    blck blck ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    70
    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
     

  5. #5
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      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;
     

  6. #6
    blck blck ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    70
    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
     

  7. #7
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    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 :
    1
    
      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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    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
     

  8. #8
    blck blck ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    70
    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 :
    1
    
      shape.top:=shape.top+5;
    als schuldigen deklariert. Ich bin beim dynamischen Erzeugen & Verarbeiten von Shape total unerfahren, deswegen die vielen NAchfragen.

    MfG Blck
     

Ähnliche Themen

  1. Turbo Delphi - Externe Komponenten einfügen
    Von Alex Duschek im Forum Delphi, Kylix, Pascal
    Antworten: 0
    Letzter Beitrag: 29.06.09, 22:30
  2. top position dyn. erzeugter Shapes
    Von blck im Forum Delphi, Kylix, Pascal
    Antworten: 0
    Letzter Beitrag: 24.06.09, 22:48
  3. Eigenschaften von Komponenten
    Von Divi im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 28.05.06, 19:20
  4. Doppeltes Komponenten-Array ... Problem! (Delphi)
    Von RealSucker im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 13.05.05, 13:37
  5. Antworten: 3
    Letzter Beitrag: 07.02.05, 02:09