Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mainform verstecken (https://www.delphipraxis.net/26907-mainform-verstecken.html)

the_seed 31. Jul 2004 23:08

Re: Mainform verstecken
 
Zitat:

Zitat von Meflin
im übrigen sollte auch application.showmainform := true die mainform wieder sichtbar machen. bei mir tut es das zumindest...

sollte :wink:
bei D7 EE aufjedenfall nicht, mit de befehl Application.Mainform.Show;
gehts aber THX

Int3g3r 27. Jun 2019 15:26

AW: Mainform verstecken
 
Guten Tag,

Ich stehe gerade vor einem ähnlichen Problem und habe diesen Thread gefunden.

Wenn ich meine Applikation mit Parameter starte soll nur ein Progressbar erscheinen. Das mainForm soll versteckt werden, nach Abschluss soll sich das Programm selbst schliessen.
Wenn ich meine Applikation ohne Parameter starte soll das mainForm angezeigt werden.

Mein Problem ist nun das ich noch nicht ganz verstehe wie eine Applikation aufgebaut wird.
Wenn ich in meinem Projekt
Delphi-Quellcode:
Application.ShowMainForm := false;
im OnCreate oder im Quelltext verwende, funktioniert meine Applikation nicht ordnungsgemäss weil das OnActivate Event nicht mehr ausgeführt wird.
Leider kann ich den Code im OnActivate nicht im OnCreate laufen lassen weil sich sonst die Applikation nach Abschluss nicht mehr selbst schliessen kann.

Warum wird das OnActivate nicht mehr ausgeführt ?
Wie lässt sich das verstecken des mainForms in meinem Fall erreichen?
Wenn möglich möchte ich den aufbau des mainForms nie sehen(kein geflacker) wenn ich parameter benutze.
Es sollte nur virtuell existieren.


Delphi-Quellcode:
program hcFileTransfer;

uses
  Forms,
  ftpprogressf in 'ftpprogressf.pas' {FormFtpprogressf},
  ftpf in 'ftpf.pas' {formFTP},
  ftpdialogf in 'ftpdialogf.pas' {FormFtpdialog};

begin
  Application.Initialize;
   if ParamCount > 1 then
   Application.ShowMainForm := false; // -> onActivate wird nicht mehr ausgeführt.
  Application.Title := 'hcFTP';
  Application.CreateForm(TformFTP, formFTP);
  Application.Run;
end.



procedure TformFTP.FormCreate(Sender: TObject);
begin
   FormFtpdialog := TFormFtpdialog.Create(self);
   FormFtpprogress := TFormFtpprogress.Create(self);
   State := OffLineConst;
   LocFileSizes := TStringList.Create;
   RemFileSizes := TStringList.Create;
   ComboBoxLocHistory.Items.Insert(0, GetCurrentDir);
   ComboBoxLocHistory.ItemIndex := 0;
   RadioGroupTransferMode.ItemIndex := 2;
   UpdateLocal;
   UpdateButtons;
   readSettings;
   if (edtLocalPath.Text <> '') and (edtLocalPath.Text <> ComboBoxLocHistory.Items[0]) then
   begin
      chDir(edtLocalPath.Text);
      ComboBoxLocHistory.Items.Insert(1, edtLocalPath.Text);
      ComboBoxLocHistory.ItemIndex := 1;
   end;
end;



procedure TformFTP.FormActivate(Sender: TObject);
begin
    if ParamCount > 0 then
   begin
      if lowercase(ParamStr(1)) = '-up' then
      begin
         parameterUpload; //Lade datei Hoch
         Close; // Close kann nicht im onCreate Event ausgeführt werden.
      end
      else if lowercase(ParamStr(1)) = '-down' then
      begin
         parameterDownload; //Lade date Herunter
         Close; // Close kann nicht im onCreate Event ausgeführt werden.
      end
      else
      begin
         showmessage('Ungültige Parameter!');
         Application.Terminate;
      end;
   end;
end;
Danke für die Hilfe,
Gruss Int3g3r

Delphi.Narium 27. Jun 2019 15:42

AW: Mainform verstecken
 
Steck doch den wesentlichen Code aus dem FormActivate in eine eigene Methode und rufe die dann wahlweise im FormActivate oder an beliebiger anderer Stelle auf.
Delphi-Quellcode:
program hcFileTransfer;

uses
  Forms,
  ftpprogressf in 'ftpprogressf.pas' {FormFtpprogressf},
  ftpf in 'ftpf.pas' {formFTP},
  ftpdialogf in 'ftpdialogf.pas' {FormFtpdialog};

begin
  Application.Initialize;
  Application.ShowMainForm := ParamCount > 1;
  Application.Title := 'hcFTP';
  Application.CreateForm(TformFTP, formFTP);
  if Application.ShowMainForm then begin
    Application.Run;
  end else begin
    // Hier die "neue" Methode aufrufen,
    formFTP.DoIt;
  end;
end.
Delphi-Quellcode:
procedure TformFTP.DoIt;
begin
   if ParamCount > 0 then
   begin
      if lowercase(ParamStr(1)) = '-up' then
      begin
         parameterUpload; //Lade datei Hoch
      end
      else if lowercase(ParamStr(1)) = '-down' then
      begin
         parameterDownload; //Lade date Herunter
      end
      else
      begin
         showmessage('Ungültige Parameter!');
      end;
      Close;
   end;
end;

procedure TformFTP.FormActivate(Sender: TObject);
begin
  DoIt;
end;
Ungetestet hingedaddelt.

DieDolly 27. Jun 2019 17:38

AW: Mainform verstecken
 
Zitat:

Wenn ich in meinem Projekt Application.ShowMainForm := false; im OnCreate oder im Quelltext verwende, funktioniert meine Applikation nicht ordnungsgemäss weil das OnActivate Event nicht mehr ausgeführt wird.
Ich empfehle dir, dich vom OnActivate-Event wenn irgendwie möglich zu trennen.
Mein Programm hat damals auch auf FormShow aufgebaut. Der notwendige Refactor, um all den Quark auszubessern, hat Monate gedauert.

Uwe Raabe 27. Jun 2019 22:46

AW: Mainform verstecken
 
Zitat:

Zitat von DieDolly (Beitrag 1435513)
Ich empfehle dir, dich vom OnActivate-Event wenn irgendwie möglich zu trennen.
Mein Programm hat damals auch auf FormShow aufgebaut. Der notwendige Refactor, um all den Quark auszubessern, hat Monate gedauert.

Oh, ich wurde schon mit Code konfrontiert, bei dem die haarsträubendsten Dinge im FormPaint passierten - auch schon mal Aufrufe von FormActivate oder FormResize.:roll:

Rollo62 28. Jun 2019 05:55

AW: Mainform verstecken
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1435525)
Zitat:

Zitat von DieDolly (Beitrag 1435513)
Ich empfehle dir, dich vom OnActivate-Event wenn irgendwie möglich zu trennen.
Mein Programm hat damals auch auf FormShow aufgebaut. Der notwendige Refactor, um all den Quark auszubessern, hat Monate gedauert.

Oh, ich wurde schon mit Code konfrontiert, bei dem die haarsträubendsten Dinge im FormPaint passierten - auch schon mal Aufrufe von FormActivate oder FormResize.:roll:

Warum nicht, das ist dann wie malen auf Gummi :lol:

Jasocul 28. Jun 2019 06:22

AW: Mainform verstecken
 
Ich mache diesen ganzen Zirkus mit Application.ShowMainForm gar nicht erst.
Für solche Variationen beim Programmstart sieht meine dpr-Datei so aus:
Delphi-Quellcode:
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TdtmMain, dtmMain);
  Application.CreateForm(TfrmMain, frmMain);
  if ParamCount >= 3 then
  begin
    frmMain.DoJobs;
    frmMain.Close;
  end
  else
  begin
    Application.Run;
  end;
Ich mache also bei parametergesteuertem Aufruf gar kein Application.Run. Dafür habe ich eine eigene Methode "DoJobs", die dann die automatisierten Prozesse durchführt. Dort eine Fortschrittsanzeige einzubauen sollte problemlos möglich sein. Ich hatte bisher keinen Bedarf für eine Anzeige, da das bei mir in der Regel zeitgesteuerte Prozesse sind, die keine Visualisierung erfordern. Theoretisch könnte man dafür auch ein Konsolen-Programm schreiben, aber bei Bedarf nutze ich solche Anwendungen auch mit GUI. Da ist ein Konsolenprogramm nicht mehr so praktisch.

Delphi.Narium 28. Jun 2019 08:31

AW: Mainform verstecken
 
Zitat:

Zitat von Jasocul (Beitrag 1435528)
Ich mache also bei parametergesteuertem Aufruf gar kein Application.Run. Dafür habe ich eine eigene Methode "DoJobs", die dann die automatisierten Prozesse durchführt. Dort eine Fortschrittsanzeige einzubauen sollte problemlos möglich sein. Ich hatte bisher keinen Bedarf für eine Anzeige, da das bei mir in der Regel zeitgesteuerte Prozesse sind, die keine Visualisierung erfordern. Theoretisch könnte man dafür auch ein Konsolen-Programm schreiben, aber bei Bedarf nutze ich solche Anwendungen auch mit GUI. Da ist ein Konsolenprogramm nicht mehr so praktisch.

Das ist meiner Meinung nach die einzige, sinnvolle Variante.

Und das Schöne daran: Banal einfach zu implementieren.

Setzt halt voraus, das man Progammsteuerungslogik nicht von irgendwelchen Anzeigeereignissen abhängig macht (was ich übrigens für einen sehr schlechten Programmierstil halte).

'ne Datei im FormActivate zu laden, ist keine besonders gute Idee. Was ist denn, wenn ein Formular mehrfach aktiviert wird? Wird die Datei dann mehrfach geladen? Jedes Mal, wenn man das Programm in den Vordergrund holt (und dann wieder in den Hintergrund schiebt, weil einem das Laden der Datei zu lange dauert, um danach das Programm wieder in den Vordergrund zu holen, weil das Laden endlich fertig ist, was zu einem erneuten Laden der Datei führt, weshalb man es für diese Zeit wieder in den Hintergrund schiebt, um danach das Programm wieder in den ...)?

jziersch 28. Jun 2019 08:36

AW: Mainform verstecken
 
Zitat:

Ich mache diesen ganzen Zirkus mit Application.ShowMainForm gar nicht erst.
Kann ich nur zustimmen.

Wenn Du in Delphi under 'Projekt' den Menü Eintrag "Quelltext anzeigen" wählst, siehst Du den code der beim Start eines Projektes abläuft.

Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;

Das Formular welches als erstes erzeugt wird, wird dann auch angezeigt und gestartet.

In diesem Fall wäre dies "ProgressBar"

Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TProgessBar, ProgessBar);
Application.CreateForm(TForm1, Form1);
Application.Run;

welches dann den Job anstossen könnte und dann das Programm wieder beenden. Dabei kann dann das MainForm (also Form1) verwendet werden, ohne dass es angezeigt wird.
Wenn Du kein Form anzeigen willst, dann ist der "DoJobs" Ansatz perfekt.

hoika 28. Jun 2019 10:40

AW: Mainform verstecken
 
Hallo,

Zitat:

ne Datei im FormActivate zu laden, ist keine besonders gute Idee. Was ist denn, wenn ein Formular mehrfach aktiviert wird?
Das mache ich immer so.

Allerdings steht bei mir als erste Zeile
OnActivate := nil;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.
Seite 2 von 3     12 3      

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