Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Close in Onshow oder ein Statusfenster (https://www.delphipraxis.net/330-close-onshow-oder-ein-statusfenster.html)

Guenni_d 4. Jul 2002 12:23


Close in Onshow oder ein Statusfenster
 
Hallo zusammen,

will ein kleines Proggi schrieben, mit dem man mit einem externen Mikrocontroller über die RS232 kommunizieren kann.
Wie man das shcon so oft gesehen hat, soll der Datentransfer in einer extra Form mittels einer Progressbar dargestellt werden. Sobald Transfer beendet, schliesst sich das Statusfenster wieder selbst.

Leider geht das nciht so wie ich wollte...

So hatte ich es versucht:

Mainprogramm:

Transferform.showmodal;


Im Onshow Event der Transferform:

.... tu dies und das... und zeig den Progressbar an...
Close;



Das Funktioniert soweit, dass die Form geöffnet wird und alles funktioniert. Bis auf den Close. Das Fnester bleibt offen.

Kann mir jemand helfen? Wie man so was macht?

Die einzigste Lösung die mir eingefallen ist, wäre ein Timer, der als letztes gestartet wird und dann ziemlich schnell zu schlägt und das Fenster schliesst. Aber muss doch auch einfacher gehen.

Gruss Günter

Luckie 4. Jul 2002 12:35

Wenn die Progressbar synchron läuft, dann mach doch:
Code:
if Progressbar1.Max = Progressbar1.Position then
  Close;

sakura 4. Jul 2002 12:37

Das Problem ist, dass der Befehl Close; nicht im OnShow Event ausgeführt werden kann. Ist generell kein hervorragender Bereich, um den Fortschritt anzuzeigen. Aber wie dem auch sei, mit folgendem Code, kannst Du dem Fenster mitteilen, sich als nächstes zu schließen.
Code:
  PostMessage(Handle, WM_Close, 0, 0);
:cat:

Guenni_d 4. Jul 2002 14:57

Danke Sakura für die Hilfe...
Ich weiss dass es nicht ideal ist, in Onshow so viele Dinge zu machen. Aber leider manchmal ne Notlösung.
Oder gibt es da noch andere wege, wenn man ein Modales Fenster öffnen will und dann darin einen Prozess anstossen möchte ohne eine Usereingabe?

Bin für alle Ratschläge offen.
Gruss Günter

sakura 4. Jul 2002 15:06

Ähnlich der PostMessage könntest Du weitere Nachrichten versenden. Beispiel (ungetestet, sollte aber so funktionieren)
Code:
const
  WM_StartMyProcess = WM_USER + 1;
type
  TForm1 = class(TForm)
  private
    procedure WMStartMyProcess(var Msg: TMessage); message WM_StartMyProcess;
  ...
  end;

....

TForm1.WMStartMyProcess;
begin
  ... der Code aus Deinem OnShow Event Handler
  ...
  PostMessage(Handle, WM_Close, 0, 0);
end;

TForm1.OnShow(Sender: TObject);
begin
  PostMessage(Handler, WM_StartMyProcess, 0, 0);
end;
Ich hoffe, dass das weiterhilft.

jbg 4. Jul 2002 15:58

Wie wäre es damit:
Code:
Transferform.Show;
try
  Application.ProcessMessages; // Zeit zum Anzeigen des Formulars geben
  Transferform.TransferData; // hier die Daten übertragen
finally
  Transferform.Close;
end;

sakura 4. Jul 2002 16:02

@jbg:

Er wollte aber ein modales Form, Show ist nicht modal...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 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