Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Form zeigt sich nicht trotz .show etc. (https://www.delphipraxis.net/135514-form-zeigt-sich-nicht-trotz-show-etc.html)

5etH 12. Jun 2009 07:52


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:
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;
mein Problem ist nun das egal was ich unternehme. Dieses Fenster wird nicht mehr angezeigt. Ich hoffe das ihr mir helfen könnt
Schönen gruß
Manu

jfheins 12. Jun 2009 08:13

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.

jaenicke 12. Jun 2009 08:16

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;

dataspider 12. Jun 2009 08:31

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:
  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;
Cu, Frank

jaenicke 12. Jun 2009 08:43

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.

sx2008 12. Jun 2009 12:22

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:
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;
Lösung B:
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 13:08 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