| Autor |
Beitrag |
TRUCKERm
Hält's aus hier
Beiträge: 9
|
Verfasst: Do 03.02.11 15:16
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
      
Beiträge: 54
Erhaltene Danke: 8
Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
|
Verfasst: Do 03.02.11 15:30
Hallo,
im type-Abschnitt deiner Form
Delphi-Quelltext
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
_________________ one day your life will flash before your eyes. make sure it's worth watching
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
TRUCKERm 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 167
Erhaltene Danke: 2
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
TRUCKERm 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: 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.
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
somebody
      
Beiträge: 167
Erhaltene Danke: 2
|
Verfasst: 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... 
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
TRUCKERm 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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":
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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....
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Für diesen Beitrag haben gedankt: TRUCKERm
|
|
TRUCKERm 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 03.02.11 16:33
Genauso wie Bummi es sagt.
Und dabei noch darauf achten, dass der TickCount überlaufen kann. Nur als ergänzenden Hinweis.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Crombo
      
Beiträge: 54
Erhaltene Danke: 8
Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
|
Verfasst: 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
_________________ one day your life will flash before your eyes. make sure it's worth watching
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|