Autor Beitrag
TRUCKERm
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  var
  Timer: array[0..150..15of 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
// BOOM
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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 03.02.2011 um 17:06
Crombo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54
Erhaltene Danke: 8

Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
BeitragVerfasst: Do 03.02.11 15:30 
Hallo,

im type-Abschnitt deiner Form
ausblenden Delphi-Quelltext
1:
MyTimer: TTimer;					


im Konstruktor
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 03.02.11 15:40 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167
Erhaltene Danke: 2



BeitragVerfasst: Do 03.02.11 15:47 
Klar geht das

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
Timer: array[0..150..15of 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;
      // alles was noch deklariert werden soll
    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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Do 03.02.11 16:15 
user profile iconsomebody hat dir doch schon einen Quellcode aufgeschrieben. Dort ist das Array of TTimer, welches dir deine ganzen Timer zur Verfügung stellen. user profile iconCrombo 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167
Erhaltene Danke: 2



BeitragVerfasst: 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: user profile iconWebo war schneller... :D

Für diesen Beitrag haben gedankt: TRUCKERm
TRUCKERm Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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":

ausblenden volle Höhe 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..150..15of TImage;
  Block: array[0..15,0..15of Integer;
  Rock: array[0..150..15of TImage;
  Bomb: array[0..150..15of TImage;
  BTimer: array[0..150..15of TTimer;
  PlI: array[1..4of TImage;
  PlX: array[1..4of integer;
  PlY: array[1..4of 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
// Was kommt hier rein?

end;
end;
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 03.02.11 16:33 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Crombo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54
Erhaltene Danke: 8

Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 03.02.11 18:04 
@Nersgatt

Der Überlauf macht aber nichts bei Subtrahieren von Cardinals...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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