Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Button bleibt gedrückt während Funktion durchläuft (https://www.delphipraxis.net/120645-button-bleibt-gedrueckt-waehrend-funktion-durchlaeuft.html)

Yheeky 14. Sep 2008 11:47


Button bleibt gedrückt während Funktion durchläuft
 
Hi,

ich habe eine Art Login-Form bei mir in meinem Projekt. Wenn ich den Login-Button drücke, verbindet sich das Programm über die idHTTP Komponente der Indy-Tools mit einem Server und überprüft die Login-Daten. Dies dauert manchmal ein bisschen und ich habe den unschönen Nebeneffekt, dass der Login-Button während der gesamten Überprüfung gedrückt bleibt. Wie kann ich das verhindert? Ich habe bereits ein Application.ProcessMessages; vorangestellt, aber das Problem konnte ich damit leider nicht beheben.

Ich hoffe einer von euch hat einen guten Tipp für mich.

Luckie 14. Sep 2008 12:00

Re: Button bleibt gedrückt während Funktion durchläuft
 
Lager das Verbinden in einen Thread aus.

Yheeky 14. Sep 2008 16:20

Re: Button bleibt gedrückt während Funktion durchläuft
 
Was ist aber, wenn ich auf das Verbinden reagieren muss? Sprich:

Delphi-Quellcode:
procedure TLoginThread.Execute;
begin
case LoginErgebnis of
    log_Erfolg:
     begin
     // Funktionen
     end;
    
   log_Misserfolg: ShowMessage('Login fehlgeschlagen!');
end;
end;
Login-Button:
Delphi-Quellcode:
procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
  loginThread : TLoginThread;
begin
  loginThread := TLoginThread.Create(True);
  loginThread.Execute;
end;
Denn trotz Auslagerung kommt es nicht zum gewünschten Ergebnis.

Bernhard Geyer 14. Sep 2008 16:34

Re: Button bleibt gedrückt während Funktion durchläuft
 
Login-Button:
Delphi-Quellcode:
procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
  loginThread : TLoginThread;
begin
  loginThread := TLoginThread.Create(True);
  loginThread.Execute;
end;
Denn trotz Auslagerung kommt es nicht zum gewünschten Ergebnis.[/quote]

Du verwendest ja die Thread-Klasse nicht dazu die Funktion in einem eigenen Thread auszuführen. erzeuge mal die Tread-Klasse mit Parameter Suspended=False im Konstruktor und lies dir mal die Onlinehilfe zu TThread.

toms 14. Sep 2008 16:36

Re: Button bleibt gedrückt während Funktion durchläuft
 
Zitat:

Zitat von Yheeky
dass der Login-Button während der gesamten Überprüfung gedrückt bleibt.

Quick & dirty
Delphi-Quellcode:
SendMessage(Button1.Handle, BM_SETSTATE, 0, 0);
(Wobei natürlich der Ursache auf den Grund gegangen werden sollte...)

Yheeky 15. Sep 2008 07:33

Re: Button bleibt gedrückt während Funktion durchläuft
 
Ich hab den Konstruktur nun mit False aufgerufen, aber da bekomme ich eine Fehlermeldung von der idHTTP Komponente: Socket Error.
Onlinehilfe habe ich mir durchgelesen, ich würde aber gerne einen objektorientieren Thread benutzen.
Darf ich nicht einfach Funktionen in einem Thread aufrufen? Wieso kommt es in meinem Fall zum Socket Error, wenn es ansonsten (auch wenn der Button gedrückt bleibt) funktioniert?

Bernhard Geyer 15. Sep 2008 07:42

Re: Button bleibt gedrückt während Funktion durchläuft
 
Zitat:

Zitat von Yheeky
Darf ich nicht einfach Funktionen in einem Thread aufrufen?

Nicht alle Klassen sind Thread-Kompatible da die VCL nicht Threadesave ist bzw. Win32-API ThreadAffinität hat.

Zitat:

Zitat von Yheeky
Wieso kommt es in meinem Fall zum Socket Error, wenn es ansonsten (auch wenn der Button gedrückt bleibt) funktioniert?

Da wären Indy-Anwender gefragt ob man die Indy so einfach in Threads verwenden kann.

mschaefer 15. Sep 2008 07:43

Re: Button bleibt gedrückt während Funktion durchläuft
 
Disable den Button vor dem Application.ProcessMessage
Das löst ein Neuzeichnen des Buttons aus.
Nach dem Funktionsaufruf kannst Du ihn dann wieder enablen.

Grüße // Martin


PS: Auch :wink:

Yheeky 15. Sep 2008 08:02

Re: Button bleibt gedrückt während Funktion durchläuft
 
Zitat:

Zitat von mschaefer
Disable den Button vor dem Application.ProcessMessage
Das löst ein Neuzeichnen des Buttons aus.
Nach dem Funktionsaufruf kannst Du ihn dann wieder enablen.

Grüße // Martin

Das ist im Grunde ne gute Idee! ;-)
Danke! So werde ich´s machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz