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 Form nicht zu sehen !? (https://www.delphipraxis.net/109470-form-nicht-zu-sehen.html)

haentschman 2. Mär 2008 09:36


Form nicht zu sehen !?
 
Guten Morgen alle.. :hi:

ich brauche mal wieder Eure Hilfe.

- ich bekomme meine Form erst ganz kurz nach dem Dateidownload ( 3 Dateien ) zu sehen.
- Application.ProcessMessages oder IdAntiFreeze haben keine Auswirkung

Was passieren soll: die exe startet, lädt die Dateien ( optische Kontrolle ProgressBar ) und schließt sich wieder.

Delphi-Quellcode:
procedure TFUMain.FormShow(Sender: TObject);
var A: Integer;

begin
  JvXPProgressbar1.Position:= 0;
  INIEinlesen;
  UINIEinlesen;

  for A := 1 to UFiles do
    begin
      FileINI(IntToStr(A));
      DateiDownload(USource,UZiel);
    end;

  VersionDatum:= UVersionDatum;
  INISchreiben;
  ShellExecute(Application.Handle,'open',PChar('eAV.exe'),NIL,NIL,SW_SHOWNORMAL);
  Application.Terminate;
end;


procedure TFUMain.DateiDownload(Source, Ziel: String);
var
  fStream: TFileStream;
  TempZiel: String;
begin
  JvXPProgressBar1.Position:= 0;
  JvXpProgressBar1.Refresh;
  if Copy(Ziel,1,2) ='DB' then
    begin
      if DBHost = '' then
        begin
          TempZiel:= DBOrdnerL + Copy(Ziel,3,Length(Ziel)-2);
        end
          else
            begin
              TempZiel:= DBOrdnerN + Copy(Ziel,3,Length(Ziel)-2);
            end;
    end
      else
        begin
          TempZiel:= InstallPfad + '\' + Ziel;
        end;
  Ziel:= TempZiel;
  JvLabel1.Caption:= 'Download nach: ' + Ziel + '...';
  JvLabel1.Refresh;
  try
    fStream:= TFileStream.Create(Ziel,fmCreate or fmShareDenyNone);
  try
    idHTTP1.Get(Source, fStream);
  finally
    fStream.Free;
  end;
  except
    ShellExecute(Application.Handle,'open',PChar('eAV.exe'),NIL,NIL,SW_SHOWNORMAL);
    Application.Terminate;
  end;
end;

procedure TFUMain.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  JvXPProgressBar1.Position:= AWorkCount;
  Application.ProcessMessages;
end;

procedure TFUMain.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
  JvXPProgressBar1.Max:= AWorkCountMax;
end;
wo habe ich den Denkfehler ? :gruebel:

SirThornberry 2. Mär 2008 09:38

Re: Form nicht zu sehen !?
 
Die Stelle an der du es hast ist schuld. OnShow könnte auch heißen: OnDirectBeforeShow

haentschman 2. Mär 2008 09:45

Re: Form nicht zu sehen !?
 
Danke für die schnelle Reaktion...

OnDirectBeforeShow kennt mein ObjectInspector der Form nicht :gruebel:

Im Prinzip war dieser Effekt ja logisch, da ja OnShow nicht erst ausgelöst wird nach Anzeige der Form sondern beim setzen visible:= true
Ich dachte aber, daß mit Application.Processmessages die Form dann doch zu sehen ist.

Phoenix 2. Mär 2008 09:49

Re: Form nicht zu sehen !?
 
Nein, er meinte damit, das das Ereignis OnShow nicht nach, sondern unmittelbar vor dem Anzeigen ausgelöst wird. Das heisst Du machst die ganze Arbeitet tatsächlich _vor_ dem Anzeigen des Forms.

taaktaak 2. Mär 2008 09:53

Re: Form nicht zu sehen !?
 
Moin, Moin,
also wäre eine mögliche Lösung: Du deklarierst eine eigene Proc "AfterShow", die auf eine von dir definierte WM_UserMessage reagiert. Als letzte Zeile in OnShow sendest du selbst die WM_UserMessage ab. Dann sollte es funktionieren

haentschman 2. Mär 2008 09:56

Re: Form nicht zu sehen !?
 
tja und wie positioniere ich die "Arbeit" nach OnShow ?

OnPaint OnActivate sind ja eher ungünstig, da sie bei Neuzeichnen, Focuswechsel immer aufs neue ausgelöst werden.

was würdet ihr von einem TimerEvent halten, Timer in in OnShow starten (1s) und im OnTimer die Arbeit.
ist so was unsauber ?


@ taaktaak: Keine schlechte Idee :thumb:

SirThornberry 2. Mär 2008 10:06

Re: Form nicht zu sehen !?
 
Zitat:

OnPaint OnActivate sind ja eher ungünstig, da sie bei Neuzeichnen, Focuswechsel immer aufs neue ausgelöst werden.
das lässt sich doch abfangen :-)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  is_first_call := TRUE;
end;

procedute TForm1.FormPaint(Sender: TObject);
begin
  if (is_first_call) then
  begin
    is_first_call := False;
    //do what you want;
  end;
end;

Phoenix 2. Mär 2008 10:12

Re: Form nicht zu sehen !?
 
Das mit der Boolean würde ich lieber im Activate machen, sonst verzögert sich das Zeichnen um die Arbeitszeit, und das ist eher wieder ungeschickt.

Ins Paint würde ich nie zeitintensive Aufgaben legen. Aber sonst ist der Ansatz prinzipiell nicht schlecht.

haentschman 2. Mär 2008 10:14

Re: Form nicht zu sehen !?
 
Danke für Eure zahlreichen Tipps...

habe jetzt:
Delphi-Quellcode:
const
  WM_FERTIG = WM_USER + 100;
Delphi-Quellcode:
procedure HabeFertig(var Msg: TMessage); Message WM_FERTIG;
Delphi-Quellcode:
procedure TFUMain.FormShow(Sender: TObject);
begin
  JvXPProgressbar1.Position:= 0;
  INIEinlesen;
  UINIEinlesen;
  PostMessage(Handle, WM_FERTIG, 0, 0);
end;
Delphi-Quellcode:
procedure TFUMain.HabeFertig(var Msg: TMessage);
var A: Integer;
begin
  for A := 1 to UFiles do
    begin
      FileINI(IntToStr(A));
      DateiDownload(USource,UZiel);
    end;
  VersionDatum:= UVersionDatum;
  INISchreiben;
  ShellExecute(Application.Handle,'open',PChar('eAV.exe'),NIL,NIL,SW_SHOWNORMAL);
  Application.Terminate;
end;
...und es arbeitet doch :-D

Danke an alle.


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