Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Delphi Schleife ? Timer muss mehrfach belegt werden !
Sithlord - Do 05.06.08 21:25
Titel: Delphi Schleife ? Timer muss mehrfach belegt werden !
Hallo Mitglieder !
Ich habe gesucht - aber nicht das gefunden was ich wollte !
Ich brauche eine Schleife, die, wenn der Timer das erste mal aktiviert wird, Aktion1 ausführt. Wenn der Timer danach nochmal aktiviert wird, soll er aktion2 ausführen, wenn der Timer ein drittes mal startet, auch noch aktion3 ausführen, usw...
Nun - ich habe bis jetzt nur Schleifen gefunden, die alles sofort nacheinander erledigt hatten - irgendwie ging das nicht so wie ich wollte.
Mfg Sithlord
huuuuuh - Do 05.06.08 21:27
geht mit ner global deklarierten zählvariable...
Hidden - Do 05.06.08 21:31
Hi,
Du könntest am Ende von Procedure 1 dem Timer Procedure 2 als neue OnTimer-Variable zuweisen(Timer1.OnTimer := Procedure2;). Sowohl Prozedur 1 als auch 2 müssen (Sender: TObject) als Parameter haben, damit sie vom Timer akzeptiert werden.
mfG,
Sithlord - Do 05.06.08 21:38
Könntest du das bitte nochmal als Beispiel bitte ausmalen ?
Bitte nach folgendem Schema :
erste Aktion : showmessage('1');
zweite Aktion: showmessage('2');
Showmessage ist natürlich nur ein Beispiel - soll nicht dahin !
Ich habe gedacht man kann das mit
i: showmessage('1');
...
lösen !
Hidden - Do 05.06.08 21:54
Das wäre eine Case-Abfrage. Auch möglich, aber ziemlich langsam, wenn du eine längere Kette haben solltest.
Mein Ansatz war der hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure Form1.Timer1Timer(Sender: TObject); begin ShowMessage('1'); Timer1.OnTimer := Timer1Timer2; end;
procedure Form1.Timer1Timer2(Sender: TObject); begin ShowMessage('2'); Timer1.OnTimer := Timer1Timer3; end;
|
Yogu - Do 05.06.08 21:58
Hallo,
erstelle zuerst deine gewünschten OnTimer-Prozeduren, nach diesem Schema:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.OnTimer1(Sender: TObject); begin Timer.OnTimer := OnTimer2; end;
procedure TForm1.OnTimer2(Sender: TObject); begin Timer.OnTimer := OnTimer1; end; |
Vergiss nicht, die Prozeduren im
private-Abschnitt zu deklarieren.
So, und im
FormCreate weist du dem Timer noch die erste Timermethode zu (wie am Ende von der zweiten Prozedur).
Grüße,
Yogu
Wolle92 - Do 05.06.08 22:11
oder nimm eine global (oder in der Form) deklarierte Zählervariable, die du hochzählst, jedesmal im OnTimer...
Und dann kommt in die OnTimer-Procedure ein case...
Find ich persönlich übersichtlicher als zig funktionen in meiner Form stehen zu haben...
Sithlord - Do 05.06.08 22:19
Hallo und danke für eure Antworten !
Ich find eure Lösung gut, aber umständlich.
Ich will damit zufrieden sein, auch wenn es umständlich ist, wenn ich über Hundert Proceduren hinzufügen muss, da ich ja nicht noch 2 Dialoge anzeige sondern viele. Also im fertigen Programm sind das ja nichtmal Dialoge, sondern andere Befehle.
Gibt es da nichts einfacheres ?
Ich meine, sonst nehm ich das !
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.OnTimer1(Sender: TObject); begin Timer.OnTimer := OnTimer2; end;
procedure TForm1.OnTimer2(Sender: TObject); begin Timer.OnTimer := OnTimer1; end; |
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Hidden - Do 05.06.08 22:27
Was willst du denn machen?
Sithlord - Fr 06.06.08 21:14
Das wird ein Game - möchte ich net unbedingt preisgeben !
Ich muss einen String jedes mal nach aktivieren des Teimers um eine bestimmte Zahl erhöhen - aber nicht immer die gleiche !
Deshalb brauche ich sowas ;-)
Und das nicht nur einmal, sondern mindestens 100 Mal für jede Funktion 10 Mal !
Christian S. - Fr 06.06.08 21:16
Dann leg die Zahlen in einem Array ab und speichere den aktuellen Index des Arrays in der Tag-Eigenschaft des Timers. In jedem Timer-Durchlauf erhöhst Du dann den Index.
Aber die Zahlen müssen doch irgendwie berechnbar sein, Du willst doch bestimmt nicht so viele Zahlen eintippen! :shock:
Sithlord - Fr 06.06.08 21:22
Nein - es handelt sich um eine unbestimmte erhöhung oder besser gesagt "ersetzung" der Zahlen durch andere !
Nun - ist dies irgendwie mit weniger Aufwand möglich ?
Sonst wird bei mir alles Unübersichtlich ;-)
Christian S. - Fr 06.06.08 21:29
Was ist an 1 Array und 1 Timer und 1 OnTimer-Event unübersichtlich. :gruebel: Du willst was mit Zahlen und einem Timer machen, die brauchste auf jeden Fall. Um das 1 OnTimer-Event zusätzlich wirste nicht wegbekommen :nixweiss:
Sithlord - Fr 06.06.08 21:33
Ich muss das aber nicht nur einmal machen - sondern bei 10 Timern 10 mal ! Und später noch mehr, das ist ja grade das blöde ;-)
FinnO - Fr 06.06.08 21:35
solange alle 10 Timer das gleiche machen, gibts ja keine Probleme.
Sithlord - Fr 06.06.08 21:36
Eben nicht ;-), leider !
Ich muss alle Timer mit jeweils einem Button separat aktivieren !
Christian S. - Fr 06.06.08 21:40
Hört sich für mich irgendwie an, als hätte Dein Konzept da eine Schwäche.
Insgesamt kann man nur sagen: Lies Dir die Infos durch, die Du uns gegeben hast, und sag uns, wie wir Dir da noch weiter helfen sollen :nixweiss:
FinnO - Fr 06.06.08 21:42
musst du denn alles mit Timern Bewegen?
Sithlord - Fr 06.06.08 21:45
ja, weil es erst nach einer gewissen Zeit passieren darf !
Yogu - Fr 06.06.08 21:56
Hallo,
ich glaube, ich verstehe langsam. Du willst ein Spiel programmieren, bei dem es mehrere Buttons gibt. Wenn der User auf einen von ihnen klickt, wird eine Aktion
nach einer bestimmten Zeit ausgeführt.
Jetzt ein paar Fragen:
- Wie ist diese Zeit definiert? Ist sie zufällig? Für jeden Button unterschiedlich, aber konstant? Oder ist sie einstellbar? Gibt es noch andere Faktoren?
- Was passiert, wenn die Zeit abgelaufen ist? Kann man diese Aktion auch irgendwie berechnen?
Vielleicht können wir dir dann besser helfen.
Grüße,
Yogu
Sithlord - Fr 06.06.08 22:22
1. Wie ist diese Zeit definiert? Ist sie zufällig? Für jeden Button unterschiedlich, aber konstant? Oder ist sie einstellbar? Gibt es noch andere Faktoren?
Die Zeit ist für jeden Timer unterschiedlich - und verlängert sich immer wieder ! Nein, andere Faktoren nicht, es ist nur so, das dieser String verändert werden muss, also string1:='10'; und eben der Timer verändert werden muss !
2. Was passiert, wenn die Zeit abgelaufen ist? Kann man diese Aktion auch irgendwie berechnen?
Nein, diese kann man nicht berechnen.
Wenn die Zeit abgelaufen ist, dann werden die oben genannten Funktionen ausgeführt.
Mfg Sithlord
Sithlord - Sa 28.06.08 21:17
Weiß hier niemand weiter ?
Ist nähmlich nicht ganz unwichtig, gibt es wirklich keine einfachere Methode ?
Hidden - Sa 28.06.08 22:22
Hi,
Geht was genau einfacher? Hast du nochmal ne Kurzversion(3 Sätze so, sollst jetzt nicht alles nochmal schreiben :) )?
'Verlängert sich immer wieder' -> Wenn du diese Verlängerung berechnen willst, kannst du sicher einen Term auf der Basis der 'Interval'-Property des Timers aufstellen, nach der du den neuen Wert berechnest.
mfG,
Sithlord - So 29.06.08 20:28
Ok, mach ich gerne ;-)
Nun, wie schon beschrieben, brauche ich einen Code, welcher mir "Jedes mal beim drücken eines Button" einen Code ausführt. Dieser Code ist aber unterschiedlich.
Weiß da jemand rat ?
Mfg Sithlord
FinnO - So 29.06.08 20:33
bei dem desselben buttons auch ne globale Zählervariable?! ^^
Sithlord - So 29.06.08 20:53
Nein, beim ersten mal jetzt z.b.
und beim zweiten mal
und beim dritten mal
FinnO - So 29.06.08 22:07
ja... globale Zählervariable...
alzaimar - So 29.06.08 22:16
Verwende eine sortierte Liste mit zwei Spalten. In der 1.Spalte steht WANN etwas ausgeführt werden soll und in der 2.Spalte steht dann, WAS ausgeführt wird.
Dann nimmst Du einen einzigen Timer, der z.B. 1x pro Sekunde aufgerufen wird. Der schaut einfach nach, ob das oberste element der eben beschriebenen Liste fällig ist, d.h. abgearbeitet werden muss. Wenn ja, wird die Aktion ausgeführt und die Aktion aus der Liste entfernt.
Um neue Aktionen zu definieren, berechnest du den Zeitpunk und fügst diese Information in die Liste ein.
Fertig.
Ach, und wenn du so ein Geheimnis um dein Programm machst, wie meinst Du, wird man dir richtig helfen können?
hazard999 - Mo 30.06.08 09:10
Nimm einen Timer (genau Einen).
Den stellst du auf die kleinste Zeiteinheit ein die es in deinem Spiel gibt.
Dann nimmst du eine Liste.
Wenn der Benutzer einen Button drückt, fügst du ein Element in die Liste ein (wenn es nur einmal vorkommen darf, dann Suchen und nur bei nicht gefunden einfügen).
Im Timer hast du eine Schleife.
Damit durchläufst du die Liste (am besten rückwärts).
Vergleich ob der Timeout vom Listen-Element erreicht ist.
Dann Aktion durchführen.
Element entfernen.
fertig.
PS: MIST. Schon wieder Seite 2 übersehen.
robo202 - Mo 30.06.08 10:31
Dein hauptproblem ist einfach zu lösen du brauchst nicht 1000 Timer
hier ein Beispiel
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Form1.Timer1Timer(Sender: TObject); var i:integer; begin If i = 1 then showmessage ('1'); If i = 2 then showmessage ('2'); If i = 3 then showmessage ('3'); If i = 4 then showmessage ('4'); If i = 5 then showmessage ('5');
i := i+1; |
huuuuuh - Mo 30.06.08 10:38
eher uneffektiv.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Form1.Timer1Timer(Sender: TObject); var i:integer; begin case i of begin 1: showmessage('1'); ... end; inc(i); end; |
Gausi - Mo 30.06.08 10:38
Also bei dem Code spuckt der Compiler mindestens zwei Warnungen aus, die besagen, dass man da Unsinn gecodet hat. ;-)
hazard999 - Mo 30.06.08 10:39
Schön hingeklopft,
funktioniert nur nicht ;-).
i ist eine lokale Variable.
A kommt mal die Meldung das der Startwert von i nicht definiert ist.
B geht der Wert von i nach dem Durchlauf verloren.
Weiters löst das natürlich nicht das Problem das unterschiedliche Ereignisse unterschiedlich lang dauer um aufzutreten.
huuuuuh - Mo 30.06.08 10:41
wollt doch nur den code von
robo202 verbessern. den vorschlag mit ner glbalen zählvariable hab ich schon in der 1. antwort geschrieben
robo202 - Mo 30.06.08 10:42
dan schreibe i oben unter var rein und definire sie in form creat als 1 dann müsste es klappen
Gausi - Mo 30.06.08 10:46
Ja, "i" als Bezeichner für eine globale Variable zu nehmen, ist eine ganz fantastische Idee. :mrgreen:
Das mit der globalen Zählvariable kam ja auch schon am Anfang. ;-)
hazard999 - Mo 30.06.08 10:51
Globale Variablen sind eine "fantastische" Idee.
Wozu OO wenns strukturiert auch geht... *kopfschüttel*
Hidden - Mo 30.06.08 13:09
Hi,
hazard999 hat folgendes geschrieben: |
Globale Variablen sind eine "fantastische" Idee. |
imho gibt es drei akzeptable Varianten. Zwei davon benötigen eine Feldvariable im Form-Objekt.
Eine Variable global, wie die Formvariable, gelöst in der Unit zu deklarieren, ist imho einfach nur unsauber. Es kann dann das Form-Objekt nicht mehrfach erzeugt werden(was zwar trotzdem selten vorkommt, Klassen sind allerdings eigentlich nicht dazu gedacht, auf eine Instanz limitiert zu werden).
Okay.. Variante eins: mehrere getrennte Prozeduren, die dann jeweils am Ende der jeweiligen Prozedur dem Timer die nächste Prozedur als Ereignis zuweisen. Finde ich unübersichtlich.
Variante2: Eine Case-Abfrage mit Feldvariable und Inc.
Mein Favourit ist Variante3: Ein Array mit Feldvariable und Inc. Entweder Array of Procedure für bessere Übersicht, welche Prozeduren ausgelöst werden oder Array of String, wenn es wirklich um sowas wie ShowMesage mit unterschiedlichen Argumenten geht. Halte ich für das übersichtlichste, da eine lange Case-Abfrage doch nochmal mehr Platz verbraucht.
Bliebe noch zu klären, ob die Prozeduren linear in einer Reihe aufgerufen werden oder auch völlig durchmixt. Wenn sie durchmixt auftreten können eine sortierte Liste: Sortiert nach Aktivierungszeit und dann den Timer immer auf die Kürzeste Zeit stellen und das oberste Element der Liste auslösen.
Zitat: |
Wozu OO wenns strukturiert auch geht... *kopfschüttel* |
Was meinst du genau mit OO? ObjektOrientiert? NullNull wie keine Struktur?
mfG,
hazard999 - Mo 30.06.08 13:16
Ja, Objektorientiert. OO ist eine gängige Abkürzung.
Kommt von object orientation. Im Englischen sind ja 2 Wörter.
Variante 3 ist zu favorisieren, genau meine Meinung.
Array of Procedure ist natürlich eine der schönsten Lösungen.
Der korrekte objektorientierte Ansatz wäre ein factory pattern.
Yogu - Mo 30.06.08 15:05
hazard999 hat folgendes geschrieben: |
Wozu OO wenns strukturiert auch geht... *kopfschüttel* |
hazard999 hat folgendes geschrieben: |
Ja, Objektorientiert. OO ist eine gängige Abkürzung. |
:arrow: "Wozu Objektorientiert, wenn es auch strukturiert geht"
Was ist denn strukturiertes Programmieren? Das ist doch ziemlich deckungsgleich mit einer Objektorientierten Programmierung, oder? Ich denke, eine Feldvariable in der Formularklasse ist strukturiert genug.
hazard999 - Mo 30.06.08 15:47
http://de.wikipedia.org/wiki/Strukturierte_Programmierung
Ist schon ein bisschen ein älterer Ansatz, den älteren Mitglieder hier dürfte das noch durchaus ein Begriff sein.
Globale Variablen sind so ein Relikt aus dieser Zeit.
Und wenn man den Counter Public gesetzt hätte, würde das dazu nicht viel unterschied machen.
OO ist nur ein Konzept. Man muss es auch richtig anwenden.
Jerk - Di 01.07.08 16:39
Sithlord hat folgendes geschrieben: |
Das wird ein Game - möchte ich net unbedingt preisgeben !
Ich muss einen String jedes mal nach aktivieren des Teimers um eine bestimmte Zahl erhöhen - aber nicht immer die gleiche !
Deshalb brauche ich sowas ;-)
Und das nicht nur einmal, sondern mindestens 100 Mal für jede Funktion 10 Mal ! |
Also so wie ich das verstehe meinst du so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var Form1: TForm1; Nachricht : String; Wert : Integer; NeuerWert : Integer; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:= True; NeuerWert := Random(10000) + 1 end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Wert := NeuerWert; Nachricht := 'Was auch immer ' + inttostr(Wert); Timer1.Enabled:=False; end; |
Sithlord - Di 01.07.08 18:20
Nein, tut mir leid, ist es aber nicht ;-)
Ich werde es nochmal erklären ;-)
Habe einen String (als Beispiel mal "wert1") , dieser String soll mit einer Zahl gefüllt werden, aber nicht immer mit der gleichen!
So beim ersten mal als Beispiel "1" und beim zweiten mal "3" und beim dritten mal "40", die Zahlen die ich eingeben möchte, also um die der String verändert werden soll habe ich schon vorgegeben.
Nun muss halt der Timer, nachdem er aktiviert wurde, nacheinander all diese Werte in den String reinschreiben.
Und beim einfügen des letzten strings wird der Button1 dann deaktiviert mit Hilfe des Befehls : button1.enabled:=false;
Mfg Sithlord
Yogu - Di 01.07.08 18:30
Hallo,
noch ein Versuch ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var TimerIndex: Integer;
const TimerValueCount = 6; TimerValues: array[0..TimerValueCount-1] of Integer = (1, 3, 40, 120, 412, 1021);
procedure TForm1.FormCreate(Sender: TObject); begin TimerIndex := 0; end;
procedure TForm1.TimerTimer(Sender: TObject); var S: String; begin S := 'Wert: '+TimerValues[TimerIndex]; inc(TimerIndex);
end; |
Geht das in die richtige Richtung?
Grüße,
Yogu
Jerk - Di 01.07.08 22:12
Hast du dir echt Delphi gekauft um dann mit solchen Problemen an zu kommen :roll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var Step : Integer; Werte : Array[1..3] of Integer; Str : String; ... Step := 0; Werte[1] := 1; Werte[2] := 3; Werte[3] := 40; ... procedure TForm.Timer1Timer(Sender: TObject); begin inc(Step,1); Str := 'WAS AUCH IMMER' + inttostr(Werte[Step]); if Step = 3 then begin Button1.Enabled :=false; Timer1.Enabled :=false; end; end; |
Hidden - Mi 02.07.08 10:26
Hi,
Wie variabel sind denn die ausgeführten Codestücke? Muss eine Methode mit unterschiedlichen Parametern aufgerufen werden oder unterschiedliche Methoden?
Hier mal ein Entwurf für Variable Prozeduren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure DoSomething(aParameter: Integer); begin
end;
procedure DoSomething2(aParameter: Integer); begin
end;
const Prozeduren: Array[0..1] of procedure(aParameter: Integer) of Object = (DoSomething, DoSomething2); Parameter: Array[0..1] of Integer = (5, 723); Zeiten: Array[0..1] of Integer = (1000, 23000); procedure Timer1Timer(Sender: TObject); begin Prozeduren[TimerNr](Parameter[TimerNr]); Inc(TimerNr); Timer1.Interval := Zeiten[TimerNr]; end; |
So, bin mir nich ganz sicher, ob das so geschluckt wird, das Array mit den Prozeduren drin als const zu deklarieren. ansonsten müsste mans halt als var und dann zur Laufzeit belegen. Durch das Array hätte man jedenfalls den Überblick, welche Prozeduren aufgerufen werden.
Yugo hat folgendes geschrieben: |
1, 3, 40, 120, 412, 1021 |
Kann es sein, dass dein Zufallszahlengenerator die Form '2^n +-x' hat? :lol:
mfG,
alzaimar - Mi 02.07.08 11:35
Jerk hat folgendes geschrieben: |
Hast du dir echt Delphi gekauft um dann mit solchen Problemen an zu kommen |
Was soll das denn?
Sithlord - Mi 02.07.08 20:23
Das frage ich mich auch - ich find eure Antworten ganz toll- ehrlich.
Was ich nicht ausstehen kann, ist, wenn immer jemand unsinnige Antworten/Fragen schreibt.
Nicht jeder ist so gut im Programmieren - nur weil hier Delphi - Asse sind, und ich nur ein Halblaie, brauchen die Asse nicht ihre Künste unter die Nase reiben - sorry, empfinde ich aber so ;-)
Tut mir leid - es ist aber so. Ich lerne nur von Online Tutorials - mein kleines Wissen reicht für meine 15 Jahre vollkommen aus...
Ich werde trotzdem das von Jerk mal probieren- danke.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var Step : Integer; Werte : Array[1..3] of Integer; Str : String; ... Step := 0; Werte[1] := 1; Werte[2] := 3; Werte[3] := 40; ... procedure TForm.Timer1Timer(Sender: TObject); begin inc(Step,1); Str := 'WAS AUCH IMMER' + inttostr(Werte[Step]); if Step = 3 then begin Button1.Enabled :=false; Timer1.Enabled :=false; end; end; |
Yogu - Mi 02.07.08 20:57
Jerk: Was ist denn an deinem Quelltext so viel anders als an meinem? Ich denke, es ist besser, die Werte als Konstanten zu deklarieren. Der Rest ist doch jetzt wirklich so ziemlich gleich ...
Jerk - Do 03.07.08 18:00
Ich meinte mit dem obrigen Post das wenn jemand "Anfänger" ist, da schließe ich mich nicht aus, ist evtl das "kaufen" von Delphi 7 Pro SE etwas zu früh. Ich würde lieber zu ner Version raten die Gratis ist...
Mehr wollte ich damit nicht sagen.
Ich entschuldige mich dafür.
@Yogu
Ich dachte nur das die Werte nicht unbedingt konstant sind bei ihm, kann ja sein das sie sich je nach schwierigkeitsgrad oder Level verändern. Außerdem war ja noch die Sache mit dem Button aber im Prinzip sind die Codes so ziemlich identisch von der Funktion.
Sithlord - Do 03.07.08 20:18
Achso - ne, die Version war für mich völlig gratis, das zum GB geschenkt bekommen ^^
Aber du hast recht, ich habe keine festen Werte , bzw. sie lassen sich nicht ermitteln, von daher eine gute Lösung ;-)
Hatte noch keine Zeit zum testen, werde es aber sofort machen ;-)
Mfg Sithlord
Sithlord - Do 03.07.08 20:45
Mhhh, wenn ichs teste kommt der Fehler "identifier redeclared'werte'"
Genauso meldet er Fehler bei "Step:=0;" obwohl dieser ja mit "Step:integer;" gehen müsste ;-)
FinnO - Do 03.07.08 21:00
du musst im Form.Create den Variablen Werte zuweisen
Jerk - Do 03.07.08 21:26
Jo den Timer erstmal mittels Objektinspector auf enabled:= false setzen, dann im z.b. Formcreate wie oben gesagt den Variablen die werte zuweisen, danach kannste dann den Timer starten.
Delphi-Quelltext
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; Step : Integer; Werte : Array[1..3] of Integer; Str : String; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin timer1.enabled:=true; end;
procedure TForm1.FormCreate(Sender: TObject); begin Step := 0; Werte[1] := 1; Werte[2] := 3; Werte[3] := 40; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin inc(Step,1); Str := 'WAS AUCH IMMER' + inttostr(Werte[Step]); button1.caption := str; if Step = 3 then begin Button1.Enabled :=false; Timer1.Enabled :=false; end; end; end. |
Sithlord - Do 03.07.08 21:44
hat geklappt - er verbleibt aber auf der 1 als wert -.-
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TForm1.Timer1Timer(Sender: TObject); var Step : Integer; Werte : Array[1..3] of Integer; Str : String; begin Step := 0; Werte[1] := 1; Werte[2] := 3; Werte[3] := 40; inc(Step,1); Str := '' + inttostr(Werte[Step]); cpu1.Caption:=Str; timer1.Enabled:=false; button2.Enabled:=true; if Step = 3 then begin Button1.Enabled :=false; Timer1.Enabled :=false; end; end; |
egal wie oft ich den Timer starten lasse -.-
Jerk - Do 03.07.08 22:43
is ja auch logisch wenn du am anfang der Prozedur Step immer auf 0 setzt -.-
Guck doch mal wie und wo ich die Variablen deklariert hab und wie du das gemacht hast .
Sithlord - Do 03.07.08 23:14
Oh - ja , sorry, zu spät am Abend heute ;-)
Die Variablen müssen aber so deklariert werden - anders gehts nicht weil ich sie sonst mehrfach bräuchte ;-)
Jerk - Do 03.07.08 23:30
HÄ ?
Wenn du sie ausserhalb der Prozedur, also Global deklarierst wo is dann das Problem ?
Wieso mehrfach? Das is ja der Vorteil von Globalen Variablen - das alle Prozeduren darauf zugreifen können sodass man sich meherere Variablen sparen kann z.b..
Sithlord - Do 03.07.08 23:37
Hallo !
Das liegt daran, das jeder timer mit total unterschiedlichen Werten belegt ist ;-)
Habe nun "nur" den integer "step" global definiert, das heißt für jeden Timer einen "step", sprich, für timer1 "step" ,für timer2 "step2" und so weiter ;-)
Dann habe ich in Formcreate alle auf 0 gesetzt und nun gehts - danke ;-)
Vielen, vielen dank ;-)
Jerk - Do 03.07.08 23:44
Kannst du trotzdem Global machen, z.b. mit nem Mehrdimensionalem Array.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var Werte : Array[1..5,1..3] of Integer; ... Werte[1,1]:=1; Werte[1,2]:=3; Werte[1,3]:=40;
Werte[2,1]:=2; Werte[2,2]:=6; Werte[2,3]:=80; ... |
Global hat den Vorteil das sich die Werte auch noch ändern lassen von außerhalb der Prozedur.
Hidden - Fr 04.07.08 10:46
Jerk hat folgendes geschrieben: |
Kannst du trotzdem Global machen, z.b. mit nem Mehrdimensionalem Array. |
Jap. Und Step auch als Array dann.. für jeden Timer eines.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| const TimerCount = 256; type TForm1 = class(TForm) ... private FWerte: Array[0..TimerCount - 1, 0..WerteProTimer - 1] of Integer; FSteps: Array[0..TimerCount - 1] of Integer; public ... end; |
Edit: Wenn du in der Timerprozedur an die Timernummer ran willst, musst du jedem Timer erst über die Eigenschaft 'Tag' eine Nummer geben.
mfG,
Yogu - Fr 04.07.08 15:22
Hidden hat folgendes geschrieben: |
Und Step auch als Array dann.. für jeden Timer eines. [...] Wenn du in der Timerprozedur an die Timernummer ran willst, musst du jedem Timer erst über die Eigenschaft 'Tag' eine Nummer geben. |
Warum nicht gleich den
Step in der
Tag-Eigenschaft des Timers speichern? ;)
ZeitGeist87 - Fr 04.07.08 15:30
Also beim Durchlesen wird man hier nich schlau!
Was bitte möchtest du GENAU??
GTA-Place - Fr 04.07.08 16:07
Also für mich klingt das nach nem "Browsergame". Jedes mal wenn die Zeit zum Bau eines Objektes abgeschlossen ist, müssen ja neue Werte für Geld und Bauzeit gesetzt werden und eventuell weitere Objekte freigeschaltet werden.
Aber hier liegt eindeutig ein Strukturfehler vor. Browsergames, z.B. OGame, verwenden nicht zufällige Zahlen oder Ähnliches. Die Werte basieren auf Formeln und OGame hat diese sogar veröffentlicht.
Wenn es also um ein "Browsergame" geht, musst du das Konzept nochmal überdenken, so kommen wir nämlich nicht weiter.
Hidden - Fr 04.07.08 17:37
Hi,
imho ist die Sache bei so vielen Timern absolut klar: Eine nach Zeiten sortierte Liste mit einem Timer, der auf das oberste Element der Liste gestellt ist.
Edit: Ansonsten möchte ich dem Threadsteller doch noch einmal deutlich raten, mehr auszuspucken! Wir wollen ganz bestimmt keine wichtigen Infos abfischen, uns hier aber lange diskutieren und raten zu lassen, damit wir dir helfen können, ist allerdings langsam definitiv zu Ende ;) .
Du hast hier eindeutig den falschen Ansatz, wir können dich da sehr gut beraten und sind auch weiter bereit dazu.
Eine Sache noch: Mit einem sehr frühen Programm wirst du -zumal als Privatmensch - sehr wahrscheinlich nicht viel Geld verdienen können. Du brauchst also sicher keine Angst zu haben, dass wir dir etwas klauen ;) .
Oder geht es um ein Firmenprojekt und du willst nicht, dass dich jemand mit deinem Pseudonym in Verbindung bringt - dass jemand erfährt, dass du dir Hilfe geholt hast? Auf PM lösche ich diese Vermutung wieder ;)
mfG,
Sithlord - Fr 04.07.08 20:23
Nein, mir gehts um kein Firmenprojekt.
Ums Geldverdienen geht es mir auch nicht ;-)
Es ist einfach eine Freeware, die halt noch in den Kinderschuhen steckt.
Wie schon erraten, es geht um eine Art Browsergame - halt nicht im Browser, sondern als Programm auf dem PC.
Soweit ist aber schon alles geklärt, es funktioniert alles so wie es soll.
Es ist ein Browsergame basierend auf
http://www.unitedhacker.eu .
Man muss sich einen PC aufbauen und dann halt andere PCs angreifen/deren Entwicklungsstufe runterstufen ;-)
Dazu kommt später dann ein Online Interface, welches auf PhP basiert.
Das Programm schreibt eine Textdatei mit allen Werten (Aktueller Prozessor, usw. ) Dann kann ein anderer Benutzer, der das Programm auch hat - und besser gerüstet ist, den PC angreifen und eben halt runterstufen, von 3000 Mhz CPU auf 1000 Mhz CPU ;-)
Mehr erzähle ich nicht, da es sonst zu umfangreich wird.
Falls sich jemand findet, der mir so ein PhP Modul schreibt - wäre für mich auch noch mal viel Arbeit, würde ich mich freuen, ihn im Programm nennen und seine Homepage verlinken.
Für Ideen, Anregungen und Kritik bin ich immer bereit ;-)
Mfg Sithlord
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!