Autor |
Beitrag |
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 22.04.04 11:24
Hallo,
ich habe ein problem, mit dem erstellen von componenten in einer eigenen classe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TGame.Create_Component(F1:TForm); begin Draw:=TDXDraw.Create(F1); Draw.AutoInitialize:=True; Draw.Height:=480; Draw.Width:=640; Draw.Left:=0; Draw.Top:=0; Draw.Parent:=F1;
ListImage:=TDXImageList.Create(ListImage); ListImage.DXDraw:=Draw;
Zeitgeber:=TDXTimer.Create(Zeitgeber); Zeitgeber.OnTimer:=DXTimerTimer; Zeitgeber.Interval:=0; end;
constructor TGame.Create(F:TForm); begin Create_Component(f); end; |
warum geht dieser code nicht....
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: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| unit gameunit;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DXDraws, DXClass, StdCtrls, AppEvnts, jpeg, ExtCtrls;
type TGame = class(TComponent) Zeitgeber: TDXTimer; ListImage:TDXImageList; Draw:TDXDraw; constructor Create(F:TForm); procedure Create_Component(F1:TForm); procedure DXTimerTimer(Sender: TObject; LagCount: Integer); public
end;
implementation
procedure TGame.Create_Component(F1:TForm); begin Draw:=TDXDraw.Create(F1); Draw.AutoInitialize:=True; Draw.Height:=480; Draw.Width:=640; Draw.Left:=0; Draw.Top:=0; Draw.Parent:=F1; ListImage:=TDXImageList.Create(ListImage); ListImage.DXDraw:=Draw;
Zeitgeber:=TDXTimer.Create(Zeitgeber); Zeitgeber.OnTimer:=DXTimerTimer; Zeitgeber.Interval:=0; end;
constructor TGame.Create(F:TForm); begin Create_Component(f); end;
procedure TGame.DXTimerTimer(Sender: TObject; LagCount: Integer); begin
Draw.Surface.Fill(clYellow); Draw.Flip; end;
end.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DXDraws, DXClass,gameunit;
type TForm1 = class(TForm) Panel1: TPanel; procedure FormActivate(Sender: TObject); private public end;
var Form1: TForm1; Game:TGame; implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject); begin Game:=TGame.Create(form1); end;
end. |
das ist der gesammte code...
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
iGoA
Beiträge: 103
Alle Win´s
D5 Prof
|
Verfasst: Do 22.04.04 11:45
1. Ich glaube, TDXTimer hat ne Eigenschaft "active" o.ä. Die musst Du auf TRUE setzen, damit er loslegt.
2. Wenn Du´s eh im OnCreate machst, warum ziehst Du dann nicht einfach gleich nen DXTimer "normal" aufs Form?
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 22.04.04 13:07
alles ist auf true ich möchte nunmal alle componenten zur laufzeit erstellen...... und das geht evlt. hat die componente auch einen bug, weil ich habe solche hinweise im qullcode gefunden.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Da_Knuddelbaer
Beiträge: 485
|
Verfasst: Do 22.04.04 14:50
Mir schient du hast vergessen, dem zur Laufzeit erstellten Timer auch eine Prozedur zuzuweisen. Nur weil du eine Prozedur hast, heißt das ja nicht, dass der Timer diese Prozedur aufruft. Versuch einfach mal, dem Timer diese Prozedur zuzuweisen, dann sollte es gehen.
Greetz,
Knuddelbaer
|
|
Simon Joker
Beiträge: 236
Erhaltene Danke: 1
|
Verfasst: Do 22.04.04 15:34
Hi Mimi
Ein Blick auf die Eigenschaften des Timer nach der Erstellung zeigt, das er nicht Initialisiert wurde! Also schalte ihn ab und wieder an. Das löst das Problem.
Die AutoInitialisierung funktioniert nur, wenn die Componente schon existiert, wenn die Create des Formulars beendet wird. Den die Initialisierung wird nur und der Loaded-Methode aufgerufen und wenn der Timer Enabled wird.
Cu Simon
|
|
Simon Joker
Beiträge: 236
Erhaltene Danke: 1
|
Verfasst: Do 22.04.04 15:36
@Da_Knuddelbaer
Delphi-Quelltext 1:
| Zeitgeber.OnTimer:=DXTimerTimer; |
tut er!
|
|
Da_Knuddelbaer
Beiträge: 485
|
Verfasst: Do 22.04.04 17:03
Stimmt, glatt übersehen sry
|
|
Nightmare_82
Beiträge: 260
|
Verfasst: Do 22.04.04 17:35
Delphi-Quelltext 1: 2: 3:
| ListImage:=TDXImageList.Create(ListImage); ListImage.DXDraw:=Draw; Zeitgeber:=TDXTimer.Create(Zeitgeber); |
Musst du da nicht als Parameter den Owner, also die Form übergeben?
Und 2.
Delphi-Quelltext 1:
| TGame = class(TComponent) |
Ist TGame eine Komponente? Nach deinem Code zu urteilen wohl eher eine Klasse:
Delphi-Quelltext
denn du fügst die Komponente ja nicht der Form hinzu.
Wenn du die beiden Sachen änderst sollte es gehen.(wobei du das 2. auch so lassen kannst, es macht nur in dem Fall keinen Sinn)
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 22.04.04 21:03
hatte ich schon, das währe ja in meinen fall F1, aber es geht auch nicht,
und ich hatte auch schon TGAME = CLASS und es ging auch nicht...
ich dachte das ich irgenwas falsch gemacht hätte bei meiner classe..... aber ich glaube die komponente hat einen bug die ich verwende, das ist wie gesagt delphiX.... ich werde morgen mal den bug verdach euch vorstellen... ich habe z.z. den qullcode nicht zur hand !
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|