![]() |
Form zeigt sich nicht trotz .show etc.
Hallo Zusammen,
ich habe schon vor etwas längerer Zeit einen Updater für ein Programm von mir geschrieben. Hatte bis jetzt auch immer gefunzt, aber als ich es das erste mal mit Delphi 2009 compliert hatte funzt es ncihtmehr d.h. der Ablauf ist korrekt und er macht auch was er soll nur zeigt sich das Form nicht worauf der Status angezeigt wird. hier einmal etwas vom code
Delphi-Quellcode:
mein Problem ist nun das egal was ich unternehme. Dieses Fenster wird nicht mehr angezeigt. Ich hoffe das ihr mir helfen könnt
procedure TForm1.FormActivate(Sender: TObject);
Var ProductName, CompanyName, FileDescription, LegalCopyright, ProductVersion : String; i,step : Integer; begin PNL_Status.Color := RGB(200,100,0); delay(300); application.ProcessMessages; form1.show; application.BringToFront; application.ProcessMessages; application.ShowMainForm:=true; application.ProcessMessages; try application.ProcessMessages; progressbar.Max := 7; application.ProcessMessages; progressbar.StepIt; PNL_Status.Caption := 'Auslesen von freien Laufwerksbuchstaben'; delay(500); application.ProcessMessages; for I := 0 to 25 do begin application.ProcessMessages; if not DriveExists(I) then begin LB_Drives.Items.Add(Chr(I + Ord('A')) + ':'); application.ProcessMessages; end; end; application.ProcessMessages; PNL_Status.Caption := 'Verbinden des Updatelaufwerks'; progressbar.StepIt; application.ProcessMessages; loadgrid(Grid_Data,Extractfilepath(paramstr(0))+'Data.Sux'); for Step := 0 to Grid_Data.rowcount -1 do begin if Grid_Data.cells[3,step] = 'UP'then begin edit_UP.text := Grid_Data.Cells[0,step]; end; end; (shellexecute(application.handle,nil,('net '), PCHAR(('use ' + LB_Drives.items[1])+ ' ' + edit_UP.text),nil,sw_Normal)); try application.ProcessMessages; PNL_Status.Caption := 'Kopieren der neuen EXE'; progressbar.StepIt; application.ProcessMessages; windows.copyfile(Pchar(edit_UP.text + '\AdminTool.exe'),Pchar(Extractfilepath(paramstr(0))+'Admintool.exe'),false); PNL_Status.Caption := 'Kopieren der neuen Doku'; progressbar.StepIt; application.ProcessMessages; windows.copyfile(Pchar(edit_UP.text + '\Doku.doc'),Pchar(Extractfilepath(paramstr(0))+'Doku.doc'),false); PNL_Status.Caption := ('Update erfolgreich'); delay(1500); progressbar.StepIt; application.ProcessMessages; PNL_Status.Caption := 'Trennen des Updatelaufwerks'; progressbar.StepIt; application.ProcessMessages; wnetcancelconnection(Pchar(LB_Drives.items[1]),false); delay(500); application.ProcessMessages; PNL_Status.Caption := 'Starte AdminTool !'; progressbar.StepIt; delay(500); application.ProcessMessages; GetFileInfo(ProductName, CompanyName, FileDescription, LegalCopyright, ProductVersion, Application.ExeName); memo1.Lines[0] := (GetCurrentVersion); memo1.lines.add(FileDescription); delay(500); memo1.Lines.SaveToFile(Extractfilepath(paramstr(0))+'\Updater.ver'); shellexecute(application.handle,'open',Pchar(Extractfilepath(paramstr(0))+'\AdminTool.exe'),nil,nil,sw_show); application.terminate; except showmessage('Fehler beim kopieren'); end; except application.terminate; end; end; Schönen gruß Manu |
Re: Form zeigt sich nicht trotz .show etc.
Wenn ich das mal so sagen darf: Der Code ist das perfekte Gegenbeispiel bzgl. der Verwendung von Application.Processmessages :pale:
Ich vermute mal, das Problem kommt daher, dass das ganze im OnActivate passiert. Versuch mal einen Timer (Interval=1 und enabled) aufs Form zu tun, und den ganzen Code ins OnTimer-Event zu verschieben. Außerdem ganz am Anfang des OnTimer-öEvents den Timer ausschalten. |
Re: Form zeigt sich nicht trotz .show etc.
Diese Art der Anzeige ist nicht gut geeignet. Zudem: Was soll das Show in OnActivate? OnActivate heißt, dass das Formular den Eingabefokus bekommt (was auch tausend Mal passieren kann), das heißt da muss das Formular ja schon angezeigt sein...
Normalerweise zeigt man einen Fortschritt an, indem man von außen das Formular anzeigt und auch die Fortschrittsanzeige steuert. Also sop in der Art:
Delphi-Quellcode:
Form1 := TForm1.Create(nil);
Form1.ProgressBarX.Position := ...; DoSomething; Form1.ProgressBarX.Position := ...; ... Form1.Close; |
Re: Form zeigt sich nicht trotz .show etc.
Hi,
ich gehe mal davon aus, das Form1 das Mainform ist und es darum geht, dass nach der Anzeige des Forms die Aktionen starten sollen. Ich benutze immer diese variante:
Delphi-Quellcode:
Cu, Frank
TForm1 = class(TForm)
private procedure doAfterAppLoaded; public constructor Create(AOwner: TComponent); override; procedure AppOnIdle(Sender: TObject; var Done: Boolean); end; var Form1: TForm1; implementation {$R *.dfm} constructor TForm1.Create(AOwner: TComponent); begin inherited Create(AOwner); Application.OnIdle := AppOnIdle; end; procedure TForm1.AppOnIdle(Sender: TObject; var Done: Boolean); begin Application.OnIdle := nil; doAfterAppLoaded; end; procedure TForm1.doAfterAppLoaded; begin // hier der Code end; |
Re: Form zeigt sich nicht trotz .show etc.
Ich halte es für sinnvoller das so wie ich geschrieben habe in den Projektquelltext zu schreiben. Dann kann man das direkt steuern. Und wenn man den Ablauf im Formular selbst haben will, dann kann man dafür ja eine public Methode anbieten.
|
Re: Form zeigt sich nicht trotz .show etc.
Ok, folgende Aufgabenstellung:
Ein Formular soll angezeigt werden und soll sofort einige Dinge abarbeiten und gleichzeitig den Fortschritt anzeigen. Das Problem dabei ist, dass Delphi kein Event ala OnAfterShow bereitstellt. Die Events OnActivate und OnShow werden schon abgefeuert, wenn das Formular noch gar nicht sichtbar ist. Das ist die Erklärung dafür weshalb dein Beispiel nicht funktionieren kann. Es gibt zwei mögliche Lösungen: Lösung A: 1.) einen Timer auf's Formular setzen, Enabled=False und Interval auf 1000 2.) deinen gesamten Code aus dem OnTimer-Event aufrufen 3.) der 1. Befehl im OnTimer-Event muss sein Timer1.Enabled := False; so wird verhindert, dass der Code mehrfach ausgeführt wird 4.) im Event OnShow wird der Timer gestartet
Delphi-Quellcode:
Lösung B:
procedure TForm1.FormOnShow(Sender:TObject);
begin Timer1.Enabled := True; end; procedure TForm1.Timer1OnTimer(Sender:TObject); begin Timer1.Enabled := False; DoMyWork; end; procedure TForm1.DoMyWork; begin // hier deinen gesamten Arbeitcode rein end; hier wird aus OnShow eine Windows-Message an das eigene Formular geschickt. Wie das genau funktioniert verrate ich wenn du Lösung A erfolgreich probiert hast. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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