![]() |
Auf Button-Click warten
Hey,
habe ein kleines Anfängerproblem. Wie kann ich meinem Programm sagen, dass es auf einen Button-Click warten soll und dann erst weiterarbeiten soll? Habe gedacht, dass ich das in ner Schleife löse:
Delphi-Quellcode:
while (B2 = False ) do // B2 ist boolean für Button 2 angeklickt oder nicht, siehe unten
begin //sleep(50); label6.caption:='klappt'; end; Für B2: procedure TForm1.Button2Click(Sender: TObject); begin B2:=true; Netzplan(); end; Naja, geht so jedenfalls nicht, denn das Programm stürzt ab. Komme also nicht mehr an den Button 2 ran. Hat jemand nen Tipp? |
Re: Auf Button-Click warten
Könntest du die Routine nicht in zwei aufteilen, eine die vor button2.click ausgeführt wird, und eine Button2.click routine ?
|
Re: Auf Button-Click warten
Hallo svern,
du könntest beim Drücken des Buttons z.B. sein Tag auf einen Wert <> 0 setzen. Im Programm prüfst du diesen Wert in einer Schleife. Dazu müsstest du aber bei jedem Schleifendurchlauf Application.ProcessMessages aufrufen, damit andere Events überhaupt durchkommen. Deine Endlosschleife würde aber zu einer extrem hohen Prozessorlast führen, deshalb nimm lieber einen Thread, den du nach Button Drücken startest oder ggf. einfach eine Prozedur, die mit OnClick des Buttons ausgeführt wird. |
Re: Auf Button-Click warten
Hallo,
du mußt in deiner Schleife immer braf ein Application.ProcessMessages aufrufen damit er weiter Events (wie das Clicken) verarbeiten kann. BTW: Warum machst du das zeug nicht einfach an der Stelle wo B2 gesetzt wird anstatt ihn in so'ner while schleife dösen zu lassen? |
Re: Auf Button-Click warten
Wow, ihr seid echt schnell, thx.
Genau das Application.ProcessMessages hatte ich gesucht ;-) Ich hatte das mal schnell eingebunden, das Komische ist nur, dass ich das Programm nicht schließen kann, solange er in dieser Schleife ist. Kann ich das noch irgendwie einbauen? |
Re: Auf Button-Click warten
Ich würde es mit einer zusätzlichen Variable lösen. Eine globale Variable erstellen und im OnCreate auf 0 an der Stelle, an der das Programm erst bei Buttonklick weiterarbeiten soll, die Variable(am besten vom typ integer) auf 1 setzen. Dann den Hauptteil des Programms(das normale arbeiten) in eine if-Abfrage verpacken. Also etwa so:
Delphi-Quellcode:
So in etwa... um das Programm zu stoppen, musst du dir einen Befehl überlegen, den ich dir jetzt jedoch nicht vorgeben kann, weil ich ja nicht weiß, was dein programm so machen soll ;)
procedure...
if Variable = 0 then begin //was in deinem Programm passieren soll end else // also, sobald Variable den Wert 1 hat begin //hier einen Befehl eingeben, um das Programm anzuhalten end; procedure Button1Click(Sender: TObject)' begin if variable = 1 then variable := 0; end; ich hoffe, ich konnte helfen! mfg malo edit: hab die sache mit der if-Schleife geändert :roll: |
Re: Auf Button-Click warten
Zitat:
|
Re: Auf Button-Click warten
Zitat:
Äh... aber schick ihn mir besser per PN, damit es nicht zu viel OT hier wird :mrgreen: |
Re: Auf Button-Click warten
Hey,
irgendwie klappt das nicht. Hab das jetzt so in der einen Prozedur:
Delphi-Quellcode:
while (B2 = False ) do begin //sleep(50); label6.caption:='klappt'; Application.ProcessMessages; end; label7.caption:='jojooo'; end; procedure TForm1.Button2Click(Sender: TObject); begin B2:=true; //Netzplan(); end; Aber er macht das nicht!!! Verdammte Axt, ich check das nicht. Die Prozedur Button2Click wird nicht angewählt, wenn ich die Schleife am Laufen hab... warum nicht? Wie umgeh ich das? |
Re: Auf Button-Click warten
Hallo,
[schuß-ins-blaue] kommentiere vielleicht mal das label6.caption:='klappt'; in der Schleife aus und probieren dann nochmal. Vielleicht verdrängt das immer das Klick-Ereignis aus der Verarbeitung... oder arbeitet ProcessMessages immer alle ab :gruebel: :drunken: [/schuß-ins-blaue] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz