AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Form zeigt sich nicht trotz .show etc.
Thema durchsuchen
Ansicht
Themen-Optionen

Form zeigt sich nicht trotz .show etc.

Ein Thema von 5etH · begonnen am 12. Jun 2009 · letzter Beitrag vom 12. Jun 2009
Antwort Antwort
Benutzerbild von 5etH
5etH

Registriert seit: 4. Mär 2008
Ort: Giessen
217 Beiträge
 
Delphi 2007 Professional
 
#1

Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 08:52
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
Manuel
Lieber heimlich schlau als unheimlich dumm
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 09:13
Wenn ich das mal so sagen darf: Der Code ist das perfekte Gegenbeispiel bzgl. der Verwendung von Application.Processmessages

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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 09:16
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;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 09:31
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 09:43
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Form zeigt sich nicht trotz .show etc.

  Alt 12. Jun 2009, 13:22
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.
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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