Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 22.04.04 11:24 
Hallo,
ich habe ein problem, mit dem erstellen von componenten in einer eigenen classe:

ausblenden 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;  

// Das ist das Problem, das ereignis wird leider nicht ausgeführt, warum weiß ich nicht
  Zeitgeber:=TDXTimer.Create(Zeitgeber);
  Zeitgeber.OnTimer:=DXTimerTimer; Zeitgeber.Interval:=0;
end;

constructor TGame.Create(F:TForm);
begin
  Create_Component(f); // erstellt die standart classen
end;


warum geht dieser code nicht....

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:
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:
{

  Autor: Michael Springwald
  Erstellt am: 19.04.2004
  Upgedatet am: 19.04.2004

}

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
    
//    procedure DrawGame;

  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; //Draw.C

  ListImage:=TDXImageList.Create(ListImage);
  ListImage.DXDraw:=Draw;  

  Zeitgeber:=TDXTimer.Create(Zeitgeber);
  Zeitgeber.OnTimer:=DXTimerTimer; Zeitgeber.Interval:=0;
 // Zeitgeber.TimerRun;
end;

constructor TGame.Create(F:TForm);
begin
  Create_Component(f); // erstellt die standart classen
end;

procedure TGame.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin

// Showmessage('TEST');
//  if Draw.CanDraw = True then begin
    Draw.Surface.Fill(clYellow);
    Draw.Flip;
//  end;
end;


end.

///////////////////////////////die form unit//////////////////////////////////////////

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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 103

Alle Win´s
D5 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Do 22.04.04 15:36 
@Da_Knuddelbaer

ausblenden Delphi-Quelltext
1:
Zeitgeber.OnTimer:=DXTimerTimer;					


tut er! :twisted:
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: Do 22.04.04 17:03 
Stimmt, glatt übersehen :lol: sry
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Do 22.04.04 17:35 
ausblenden 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.
ausblenden Delphi-Quelltext
1:
TGame = class(TComponent)					

Ist TGame eine Komponente? Nach deinem Code zu urteilen wohl eher eine Klasse:
ausblenden Delphi-Quelltext
1:
TGame = class					

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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...."