Autor Beitrag
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 15:09 
Hallo zusammen,

ich bin sowohl neu in diesem Forum als auch in der Informatik im Allgemeinen!
Wir haben seit Beginn dieses Schuljahrs Informatik in der Schule, also seit insgesamt circa 15 Stunden.
Daher habe ich natürlich nicht so ein allgemeines Verständnis von dieser Sprache und vom Programmieren überhaupt, deshalb verzeiht mir bitte, wenn ich mich total doof anstelle oder mein Thema sogar im falschen Forum liegt. Ich habe zwar die Hilfe konsultiert, aber ich habe ja ein Problem sowohl mit sichtbaren Komponenten und auch Schleifen :-S

In Informatik verstehe ich bisher alles sehr gut, es mir ehrlich gesagt sogar ein bisschen zu leicht, da ich mich vorher aus Interesse schon mal mit If-Anweisungen und so beschäftigt habe, und der Rest meines Kurses dies erstmal veranschaulicht haben muss. Ich will mir nicht anmaßen zu behaupten, dass ich besser bin als der Rest, aber momentan langweile ich mich etwas, weil wir immernoch mithilfe von Canvas zeichnen, seit der 3ten Doppelstunde.

Also habe ich ein eigenes Projekt versucht, und zwar ein simples "Epilipsy"-Programm, bei dem sich bestimmte Farben rasend schnell abwechseln.
Zuerst hatte ich dies versucht zu realisieren mithile der vom Lehrer geschriebenen Prozedur "Pause", die mit GetTickCount arbeitet, und diesen erst einmal und dann dauern abfragt, bis Anfangs- und Endzeit größer als die Variable "Zeit" ist... Wisst ihr, was ich meine?

Erstmal die Pause-Prozedur:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Pause (Zeit:Word);
var start, stop:word;
begin
start:=GetTickCount;
Repeat
   stop:=GetTickCount;
Until start-stop=zeit;
end;


Ich habe diese erstmal aus dem Gedächtnis geschrieben, kann das soweit stimmen?

Als nächstes folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var zaehler:word;
begin
Repeat
   begin
   Form1.Color:=clred;
   pause(50);
   Form1.Color:=clblue;
   pause (50);
   zaehler:=zaehler+1;
   end;
Until zaehler=100;
end;


Dies klappte überhaupt nicht, bei Klick auf den Buttion hängt sich das Programm auf :(

Also habe ich es mit einer for-Schleife und einem Timer probiert, und das ist ECHT komisch:

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:
var
  farbenvar:word;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
farbenvar:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;
button1.Visible:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var zaehler:integer; //oder auch Datentyp word, ich habe keinen Unterschied gemerkt.
begin
for zaehler:=1 to x do //x ist hier keine Variable, sondern nur zur Veranschaulichung. Siehe im Text unter diesem Code.
  begin
  farbenvar:=farbenvar+1;
  case farbenvar mod 4 of
    0: form1.color:=clblue;
    1: form1.color:=clgreen;
    2: form1.color:=clyellow;
    3: form1.color:=clred;
  end;
  end;


Uff. Der Timer ist per Objektinspektor deaktiviert und der Intervall auf 50 ms.
Den Teil mit "farbenvar mod 4" habe ich genommen, weil ich wie gesagt, erste seit kurzem Informatik habe und mir nicht anders zu helfen wusste, wie ich sonst einen "Befehlspool" erstelle, aus dem bei jedem Klick genau ein Befehl ausgeführt wird.
Hier klappt gar nichts, es tauchen zwei Probleme auf.

ausblenden Delphi-Quelltext
1:
for zaehler:=1 to x do					


1. Egal was ich für x einsetze, die Schleife wird immer unendlich oft ausgeführt!
2. Das ist wirklich mysteriös: Wenn ich für x 2 oder 667 einsetze, klappt es zwar, das das Fenster in Rot, Grün, Blau und Gelb blinkt, wenn auch unendlich oft.
Wenn ich jedoch 2 oder 666 einsetze, blinkt das Fenster nur in Blau und Gelb, obwohl doch der zaehler überhaupt keinen Effekt auf die farbenvar haben dürfte, oder?

Ich habe wirklich keine Ahnung, was hier schief läuft. Kann mir da jemand helfen, und es auch nöglich anfängerfreundlich erklären? Wie gesagt, ich bin noch absoluter Grünschnabel!
Vielen Dank :)

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 23.10.09 15:23 
Hey und :welcome: im Forum!
user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var zaehler:word;
begin
Repeat
   begin
   Form1.Color:=clred;
   pause(50);
   Form1.Color:=clblue;
   pause (50);
   zaehler:=zaehler+1;
   end;
Until zaehler=100;
end;


Dies klappte überhaupt nicht, bei Klick auf den Buttion hängt sich das Programm auf :(

Klar, Du hast Deine Variable zaehler auch überhaupt nicht initialisiert.

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
1. Egal was ich für x einsetze, die Schleife wird immer unendlich oft ausgeführt!
2. Das ist wirklich mysteriös: Wenn ich für x 2 oder 667 einsetze, klappt es zwar, das das Fenster in Rot, Grün, Blau und Gelb blinkt, wenn auch unendlich oft.
Wenn ich jedoch 2 oder 666 einsetze, blinkt das Fenster nur in Blau und Gelb, obwohl doch der zaehler überhaupt keinen Effekt auf die farbenvar haben dürfte, oder?

Das liegt daran, dass der Code im OnTimer-Event ausgeführt wird, d.h. in (mehr oder weniger) regelmäßigen Intervallen. Die For-Schleife kannst Du dier hier also sparen. Aber auch hier gilt, wie auch sonst, Variablen immer(!) initialisieren, sonst kommt es zu unvorhersehbaren Ereignissen, wie du selbst gemerkt hast. ;)

Grüße,
Marc.
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Fr 23.10.09 15:27 
Zuerst mal zur Version ohne Timer:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Pause (Zeit:Wordd.h.);
var start, stop:word;
begin
start:=GetTickCount;
Repeat
   stop:=GetTickCount;
Until start-stop=zeit;
end;


Das funktioniert so nicht ganz, gettickcount liefert dir die seit dem letzten Systemstart vergangene Zeit d.h. je später du es aufrufst, desto größer wird der Wert. Dein start-stop ist also immer negativ! Um das zu korrigieren musst du aus dem start-stop=zeit ein stop-start>=zeit machen (d.h. zwischen dem Aufruf von Start und dem finalen Aufruf von stop sind mindestens zeit ms vergangen).

Außerdem wirst du auf die Art und Weise nichts von deinem Farbenspiel sehen bis auf die letzte Farbe, da die Form sich erst aktualisiert, wenn alle Befehle abgearbeitet wurden und du am Ende deiner Button-Prozedur bist. Um das zu korrigieren füge ein application.processmessages hinter jedem Farbwechsel ein, der Befehl gibt deinem Programm etwas Zeit zum verschnaufen und verarbeitet angekommene Messages (d.h. in deinem Falle siehst du dann die neue Farbe deiner Form):
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 16:11 
Wow, vielen Dank für die hilfreichen Antworten! Die haben mir sehr geholfen :)

user profile iconJann1k hat folgendes geschrieben Zum zitierten Posting springen:
Das funktioniert so nicht ganz, gettickcount liefert dir die seit dem letzten Systemstart vergangene Zeit d.h. je später du es aufrufst, desto größer wird der Wert. Dein start-stop ist also immer negativ! Um das zu korrigieren musst du aus dem start-stop=zeit ein stop-start>=zeit machen (d.h. zwischen dem Aufruf von Start und dem finalen Aufruf von stop sind mindestens zeit ms vergangen).
Stimmt, da habe ich mich nur verschrieben! Meinte natürlich stop-start :) Danke trotzdem!

user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
Das liegt daran, dass der Code im OnTimer-Event ausgeführt wird, d.h. in (mehr oder weniger) regelmäßigen Intervallen. Die For-Schleife kannst Du dier hier also sparen.
Achso! Na das kommt davon, wenn man neue Objekte einfach so probiert, ohne sie sich vom Lehrer erklären zu lassen. Eine Frage jedoch: Wie kann ich denn dann einstellen, dass der Timer nur z.B. 10 mal ausgeführt wird?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Timer1Timer(Sender: TObject);
var zaehler:integer;
begin
zaehler:=zaehler+1;
farbenvar:=farbenvar+1;

case farbenvar mod 4 of
0: form1.color:=clblue;
1: form1.color:=clgreen;
2: form1.color:=clyellow;
3: form1.color:=clred;
end;

If zaehler>10 Then
begin   
Timer1.Enabled:=false;
end;


end;


Würde das so gehen?

user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
Klar, Du hast Deine Variable zaehler auch überhaupt nicht initialisiert.
Meinst du damit, dass ich am Anfang, noch vor der Repeat-Schleife der Variable zaehler den Wert 0 zuweisen soll? zaehler:=0?

Eine Frage für zwischendurch, nicht zum Thema: Wir benutzen in der Schule Delphi 7. Kann mir das nachher in irgendeiner weise zum Nachteil werden?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Zitate kenntlich gemacht.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 23.10.09 16:22 
Moin und :welcome: im Forum!

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Eine Frage für zwischendurch, nicht zum Thema: Wir benutzen in der Schule Delphi 7. Kann mir das nachher in irgendeiner weise zum Nachteil werden?
Zunächst mal: bei uns gilt die Regel: pro Thread eine Frage, sonst wird´s unübersichtlich. ;) Aber da du neu hier bist, machen wir mal eine Ausnahme. :)

Zu deiner Frage: inwiefern sollte das zu einem Problem führen? :gruebel: Mir fällt da kein Grund ein. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 16:36 
Huch, ganz vergessen in der Hektik:
Danke für eure Willkommensgrüße, man wird ja nett empfangen hier! Habe ich schon viel schlechter erlebt! ;)

Zu Delphi 7: Ich dachte, in dieser alten Version sind evtl. manche Objekte oder Befehle nicht enthalten, die ich nachher dringend benötige, wenn ich etwas anspruchsvolleres erschaffen möchte. Momentan reicht Delphi 7 natürlich noch dicke!
Ich will aber die Regel "Nur eine Frage pro Thread" nicht brechen, daher wieder OnTopic:
Ich habe meine Idee vom leztten Post mal programmiert und siehe da: es klappte!
Also habe ich den nächstgrößeren Schritt gewagt und versucht, den Benutzer eingeben lassen zu können, wie viele Sekunden es blinken soll. Also ein Edit-Feld, in das man die Anzahl an Sekunden eingibt.

Leider klappt das nicht so, wie gedacht:

ausblenden 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:
procedure TForm1.Button1Click(Sender: TObject);
begin
zeit:=((StrToInt (LabeledEdit1.Text))*1000)/40;
timer1.Enabled:=true;
button1.Visible:=false;
LabeledEdit1.Visible:=false;
end;

[...]

procedure TForm1.Timer1Timer(Sender: TObject);

begin
zaehler:=zaehler+1;
farbenvar:=farbenvar+1;

case farbenvar mod 4 of
  0: form1.color:=clblue;
  1: form1.color:=clgreen;
  2: form1.color:=clyellow;
  3: form1.color:=clred;
end;

If zaehler>zeit then
  Timer1.Enabled:=false;
  Button1.Visible:=true;
end;


Anmerdung: Ich habe den Intervall vom Timer auf 40 runtergesetzt.
Dieses kompilliert gar nicht erst, laut Delphi sind die Typen "Word" und "Extended" in der Zeile
"zeit:=((StrToInt (LabeledEdit1.Text))*1000)/40;"
nicht kompatibel!
Das versteh ich nicht, mal angenommen man gibt eine ganzzahlige Sekundenanzahl ein (Bsp: 6), multipliziert diese mit 1000 (also 6000) und teilt sie durch 40: Dann kommt 150 raus, und das ist doch keine Kommazahl. Und seit wann rechnet Delphi mit ein, dass der Benutzer ja auch Kommazahlen eingeben könnte?

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt.
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: Fr 23.10.09 16:46 
nimm statt / das wörtchen div ;) das is explizit eine ganzzahlendivision und da meckert er sicher nimmer ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 16:58 
Vielen Dank für den Tipp, klappt super!

Leider habe ich nun das Problem (wäre ja auch zu schön gewesen), dass man keine neue Zeit eingeben kann:

Ich gebe ein, dass 5 sek. geblinkt werden soll, diese 5 sek. Blinken klappen auch perfekt. Wenn ich danach allerdings eine kleinere Zahl eingeben will, ändert sich die Farbe nur einmal um eine Farbe, und bei jedem Klick wieder um eine Farbe usw...
Wenn ich eine größere Zahl eingebe, wird nur die Differenz der bisher größten Zeit und der neu eingegeben, noch größeren Zeit geblinkt. Habe ich irgendwo einen Fehler beim Zuweisen gemacht?

Beispiel:
Ich gebe 5 ein.
Es blinkt 5 Sekunden.
Danach gebe ich 3 ein -> klappt nicht.
Gebe ich 7 ein -> blinkt er 2 Sekunden (7-5=2)
Gebe ich danach 14 ein, blinkt er 7 Sekunden (14-7=7)

Das kann doch gar nicht sein, da bei der Prozedure Button1Click ja Zeit immer ein aktueller Wert zugewiesen wird:

ausblenden Delphi-Quelltext
1:
zeit:=((StrToInt (LabeledEdit1.Text))*1000)/40;					


Dieses ändert sich doch immer wieder und fragt doch bei jedem Klick den aktuellen Wert im Edit-Feld ab. Wieso funktioniert das nicht? Denkfehler?

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt
Ironwulf
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 733
Erhaltene Danke: 2



BeitragVerfasst: Fr 23.10.09 17:24 
ich hab mir zwar nicht alles duch gelesen, aber es klingt so als setzt du den zaehler nicht wieder auf 0
also einfach in die button click prozedur noch
ausblenden Delphi-Quelltext
1:
zaehler:= 0;					

einfügen

dann sollte das ganze klappen
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 17:42 
Yippie, es läuft!
Vielen Dank!

Jetzt gibts nur noch eine Sache auszumerzen:
Eigentlich wollte ich, dass der Button und das Editfeld verschwinden, wenn man auf den Button klickt und das Blinken anfängt. Wenn das Blinken wieder aufgehört hat (also zaehler>zeit), sollen beide wieder sichtbar werden.
Das klappt so anscheinend nicht:

ausblenden 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:
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Visible:=false;
LabeledEdit1.Visible:=false;
zeit:=0;
zaehler:=0;
zeit:=((StrToInt (LabeledEdit1.Text))*1000div 40;
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
zaehler:=zaehler+1;
farbenvar:=farbenvar+1;

case farbenvar mod 4 of
  0: form1.color:=clblue;
  1: form1.color:=clgreen;
  2: form1.color:=clyellow;
  3: form1.color:=clred;
end;

If zaehler>zeit then
    Button1.Visible:=true;
    LabeledEdit1.Visible:=true;
    Timer1.Enabled:=false;

end;


Und wenn ich den ganz unteren Abschnitt umstrukturiere, auch nicht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
If zaehler>zeit then
    Timer1.Enabled:=false;
    LabeledEdit1.Visible:=true;
    Button1.Visible:=true;


Beim erstem Teil klappt das Blinken komischerweise nicht, es blinkt nur einmal und es verschwindet auch nur das Editfeld, und beim zweiten Teil verschwinden sie gar nicht, es blinkt aber :-S
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Fr 23.10.09 17:57 
Ich denke mal das es so lauten sollte:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If zaehler>zeit then
begin 
  Button1.Visible:=true;
  LabeledEdit1.Visible:=true;
  Timer1.Enabled:=false;
end;

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Fr 23.10.09 18:18 
*Kopf -> Tisch*

Na toll, an sowas scheiter ich... Bisher immer gemacht, und auf einmal vergess ichs. Danke für den Denkastoß! :P

Jetzt läuft komplett rund, vielen Dank an alle!
*gelöst*

Edit:
Also das Programm läuft ja nun perfekt mit einem Timer und dem case Befehl...
Weiter oben im Thread wurde mir aber folgender Tipp gegeben:

Zitat:

Außerdem wirst du auf die Art und Weise nichts von deinem Farbenspiel sehen bis auf die letzte Farbe, da die Form sich erst aktualisiert, wenn alle Befehle abgearbeitet wurden und du am Ende deiner Button-Prozedur bist. Um das zu korrigieren füge ein application.processmessages hinter jedem Farbwechsel ein, der Befehl gibt deinem Programm etwas Zeit zum verschnaufen und verarbeitet angekommene Messages (d.h. in deinem Falle siehst du dann die neue Farbe deiner Form)


Das habe ich gemacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
var zaehler:word;
begin
zaehler:=0;
Repeat
  begin
  zaehler:=zaehler+1;
  form1.color:=clred;
  pause(50);
  application.processmessages;
  form1.Color:=clblue;
  pause(50);
  application.processmessages;
  end;
Until zaehler>50;
end;


Klappt leider nicht, wenn ich das Programm ausführe erscheint kein Fenster. Übrigens auch nicht, wenn das "application.processmessages;" noch vor "pause(50)" steht. Was mache ich falsch? :(
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 24.10.09 20:54 
Ich bin mir nicht 100%ig sicher, aber ich glaube dass das formcreate schon ausgeführt wird, bevor das Fenster sichtbar wird, d.h. du kriegst dein Fenster erst zu sehen, wenn der ganze Farbwechselspaß schon zuende ist. Als einfache Lösung würde ich hier vorschlagen die Prozedur ins Form1.onactivate zu übertragen, dann sollte es klappen.
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Sa 24.10.09 21:02 
Danke für den Tipp, funktioniert leider nicht... Programm hängt sich weiterhin auf :/
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 24.10.09 21:19 
Füge mal ein paar showmessages ein und schau wo er denn nicht mehr weitermacht, wenn ich deinen Code ins OnActivate nehme funktioniert bei mir jedenfalls alles. Siehst du denn wenigstens das Fenster und hast du auch bei deiner pause proozedur ein >= in der Abbruchbedingung und nicht nur ein =?
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Sa 24.10.09 22:06 
ausblenden 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:
procedure Pause (Zeit:Word);
var start, stop:word;
begin
start:=GetTickCount;
Repeat
   stop:=GetTickCount;
Until start-stop>=zeit;
end;

procedure TForm1.FormActivate(Sender: TObject);
var zaehler:word;
begin
zaehler:=0;
Repeat
  begin
  zaehler:=zaehler+1;
  form1.color:=clred;
  application.processmessages;
  pause(50);
  form1.Color:=clblue;
  application.processmessages;
  pause(50);
  end;
Until zaehler>5000;
end;


Dies ist mein gesamter Code für mein Problem.
Mir ist noch eine Sache eingefallen, und zwar dass auch die Prozedure pause(50) der Auslöser sein könnte, da diese ja auch in einer Repeat-Schleife läuft. Also habe ich da auch ein paar application.processmessages; reingeknallt und auch deinen Tipp showmessage verwendet:

ausblenden 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:
procedure Pause (Zeit:Word);
var start, stop:word;
begin
start:=GetTickCount;
Repeat
   stop:=GetTickCount;
   application.processmessages;
Until start-stop>=zeit;
end;

procedure TForm1.FormActivate(Sender: TObject);
var zaehler:word;
begin
zaehler:=0;
Repeat
  begin
  zaehler:=zaehler+1;
  form1.color:=clred;
  application.processmessages;
  showmessage ('text');
  pause(50);
  form1.Color:=clblue;
  application.processmessages;
  pause(50);
  end;
Until zaehler>5000;
end;


Mit diesem Code klappts aber auch nicht, das Programm ist zwar jetzt soweit "nicht mehr aufgehängt", dass ich es verschieben kann, schließen allerdings nicht. Es hängt also immernoch irgendwo fest. Ich sehe das Fenster mit "Text". Das Formular ist nur Rot.

Wenn ich showmessage etwas weiter nac unten verschiebe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  form1.color:=clred;
  application.processmessages;
  pause(50);
  showmessage ('text');
  form1.Color:=clblue;


sehe ich showmessage nicht mehr. Hier liegt also irgendwo der Hund begraben! Ich weiß nicht weiter -_-
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 24.10.09 22:34 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Pause (Zeit:Word);
var start, stop:word;
begin
start:=GetTickCount;
Repeat
   stop:=GetTickCount;
Until start-stop>=zeit;
end;


Da haben wir den Wurm. Der Wert von Stop ist hier immer größer als Start (siehe mein erster Post), start-stop liefert dir somit einen negativen Wert, entweder du änderst die Zeile in

ausblenden Delphi-Quelltext
1:
Until start-stop<=-zeit;					


oder

ausblenden Delphi-Quelltext
1:
Until Stop-start>=zeit;					


Demzufolge war deine Vermutung richtig pause war das Problem, sie lief nämlich in einer Endlosschleife.
theevilworm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61



BeitragVerfasst: Sa 24.10.09 23:15 
Ahhh! Viiielen Dank!
Sowas dämliches, da wurde ich weiter oben im Thread schon drauf hingewiesen, und da hab ich mich ja nur verschrieben. Und nun mache ich den gleichen Fehler nochmal. Wie peinlich!

Da gibts nur noch eine Sache: Es blinkt jetzt perfekt, nur schließen kann ichs erst, wenn es 5000 mal geblinkt hat O_o
Komisch, da ich in jede zweite Zeile ein application.processmessages; geschrieben habe. Trotzdem kann ich es nicht schließen, während es läuft, erst nachdem alles vorbei ist.
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 24.10.09 23:28 
Zu dem Problem mit dem Programm beenden kann ich dir 2 Lösungen bieten:

1. Nimm deinen Lösungsansatz mit dem Timer (dazu würde ich dir raten).

2. Deklariere dir eine globale boolsche Variable und nimm diese in die Abbruchbedingung deiner Farbwechselschleife auf, den Wert dieser Variablen veränderst du im Event Form1.OnCloseQuery. Dieses Event wird nämlich zuerst aufgerufen, wenn du versuchst dein Programm zu schließen. Im Moment antwortet dein Programm darauf mit einem "Nein, ich hab da noch eine Schleife zu machen", diese Schleife kannnst du aber mit dem o.g. Konstrukt durch das OnCloseQuery Event beenden.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 24.10.09 23:29 
hi, du must dir eins merken

Wenn Du in einer Procedure eine Zählerschleife drin hast kann die Procedure erst beendet werden wen die Schleife durchlaufen ist.
Solange hast du keinen Enfluss mehr auf das Programm!!!
Gilt auch für Funktionen!!!!

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!