![]() |
Re: Mainform verstecken
Zitat:
bei D7 EE aufjedenfall nicht, mit de befehl Application.Mainform.Show; gehts aber THX |
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:
im OnCreate oder im Quelltext verwende, funktioniert meine Applikation nicht ordnungsgemäss weil das OnActivate Event nicht mehr ausgeführt wird.
Application.ShowMainForm := false;
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:
Danke für die Hilfe,
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; Gruss Int3g3r |
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:
Ungetestet hingedaddelt.
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; |
AW: Mainform verstecken
Zitat:
Mein Programm hat damals auch auf FormShow aufgebaut. Der notwendige Refactor, um all den Quark auszubessern, hat Monate gedauert. |
AW: Mainform verstecken
Zitat:
|
AW: Mainform verstecken
Zitat:
|
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:
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.
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; |
AW: Mainform verstecken
Zitat:
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 ...)? |
AW: Mainform verstecken
Zitat:
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. |
AW: Mainform verstecken
Hallo,
Zitat:
Allerdings steht bei mir als erste Zeile OnActivate := nil; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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