Entwickler-Ecke

Sonstiges (Delphi) - JvDice rotieren lassen


FiceGoesDelphi - Do 05.07.07 15:10
Titel: JvDice rotieren lassen
Hallöchen ;)

Ich hoffe ich habe das richtige Thema getroffen *gg*
Ich würde gerne meine JvDice Komponenten rotieren lassen.
Soweit so gut.. es gibt nen "Rotate (boolean)" und nen "AutoStopInterval (Cardinal)"
Aber aus irgendwelchen Gründen, stürzt das Programm IMMER ab, wenn ich ein Rotieren stopen will! :oops:


Delphi-Quelltext
1:
2:
       jvDice1.AutoStopInterval := 10;
       JvDice1.Rotate := True;


So zum Bleistift ;)
Warum das so ist, weiß ich nicht! Wenn ich in dem Objektinspektor "Rotate" auf "True" setzen will,
stürzt mir sogar Delphi ab!
Kann mir irgendeiner helfen :?!?:

LG,


ZeitGeist87 - Do 05.07.07 15:47

Ähm :)

Probiers mal JvDice.Rotate:= false;

LG
Stefan


FiceGoesDelphi - Do 05.07.07 15:49

Könnte ich vllt schon ausprobiert haben oder? ;)

.. Der Nächste bitte ..

:tongue:


ZeitGeist87 - Do 05.07.07 15:51

Start mal Rechner neu :)

Ich hatte diesen Würfel auch schon, hatte allerdings keine Probleme damit..


FiceGoesDelphi - Do 05.07.07 15:52

Wie wärs, wenn du mir dann mal den Code, welchen du damals benutzt hast, zukommen lässt? ;)
Auf Buttonclick soll der bzw die 4 Würfel rotiert werden.


ZeitGeist87 - Do 05.07.07 15:57

Wir verwenden in der Arbeit keinerlei Fremdkomponenten :)
entwickeln alles selber...

Du könntest aber deinen Monitor rotieren lassen..geht auch mit delphi :P

Hmm..drück doch mal F1..oder geht das nicht?
Ich mein deine Tastatur war schon teuer genug.. :wink:

LG
Stefan


FiceGoesDelphi - Do 05.07.07 16:01

Natürlich kann ich F1 drücken ;)
Ich kann sogar F2 drücken! Und jetzt kommts .... F4 funktioniert auch :P

1. Meine Tasta ist zuhause zum zocken! Nicht auf der Arbeit :P
2. JV-Komponenten sind in der OH glaube ich nicht zu finden oder? bzw JvDice aufjedenfall nicht!
3. HAHAHA -.-


ZeitGeist87 - Do 05.07.07 16:07

user profile iconFiceGoesDelphi hat folgendes geschrieben:
Natürlich kann ich F1 drücken ;)
Ich kann sogar F2 drücken! Und jetzt kommts .... F4 funktioniert auch :P


F3 haste nicht oda :)

Hmm..dachte immer, dass die auch dokumentiert sind..
Aber warum um alles in der Welt, benötigst du in der ARBEIT einen Würfel?

Ist euch in der Bank so langweilig?
Oder müssen die Kunden, die einen Kredit haben wollen würfeln? :P

Naja..ich schau in ner Stunde mal daheim nach ok?


FiceGoesDelphi - Do 05.07.07 16:09

Ich habs :D


Delphi-Quelltext
1:
       JvDice1.Throw;                    


War eigentlich ganz einfach oder? :tongue:

kann somit Closed werden :)
Thx an alle die mir nicht helfen konnten :rofl:


ZeitGeist87 - Do 05.07.07 16:13

user profile iconFiceGoesDelphi hat folgendes geschrieben:
Ich habs :D


Delphi-Quelltext
1:
       JvDice1.Throw;                    


War eigentlich ganz einfach oder? :tongue:

kann somit Closed werden :)
Thx an alle die mir nicht helfen konnten :rofl:


Hast du das jetzt alles allein rausgefunden?
Björn!
Bin stolz :P


FiceGoesDelphi - Mo 09.07.07 08:21

Ich hab nen neues/altes Problem...

Ich möchte nun vor dem "Throw" den Würfel rotieren lassen!
Ich habe nun folgenden Code geschrieben:


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:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   Range : 1111..9999;
   Text : Integer;
 begin
     Range := 9999;
     Randomize;
     Text:= Random(Range);
     if Text < 1000 then
     begin
       Text := Text + 1000;
       Edit1.Text := IntToStr(Text);
       JvDice1.Rotate := True;
       JvDice2.Rotate := True;
       JvDice3.Rotate := True;
       JvDice4.Rotate := True;
       Timer1.Enabled:= true;
     end
     else
     begin
       Edit1.Text := IntToStr(Text);
       JvDice1.Rotate := True;
       JvDice2.Rotate := True;
       JvDice3.Rotate := True;
       JvDice4.Rotate := True;
       Timer1.Enabled:= true;
     end;
   end;

procedure TForm1.FormShow(Sender: TObject);
var
   Range : 1111..9999;
   Text : Integer;
 begin
     Range := 9999;
     Randomize;
     Text:= Random(Range);
     if Text < 1000 then
     begin
      Text := Text + 1000;
      Edit1.Text := IntToStr(Text);
     end
     else
       JvDice1.Throw;
       JvDice2.Throw;
       JvDice3.Throw;
       JvDice4.Throw;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  JvDice1.rotate := false;
  JvDice2.rotate := false;
  JvDice3.rotate := false;
  JvDice4.rotate := false;
end;


Ich weiß... ich könnte nun alles wesentlich kürzer fassen..
Ich hab nen bestehenden Code nehmen sollen und ihn einfach auf Delphi2006 umschreiben sollen.
Mein Problem ist auch einfach nur, dass das Programm zwar nach Buttonclick wunderbar die Würfel rotieren lässt und dann auch wieder anhält, ABER dann auch abstürzt!
Ich verzweifle langsam :(
Liegts an fehlerhaften JV-Kompos!?
Oder habe ich mir da selber eine Grube gegraben?!

LG,


ZeitGeist87 - Mo 09.07.07 14:09

user profile iconFiceGoesDelphi hat folgendes geschrieben:
Ich hab nen neues/altes Problem...

Ich möchte nun vor dem "Throw" den Würfel rotieren lassen!
Ich habe nun folgenden Code geschrieben:


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:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   Range : 1111..9999;
   Text : Integer;
 begin
     Range := 9999;
     Randomize;
     Text:= Random(Range);
     if Text < 1000 then
     begin
       Text := Text + 1000;
       Edit1.Text := IntToStr(Text);
       JvDice1.Rotate := True;
       JvDice2.Rotate := True;
       JvDice3.Rotate := True;
       JvDice4.Rotate := True;
       Timer1.Enabled:= true;
     end
     else
     begin
       Edit1.Text := IntToStr(Text);
       JvDice1.Rotate := True;
       JvDice2.Rotate := True;
       JvDice3.Rotate := True;
       JvDice4.Rotate := True;
       Timer1.Enabled:= true;
     end;
   end;

procedure TForm1.FormShow(Sender: TObject);
var
   Range : 1111..9999;
   Text : Integer;
 begin
     Range := 9999;
     Randomize;
     Text:= Random(Range);
     if Text < 1000 then
     begin
      Text := Text + 1000;
      Edit1.Text := IntToStr(Text);
     end
     else
     begin
       JvDice1.Throw;
       JvDice2.Throw;
       JvDice3.Throw;
       JvDice4.Throw;
     end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  JvDice1.rotate := false;
  JvDice2.rotate := false;
  JvDice3.rotate := false;
  JvDice4.rotate := false;
end;


Ich weiß... ich könnte nun alles wesentlich kürzer fassen..
Ich hab nen bestehenden Code nehmen sollen und ihn einfach auf Delphi2006 umschreiben sollen.
Mein Problem ist auch einfach nur, dass das Programm zwar nach Buttonclick wunderbar die Würfel rotieren lässt und dann auch wieder anhält, ABER dann auch abstürzt!
Ich verzweifle langsam :(
Liegts an fehlerhaften JV-Kompos!?
Oder habe ich mir da selber eine Grube gegraben?!

LG,


Was bewirkt dieses .Throw?


FiceGoesDelphi - Mo 09.07.07 14:15

.Throw bewirkt ein einfaches "verändern" der Augenanzahl des Würfels!
Ein .Rotate := True lässt den Würfel rotieren.
Durch den Timer lasse ich den Würfel kurz rotieren und stoppe ihn dann
kurze Zeit später wieder mit dem 2. Timer.
Das funktioniert auch soweit ganz gut!
Nur das Programm stürzt nach dem False ab...
Wenn ich im Objektinspektor den Wert auf True setze und danach wieder auf
False stürzt sogar Delphi komplett ab :(
Ich will doch nur den Würfel rotieren lassen bevor er mir eine neue
Augenzahl anzeigt!
*verzweifel*


ZeitGeist87 - Mo 09.07.07 14:33

Wie wo 2. Timer?

Leg n neues Projekt an,
Tu einen Würfel drauf, und mach das Gleiche wie in dem Programm!

Spiel bissl rum..
Ich installier die Jedis dann mal und helf dir ausführlich

LG
Stefan


FiceGoesDelphi - Mo 09.07.07 14:37

Achso.. sehe gerade ich hab vor dem weiteren rumspielen hier gepostet!
Dann kommt nachher mal der Atkuelle Code.
Hab überflüssiges rausgenommen und das Starten und Stoppen jeweils in unterschiedliche
Timer gepackt!
Funktioniert nicht!
Hab auch schon ein neues Formular genommen und 1 Würfel draufgepackt, dann 2 Button
(Starten und Stoppen) genommen und nur ein := True und := False genommen!
Stürzt trotzdem ab!
Bevor du das ausprobierst, speichere bitte alles ab, was wichtig ist!
Nicht das dir da was verloren geht!
Und danke für deine Hilfe ;)


ZeitGeist87 - Mo 09.07.07 14:39

user profile iconFiceGoesDelphi hat folgendes geschrieben:

Bevor du das ausprobierst, speichere bitte alles ab, was wichtig ist!
Nicht das dir da was verloren geht!
Und danke für deine Hilfe ;)


Speichern ist mein 2. Vorname :wink:

Nichts zu danken Björn..das weißt du


Dunkel - Mo 09.07.07 14:46

Hallo!

Ich hab' mir das Problem mal angeguckt und die entsprechende Klasse grob überflogen.

Folgendes in JVDice.pas ändern, dann funktioniert zumindest das Rotieren aus dem Quellcode heraus; Zuweisung im OI lässt immer noch Delphi abstürzen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TJvDice.TimerFires(Sender: TObject);
var
  Now: Longint;
begin
  NewRandomValue;
  if not FRotate then
  begin
    FTimer.Enabled:= False;   /// neu hinzufügen !
//    FTimer.Free;            
//    FTimer := nil;
//    DoStop;
  end
  else
  if AutoStopInterval > 0 then
  begin
    Now := GetTickCount;
    if (Now - FTickCount >= Integer(AutoStopInterval)) or (Now < FTickCount) then
      Rotate := False;
  end;
end;


FiceGoesDelphi - Mo 09.07.07 15:02

Ein Dankeschön sollte es trotzdem immer mal wieder geben ;)


FiceGoesDelphi - Mo 09.07.07 15:03

user profile iconDunkel hat folgendes geschrieben:
Hallo!

Ich hab' mir das Problem mal angeguckt und die entsprechende Klasse grob überflogen.

Folgendes in JVDice.pas ändern, dann funktioniert zumindest das Rotieren aus dem Quellcode heraus; Zuweisung im OI lässt immer noch Delphi abstürzen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TJvDice.TimerFires(Sender: TObject);
var
  Now: Longint;
begin
  NewRandomValue;
  if not FRotate then
  begin
    FTimer.Enabled:= False;   /// neu hinzufügen !
//    FTimer.Free;            
//    FTimer := nil;
//    DoStop;
  end
  else
  if AutoStopInterval > 0 then
  begin
    Now := GetTickCount;
    if (Now - FTickCount >= Integer(AutoStopInterval)) or (Now < FTickCount) then
      Rotate := False;
  end;
end;


Wow :) Dankeschön! :flehan:
Wenn das funktioniert könnte ich dich knutschen ;)

Edit: :dunce: :dance2: :dance: :party: :beer:
DANKE! Wenn du irgendwann mal lust und Zeit hast, kannst mir ja noch kurz erklären WARUM das jetzt so war *gg*


Dunkel - Mo 09.07.07 15:09

user profile iconFiceGoesDelphi hat folgendes geschrieben:

Wow :) Dankeschön! :flehan:
Wenn das funktioniert könnte ich dich knutschen ;)

:shock: Muss nicht unbedingt sein!!!! :wink:

user profile iconFiceGoesDelphi hat folgendes geschrieben:

Edit: :dunce: :dance2: :dance: :party: :beer:
DANKE! Wenn du irgendwann mal lust und Zeit hast, kannst mir ja noch kurz erklären WARUM das jetzt so war *gg*

Hmmm... ich finde die Komponente schlecht programmiert. Beim setzen von der Eigenschaft Rotate wird ein TTimer erstellt, beim Rücksetzen wird dieser, im OnTimer-Ereignis(!!!), wieder freigegeben. Da liegt wohl das Problem!
Wenn man den Timer aber nicht freet, sondern nur disabled, dann funzt es.