Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variable Timer (https://www.delphipraxis.net/113928-variable-timer.html)

FGD 16. Mai 2008 20:22


Variable Timer
 
Hoffentlich is da der richtige Threadtitel...
Delphi-Quellcode:
type Timer = Array(*[1..40]*) of TTimer;

procedure FNummerTimerstart(NR: Integer);
begin
 if Form1.RadioGroup1.itemindex =0 then
 Timer[NR].enabled := true;
 if Form1.RadioGroup1.itemindex =1 then
 begin
  Nr := Nr+10;
  Timer[NR].enabled := true;
 end;
 if Form1.RadioGroup1.itemindex =2 then
 begin
  Nr := Nr+20;
  Timer[NR].enabled := true;
 end;
 if Form1.RadioGroup1.itemindex =3 then
 begin
  Nr := Nr+30;
  Timer[NR].enabled := true;
 end;
end;
Aufgerufen zum Beispiel mit:
Delphi-Quellcode:
FNummerTimerstart(2);
Ich hab mich hieran orientiert:
http://www.wer-weiss-was.de/theme159...le1957127.html
Die Timer gibts aber schon.
Zum Problem, dort werden eckige Klammern [] verwendet, bei mir gibts da eine Fehlermeldung:
Code:
[Fehler]: '(' erwartet, aber '[' gefunden
Wenn ich jetzt normale Klammern () nehme:
Code:
[Fehler]: Record, Objekt oder Klassentyp erforderlich
Was ist hier falsch? :wall:

DeddyH 16. Mai 2008 20:28

Re: Variable Timer
 
Das verstehe ich ehrlich gesagt nicht. Die eckigen Klammern müssten eigentlich richtig sein. Allerdings wäre es wohl besser, wenn das statt einer Prozedur eine Methode Deines Formulars wäre.

Matze 16. Mai 2008 20:30

Re: Variable Timer
 
Hallo,

nimm "var" anstelle von "type":

Delphi-Quellcode:
var Timer: array(*[1..40]*) of TTimer;
Denk auch daran, die Timer zu erzeugen.

Grüße

FAlter 16. Mai 2008 20:31

Re: Variable Timer
 
Hi,

nenn den Typ mal z. B. TTimerArray. Und dann brauchst du eine Variable Timer vom Typ TTimerArray.

Mfg
FAlter

tomsel 16. Mai 2008 20:32

Re: Variable Timer
 
Du hast keine Variable vom Typ Timer deklariert, sonden verwendest statt dessen den Typbezeichner, als wäre er eine.



Delphi-Quellcode:
...
var
  timers: Timer;
begin
  timers[0] := humbug;
end;

DeddyH 16. Mai 2008 20:36

Re: Variable Timer
 
Also nochmal im Ganzen:
Delphi-Quellcode:
type
  TTimerArray = array[1..10] of TTimer;
 
  TForm1 = class(TForm)
  ...
  private
    FTimerArray: TTimerArray;
  ...
  end;
Jetzt noch im OnCreate die Timer anlegen und OnDestroy wieder freigeben.

Fussball-Robby 16. Mai 2008 20:36

Re: Variable Timer
 
Und die Funktion kannst du auch ziemlich verkürzen:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
  private
    procedure FNummerTimerstart(NR: Integer);
  //..
  end;

implementation

procedure TForm1.FNummerTimerstart(NR: Integer);
begin
  case RadioGroup1.ItemIndex of
    1: Inc(Nr, 10);
    2: Inc(Nr, 20);
    3: Inc(Nr, 30);
  end;
  {oder:
  Inc(Nr, RadioGroup1.ItemIndex * 10);}
  Timer[NR].Enabled := True;
end;

FGD 16. Mai 2008 21:05

Re: Variable Timer
 
Zitat:

Zitat von DeddyH
Das verstehe ich ehrlich gesagt nicht. Die eckigen Klammern müssten eigentlich richtig sein. Allerdings wäre es wohl besser, wenn das statt einer Prozedur eine Methode Deines Formulars wäre.

Funktionen/Prozeduren hab ich verstanden, Methoden noch nicht.
Zitat:

Zitat von Matze
Hallo,

nimm "var" anstelle von "type":

Delphi-Quellcode:
var Timer: array(*[1..40]*) of TTimer;
Denk auch daran, die Timer zu erzeugen.

Grüße

und
Zitat:

Zitat von FAlter
Hi,

nenn den Typ mal z. B. TTimerArray. Und dann brauchst du eine Variable Timer vom Typ TTimerArray.

Mfg
FAlter

Da gibts eine schöne Zugriffsverletzungen, obwohl die Timer bereits auf dem Formular sind oder ist das, dass Problem :?:
Zitat:

Zitat von Fussball-Robby
Und die Funktion kannst du auch ziemlich verkürzen:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
  private
    procedure FNummerTimerstart(NR: Integer);
  //..
  end;

implementation

procedure TForm1.FNummerTimerstart(NR: Integer);
begin
  case RadioGroup1.ItemIndex of
    1: Inc(Nr, 10);
    2: Inc(Nr, 20);
    3: Inc(Nr, 30);
  end;
  {oder:
  Inc(Nr, RadioGroup1.ItemIndex * 10);}
  Timer[NR].Enabled := True;
end;

Gefällt mir gut aber, auch Zugriffsverletzung

Matze 16. Mai 2008 21:08

Re: Variable Timer
 
Ich vermute, du hast die Timer nicht erzeugt:

Delphi-Quellcode:
for i := 0 to 39 do
begin
  Timer[i] := TTimer.Create(self);
  Timer[i].Interval := ...
  // ...
end;
Grüße

Edit: "Interval" schreibt man mit einem "l".

FGD 16. Mai 2008 21:27

Re: Variable Timer
 
Die Timer sind aber auf dem Formular schon vorhanden.

Matze 16. Mai 2008 21:28

Re: Variable Timer
 
Achso, wenn du die Timer dann ansprechen möchtest, müsstest du über Delphi-Referenz durchsuchenFindComponent gehen.

Nachtrag: Dein Array ist im Prinzip dann überflüssig.

Ansprechen kannst du sie so. Das setzt voraus, dass die Timer "Timer1", "Timer2", ... heißen. Sie müssen einen fortlaufenden Index besitzen.

Delphi-Quellcode:
FindComponent('Timer' + IntToStr(NR)) as TTimer).Enabled := ...

FGD 16. Mai 2008 22:05

Re: Variable Timer
 
Zitat:

Zitat von Matze
Delphi-Quellcode:
FindComponent('Timer' + IntToStr(NR)) as TTimer).Enabled := ...

Ist das so gemeint:
Delphi-Quellcode:
(FindComponent('Timer' + IntToStr(NR)) as TTimer).Enabled := false;

Fehlermeldungen des Compilers
Code:
[Fehler]: Undefinierter Bezeichner: 'FindComponent'
Code:
[Fehler]: Operator ist auf diesen Operandentyp nicht anwendbar*
*bei Markierung zwischen TTimer).Enabled

Matze 16. Mai 2008 22:10

Re: Variable Timer
 
Ja genau, ich habe die erste Klammer vergessen, sorry. FindComponent ist in der Unit Classes definiert, die Delphi automatisch einbinden sollte (sie müsste in den uses stehen).

Bei mir funktioniert der Code.

Medium 17. Mai 2008 02:48

Re: Variable Timer
 
FindComponent ist nicht wirklich einfach so in Classes deklariert, sondern der Vorfahre der Klassen, die Komponenten beinhalten können ist in Classes deklariert. In diesem Fall soll wohl Form1.FindComponent() gemeint sein, was du in einer klassenlosen Funktion auch voll qualifizieren musst. Da das aber reichlich unschön, und an der OOP vorbei ist, empfehle ich die Funktion zu einer Methode deines Formulars zu machen. Dort wird implizit "self" referenziert, und du kannst unqualifiziert FindComponent() benutzen, bzw. sollte man es dort dann auch tunlichst!

FGD 17. Mai 2008 11:13

Re: Variable Timer
 
Zitat:

Zitat von Medium
In diesem Fall soll wohl Form1.FindComponent() gemeint sein, was du in einer klassenlosen Funktion auch voll qualifizieren musst.

Das Form1 hat gefehlt.
Zitat:

Zitat von Medium
Da das aber reichlich unschön, und an der OOP vorbei ist, empfehle ich die Funktion zu einer Methode deines Formulars zu machen. Dort wird implizit "self" referenziert, und du kannst unqualifiziert FindComponent() benutzen, bzw. sollte man es dort dann auch tunlichst!

Methoden muss ich mir noch angucken.

:dp: Es ist schön wie schnell einem hier geholfen wird :thumb:

Fussball-Robby 17. Mai 2008 11:17

Re: Variable Timer
 
Zitat:

Zitat von FGD
Zitat:

Zitat von Medium
Da das aber reichlich unschön, und an der OOP vorbei ist, empfehle ich die Funktion zu einer Methode deines Formulars zu machen. Dort wird implizit "self" referenziert, und du kannst unqualifiziert FindComponent() benutzen, bzw. sollte man es dort dann auch tunlichst!

Methoden muss ich mir noch angucken.

Du musst die Prozedur im private-Abschnitt der Form deklarieren. Siehe #7.

DeddyH 17. Mai 2008 11:19

Re: Variable Timer
 
Prozedur:
Delphi-Quellcode:
procedure SayHello;
begin
  ShowMessage('Hello World');
end;
Methode:
Delphi-Quellcode:
type
  TFormWuppdi = class(TForm)
  ...
  private
    procedure SayHello;
  ...
  end;

...

procedure TFormWuppdi.SayHello;
begin
  ShowMessage('Hello World');
end;
[edit] Zu langsam, dafür ausführlicher *gg* [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz