Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Timer in Form erstellen, On Timer?
TRUCKERm - Do 03.02.11 15:16
Titel: Timer in Form erstellen, On Timer?
Wie kann man einen Timer mit hilfe von Code erstellen und damit dann eine Prozedur ausführen?
Mein Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Timer: array[0..15, 0..15] of TTimer;
Timer[Plx[Pl],Ply[Pl]].Create(self); with TTimer.Create(Self) do begin Interval := 3000; Enabled := true;
end; end; procedure Tform1.Detonate(x,y:integer); begin end; |
Folgender Fehler tritt auf:
[Error] Unit1.pas(252): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
Wie kann ich das jetzt hinkriegen das beim auslaufen des timers er die Funktion Detonate ausführt?
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 03.02.2011 um 17:06
Crombo - Do 03.02.11 15:30
Hallo,
im type-Abschnitt deiner Form
im Konstruktor
Delphi-Quelltext
1: 2: 3:
| Self.MyTimer := TTimer.Create(Self); Self.MyTimer.Parent := Self; Self.MyTimer.OnTimer := MeinTimerEreignis; |
Das TimerEreignis muss die gleiche Signatur wie das OnTimer-Event von TTimer haben.
Crombo
TRUCKERm - Do 03.02.11 15:40
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Aber ich brauche 256 timer (16*16) deswegen das 2D array.
Geht das wenn ich nur ein Timer bei Type definiere?
somebody - Do 03.02.11 15:47
Klar geht das
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var Timer: array[0..15, 0..15] of TTimer; n, i: integer;
for n := 0 to 15 do begin for i := 0 to 15 do begin Timer[n,i] := TTimer.Create(Self);
with Timer[n,i] do begin Parent := Form1; end; end; end; |
Allerdings würde ich das Array nicht Timer nennen, weil es dann zu Redefinierungen kommen kann, da Delphi auch den namen Timer verwendet.
Ein Name wie MyTimer(Siehe Crombo) ist schon besser.
TRUCKERm - Do 03.02.11 16:08
Irgendwie kriege ich das mit der Programmierung nicht richtig hin...Fehler überall.
Könnte mir jemand den Quellcode aufschreiben?
Also den Code bei type, de Array deklination, den Constructor code und den Teil wo ich beim auslaufen des Timers meine Funktion ausführen kann?
Nersgatt - Do 03.02.11 16:13
Du müsstest uns schon sagen, was für Fehlermeldungen Du bekommst.
Aber: 256 Timer? Das geht nie gut und liefert nicht das, was Du erwartest. Erzähl doch mal, was Du vor hast. Ich bin sicher, dass es andere (bessere) Lösungen für Dein Problem gibt.
Webo - Do 03.02.11 16:15
somebody hat dir doch schon einen Quellcode aufgeschrieben. Dort ist das Array of TTimer, welches dir deine ganzen Timer zur Verfügung stellen.
Crombo hat dir gezeigt, wie du einem zur Laufzeit erstellen Timer Eigenschaften zuweist. Jetzt musst du beides verbinden. Jeder der Timer aus dem Array muss seine Eigenschaften bestimmt bekommen, was du in der Schleife, in der die Timer erstellt werden (siehe somebody's Code) machst.
Zu deinen Fehlermeldungen ... wenn du uns nicht zeigst, wie das bei dir aussieht, kann man auch nicht sagen was falsch ist. Und nur durch Copy & Paste lernt man nichts. Also wäre es besser, wenn du es auch verstehst und nicht einfach die Lösung geliefert bekommst.
somebody - Do 03.02.11 16:15
Was kommen denn für fehler?
Also die Array Deklaration hast du ja selber schon ganz passend(ich seh zunmindest keinen fehler) diese steht auch glechzeitig bei Type drin. Das waren dann auch schon die ersten beiden Punkte.
Das was in den Constructor rein kommt habe ich ebend schon geschrieben(der teil ab der for schleife).
Wäre ganz passend, wenn du mal sagst, was denn für Fehler kommen und wo die kommen. Dann ist das mit der Hilfe deutlich einfacher. Einfach zu sagen da geht nichts mehr mag ja sein, aber zum helfen eher bedingt vorteilhaft ;)
EDIT:
Webo war schneller... :D
TRUCKERm - Do 03.02.11 16:25
Ich versuche das Spiel "Bomberman" zu programmieren und bin an dem Punkt, wo ich nach dem Platzieren der Bomben 3 Sekunden warten möchte bevor die Detonation eintritt.
Wenn die Prozedur "Detonate" dann ausgeführt wird sollen die koordinaten der Bombe übermittelt werden.
Ich will für jedes Feld einen Timer (Das spielfeld ist 16*16 groß) da man ja mehrere Bomben gleichzeitig haben kann aber einen Timer nur einmal laufen lassen kann (glaube ich...).
Es müssen ja nicht ALLE timer des Spiels gleichzeitig aktiv sein, sondern 1-20 maximal...
Jedenfalls habe ich nicht wirklich viel Ahnung von Konstruktoren & co. und bitte auch das zu Entschuldigen.
Ich platziere den Code Falsch und nichts funktioniert....Es wäre nett wenn mir jemand einfach genau sagen würde was wo hinkommt (wurde schon gesagt, weis ich, aber verstanden hab ichs trotzdem nicht)
Hier die Funktion "PlaceBomb":
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:
| var JPG1,JPG2,JPG3,BombI,JPGp1,JPGp2,JPGp3,JPGp4 : TJPEGImage; Cord: array[0..15, 0..15] of TImage; Block: array[0..15,0..15] of Integer; Rock: array[0..15, 0..15] of TImage; Bomb: array[0..15, 0..15] of TImage; BTimer: array[0..15, 0..15] of TTimer; PlI: array[1..4] of TImage; PlX: array[1..4] of integer; PlY: array[1..4] of integer; Form1: TForm1;
procedure Tform1.PlaceBomb(Pl:integer); begin Block[Plx[Pl],Ply[Pl]]:=3; Bomb[Plx[Pl],Ply[Pl]]:=TImage.Create(self); Bomb[Plx[Pl],Ply[Pl]].Height:=50; Bomb[Plx[Pl],Ply[Pl]].Width:=50; Bomb[Plx[Pl],Ply[Pl]].Left:=Plx[Pl]*50; Bomb[Plx[Pl],Ply[Pl]].Top:=Ply[Pl]*50; Bomb[Plx[Pl],Ply[Pl]].Parent:=Self; Bomb[Plx[Pl],Ply[Pl]].Show; Bomb[Plx[Pl],Ply[Pl]].Picture.Bitmap.Assign(BombI); PlI[1].BringToFront; PlI[2].BringToFront; PlI[3].BringToFront; PlI[4].BringToFront;
BTimer[Plx[Pl],Ply[Pl]].Create(self); with TTimer.Create(Self) do begin
end; end; |
bummi - Do 03.02.11 16:29
Dann brauchst du genau einen Timer und in den Bomben ein Tickcount wann sie gelegt wurde, im Timer läufst Du über Dein Bombenarray (besser ObjektListe) und ziehst von GetTickCount das Tickcount der Bombe ab wenn >= 3000 dann explodieren lassen....
TRUCKERm - Do 03.02.11 16:33
bummi hat folgendes geschrieben : |
| Dann brauchst du genau einen Timer und in den Bomben ein Tickcount wann sie gelegt wurde, im Timer läufst Du über Dein Bombenarray (besser ObjektListe) und ziehst von GetTickCount das Tickcount der Bombe ab wenn >= 3000 dann explodieren lassen.... |
Stimmt....Danke!
Nersgatt - Do 03.02.11 16:33
Genauso wie Bummi es sagt. :zustimm:
Und dabei noch darauf achten, dass der TickCount überlaufen kann. Nur als ergänzenden Hinweis.
Crombo - Do 03.02.11 17:05
Hallo,
du könntest die Überprüfung, ob eine Bombe explodieren soll, auch in deine Prozedure schreiben, in der du die Leute bewegst.
Crombo
bummi - Do 03.02.11 18:04
@Nersgatt
Der Überlauf macht aber nichts bei Subtrahieren von Cardinals...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var TC,TC2:Cardinal; i:Integer; begin TC := 4294967000; TC2 := TC + 100; For i := 1 to 10 do begin Memo1.Lines.Add(IntToStr(TC) + ' - ' + IntToStr(TC2) +' >> '+ IntToStr(TC2 - TC)); TC := TC +100; TC2 := TC2 +100; end; end; |
elundril - Do 03.02.11 19:14
Warum speichert ihr den TickCount? Könntet ihr nicht auch einfach bei jeder Bombe nen Wert >0 speichern und dann jede Sekunde 1 davon abziehen? Wenn = 0 dann macht die Bombe "bumm"! Dadurch könnte man auch Bomben mit variabler Lebensdauer erzeugen, da diese nicht mehr von außen vorgegeben wird, sondern jede Bombe die Lebensdauer selbst speichert.
lg elundril
bummi - Do 03.02.11 19:35
Viele Wege führen nach Rom, man könnte auch die Uhrzeit hinterlegen zu der die Bombe explodieren soll,etc.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!