Autor |
Beitrag |
theevilworm
      
Beiträge: 61
|
Verfasst: 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:
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:
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:
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; begin for zaehler:=1 to x do 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.
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 Klabautermann: Code- durch Delphi-Tags ersetzt
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 23.10.09 15:23
Hey und  im Forum!
theevilworm hat folgendes geschrieben : |
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.
theevilworm hat folgendes geschrieben : | 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Fr 23.10.09 15:27
Zuerst mal zur Version ohne Timer:
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 
      
Beiträge: 61
|
Verfasst: Fr 23.10.09 16:11
Wow, vielen Dank für die hilfreichen Antworten! Die haben mir sehr geholfen
Jann1k hat folgendes geschrieben : | 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!
Marc. hat folgendes geschrieben : | 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?
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?
Marc. hat folgendes geschrieben : | 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 Narses: Code- durch Delphi-Tags ersetzt
Moderiert von Narses: Zitate kenntlich gemacht.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 23.10.09 16:22
Moin und  im Forum!
theevilworm hat folgendes geschrieben : | 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?  Mir fällt da kein Grund ein.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: 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:
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 Klabautermann: Code- durch Delphi-Tags ersetzt.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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 
      
Beiträge: 61
|
Verfasst: 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:
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 Klabautermann: Code- durch Delphi-Tags ersetzt
|
|
Ironwulf
      
Beiträge: 733
Erhaltene Danke: 2
|
Verfasst: 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
Delphi-Quelltext
einfügen
dann sollte das ganze klappen
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: 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:
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))*1000) div 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:
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
      
Beiträge: 193
Erhaltene Danke: 1
Win XP / Vischda
D6 PE / D2005 PE
|
Verfasst: Fr 23.10.09 17:57
Ich denke mal das es so lauten sollte:
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...
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: 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ß!
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:
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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 61
|
Verfasst: Sa 24.10.09 21:02
Danke für den Tipp, funktioniert leider nicht... Programm hängt sich weiterhin auf :/
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 61
|
Verfasst: Sa 24.10.09 22:06
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:
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:
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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 24.10.09 22:34
|
|
theevilworm 
      
Beiträge: 61
|
Verfasst: 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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!
|
|
|