Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Formular schliessen im "OnActivate" (https://www.delphipraxis.net/88104-formular-schliessen-im-onactivate.html)

xZise 10. Mär 2007 09:32


Formular schliessen im "OnActivate"
 
Wie kann ich mein Formular schließen im OnActivate?

Luckie 10. Mär 2007 09:55

Re: Formular schliessen im "OnActivate"
 
Mit Close?

Jelly 10. Mär 2007 10:59

Re: Formular schliessen im "OnActivate"
 
Warum willst du im OnActivate ein Form schliessen :gruebel: Dann zeigs doch gar nicht erst an :thumb:

xZise 10. Mär 2007 11:03

Re: Formular schliessen im "OnActivate"
 
@ Luckie: sry, hatte ich nicht erwähnt: So gehts nicht ;)
@ Jelly: Er soll ja den Download einer Datei anzeigen (dauert auch ein bisschen, man sieht die Form also), aber sich auch automatisch schliessen wenn er fertig ist.
Deshalb habe ich den Downloadcode in "OnActivate" geschrieben, weil "OnShow" zu früh ist, und Timer zwar geht, aber irgendwie doch unelegant ist...

gsh 10. Mär 2007 11:41

Re: Formular schliessen im "OnActivate"
 
ACHTUNG: OnActivate kann imho öfter ausgelöst werden. z.b. wenn das fenster den fokus verliert und ihn dann wieder erhaltet

TStringlist 10. Mär 2007 12:22

Re: Formular schliessen im "OnActivate"
 
Erzeug doch die Form immer dynamisch (wenn Du sie öfters brauchen solltest) und nimm dann das Release.

xZise 10. Mär 2007 12:29

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von gsh
ACHTUNG: OnActivate kann imho öfter ausgelöst werden. z.b. wenn das fenster den fokus verliert und ihn dann wieder erhaltet

Jo war mir klar, und habe deshalb eine Variable eingeführt, die einen bestimmten status zeigt (nicht gestartet, gestartet, beendet, fertiggestellt etc.) ;)

Zitat:

Zitat von TStringlist
Erzeug doch die Form immer dynamisch (wenn Du sie öfters brauchen solltest) und nimm dann das Release.

Hmmm... Aber irgendwie ist es jetzt bequemer :P

turboPASCAL 10. Mär 2007 12:42

Re: Formular schliessen im "OnActivate"
 
Das ist irgend wie Unsinnig.

Schribe eine extra Downloadprocedue oder Function. Am Ende Dieser schliesst du dein Formular einfach mit Close.

xZise 10. Mär 2007 13:04

Re: Formular schliessen im "OnActivate"
 
Das ist jetzt aber irgendwie seltsam :|
Im Test (ohne irgendetwas), schloss sich das Fenster wie erwartet, aber so nicht:
Delphi-Quellcode:
procedure TfrmInstall.FormActivate(Sender: TObject);
var
  lStream: TFileStream;
  fileData, extract : string;
  write : Boolean;
begin
  if status = NOT_STARTED then
  begin
    status := STARTED;
   
    item := 0;

    while status = STARTED do
    begin
      ind(item);
      if item > High(data) then
        status := FINISHED;
    end;
    bFinalize.Caption := 'Finalize';
  end;

  if (status = FINISHED) and (autoclose) then <!---
    close; <!---
end;
Und er springt auch in das Close; rein :|

turboPASCAL 10. Mär 2007 13:06

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von gsh
ACHTUNG: OnActivate kann imho öfter ausgelöst werden. z.b. wenn das fenster den Fokus verliert und ihn dann wieder erhaltet

:!:

:dp:

xZise 10. Mär 2007 13:10

Re: Formular schliessen im "OnActivate"
 
Und was soll mir das jetzt sagen?
  • Öffnen des Fensters - NOT_STARTED
  • Activate - STARTED
  • Deaktivted - STARTED
  • Wieder Activated - STARTED
  • Fertig - FINISHED
  • => Close?!

PS: Könnte es an ShowModal liegen?

Nuclear-Ping 10. Mär 2007 15:53

Re: Formular schliessen im "OnActivate"
 
Was ist zu "bequem" daran, eine saubere und wirklich funktionierende Lösung mit einem minimalen Mehraufwand zu schaffen?

Empfehle dir auch, die Form einfach dynamisch zu erzeugen, eine Downloadfunktion aufzurufen und diese nach Abschluss wieder mit Free zu schließen.

Delphi-Quellcode:
with TMyDownloadForm.Create (Self) do
  begin
    {...}
    Show;
    DownloadFile ({...});
    Free;  
  end;
Das kannst du auch in eine Prozedur hauen und dann per Parameter einfach die zu ladende Datei angeben. Damit hast du auch nicht mehr als eine Zeile zum Aufrufen der Funktion.

xZise 10. Mär 2007 17:55

Re: Formular schliessen im "OnActivate"
 
Aber das löst mein Problem nicht!
Weil wie kann ich nach "Showmodal" bei Aufrufer Code ausführen, ohne das ShowModal zu beenden...

PS: Anscheind ist da irgendwo ein bug drinne, weil es eigentlich ja funzt...

Jelly 10. Mär 2007 18:22

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von xZise
Weil wie kann ich nach "Showmodal" bei Aufrufer Code ausführen, ohne das ShowModal zu beenden...

Gar nicht. Und im OO Sinne ist das auch nicht ratsam. Dein 2. Form, das du anzeigst, ist nichts anderes wie eine Klasse, und diese Klasse soll sich um den Download alleine kümmern, und nicht die aufrufende Klasse. Übergib deinem Downloadformular den URL Link im constructor, und definiere eine public property im Downloadform, in der nach Beenden des Downloads der Dateiname oder sonst was drin steht wie z.B. Stream o.ä. Dann noch ein Statuscode, und Du kannst das Downloadformular universell einsetzen, auch in anderen Projekten.

dataspider 10. Mär 2007 18:33

Re: Formular schliessen im "OnActivate"
 
Hi,

wenn es denn unbedingt modal sein muss, dann setze im OnCreatein der Form Application.OnIdle.
In der Methode setzt du erst OnIdle wieder auf nil, dann führst du deinen Download aus und zum Schluss das Close.

Damit startet der Download erst, wenn das Form angezeigt wird etc.

Cu, Frank

[EDIT]
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := ApplicationIdle;
end;

procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
  Application.OnIdle := nil;
  // Dowloadroutine
  Application.ProcessMessages;
  Close;
end;
[/EDIT]

xZise 10. Mär 2007 18:57

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von dataspider
wenn es denn unbedingt modal sein muss

Ja muss es :P

Zitat:

Zitat von Jelly
Zitat:

Zitat von xZise
Weil wie kann ich nach "Showmodal" bei Aufrufer Code ausführen, ohne das ShowModal zu beenden...

Gar nicht. Und im OO Sinne ist das auch nicht ratsam.

Und genau deshalb funktioniert das dynamische Erstellen nicht!

Zitat:

Zitat von Jelly
Dein 2. Form, das du anzeigst, ist nichts anderes wie eine Klasse, und diese Klasse soll sich um den Download alleine kümmern, und nicht die aufrufende Klasse. Übergib deinem Downloadformular den URL Link im constructor, und definiere eine public property im Downloadform, in der nach Beenden des Downloads der Dateiname oder sonst was drin steht wie z.B. Stream o.ä. Dann noch ein Statuscode, und Du kannst das Downloadformular universell einsetzen, auch in anderen Projekten.

Und genau das kann mein Formular ;) (Zwar soll es nicht umbedingt universell sein... Aber es ist eine netter Nebeneffekt)

Zu dataspiders lösung: So müsste es gehen...

Jelly 10. Mär 2007 21:19

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von xZise
Und genau deshalb funktioniert das dynamische Erstellen nicht!

Ich muss mich mal grad am Kopf kratzen, denn das muss ich jetzt irgendwie verstehen.

Du kannst doch was dynamisch erstellen, ausführen, und zu deiner Hauptprozedur zurückkehren. Dein Showmodal wartet doch darauf bis das Form geschlossen wird. Oder versteh ich da jetzt alles verkehrt?

Nuclear-Ping 10. Mär 2007 22:42

Re: Formular schliessen im "OnActivate"
 
Wenn es unbedingt Modal sein muss, dann mach die Downloadroutine in einen Thread (Forumssuche nach TThread oder Google) und rufe diese vor ShowModal auf.
Delphi-Quellcode:
with TMyDownloadForm.Create (Self) do
  begin
    {...}
    DownloadFile ({...}); // Startet einen Thread zum DL
    ShowModal;
    Free;  
  end;

xZise 11. Mär 2007 08:22

Re: Formular schliessen im "OnActivate"
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von xZise
Und genau deshalb funktioniert das dynamische Erstellen nicht!

Du kannst doch was dynamisch erstellen, ausführen, und zu deiner Hauptprozedur zurückkehren.

Genau das war der Plan... ABER er macht es nicht! Und da ändert auch kein dynamisches Erstellen...

Hawkeye219 11. Mär 2007 09:02

Re: Formular schliessen im "OnActivate"
 
Hallo Fabian,

schau dir doch einmal diesen Thread an, hoika zeigt dort eine Lösung für dein Problem.

Gruß Hawkeye


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