Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Wie kann man das Mainform "disablen" (nicht anzeigen) ? (https://www.delphipraxis.net/120327-wie-kann-man-das-mainform-disablen-nicht-anzeigen.html)

ralfiii 9. Sep 2008 11:26


Wie kann man das Mainform "disablen" (nicht anzeig
 
Hallo!

Ich hab eine Anwendung, die - wenn sie "normal" gestartet wird - als Hauptforumlar eine Art Vorauswahl anzeigt, wo man wählen kann, was man tun will.

Diese Auswahl kann man durch einen Kommandozeilenparameter überspringen.
Nur spinnt in dem Fall die Anwendung dann leider ein wenig (z.B. wird kein Taskbareintrag angezeigt und VirtualTreeView hat irgendwelche Threadprobleme beim animierten Ausblenden von Hints).

Im Moment sieht das im Projectfile so aus:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.HintHidePause:=5000;

  if ParamCount>0 then
  begin
          if xxx then
             with TfrmRename.Create(Application) do
             begin
                  Execute(yyy);
                  Free;
             end
  end
  else
      Application.CreateForm(TfrmTestBoard, frmTestBoard);
  Application.Run;
end.
Wie wäre es denn besser?
Vielen Dank für eure Anregungen!

Meflin 9. Sep 2008 11:30

Re: Wie kann man das Mainform "disablen" (nicht an
 
Vielleicht ein simples
Delphi-Quellcode:
Application.ShowMainForm := false
:?:

ralfiii 9. Sep 2008 12:10

Re: Wie kann man das Mainform "disablen" (nicht an
 
Zitat:

Zitat von Meflin
Vielleicht ein simples
Delphi-Quellcode:
Application.ShowMainForm := false

Dann ist zwar ein Taskbareintrag da, aber das VirtualStringTree spinnt noch immer herum.

Lustig: im "bösen" Modus (sprich: wenn ich das Hauptformular nicht anzeige) wird beim Anzeigen eines Hinttextes im Ereignisprotokoll der Delphi-IDE ein "Thread-Start" und das "Thread-Ende" angezeigt. Im Normalfall passiert das nicht. (was auch immer das heissen mag)

Bbommel 9. Sep 2008 13:16

Re: Wie kann man das Mainform "disablen" (nicht an
 
Ich habe auch so einen Fall, dass ich mal das Hauptformular nicht anzeigen will und durch Parameter das Programm dann automatisch etwas tun soll. Ich habe es allerdings so gelöst, dass das Hauptform dennoch erzeugt und nur nicht angezeigt wird - die eigentliche Verarbeitung von Parametern erfolgt dann bei mir auch nicht in der Projektdatei, sondern im FormActivate des Hauptforms (hat den Vorteil, dass ich da dann auch Dinge anstellen kann, die doch das Hauptform brauchen - außerdem sollten dann auch wirklich alle nötigen Dinge initialisiert sein, was bei dir ja ggf. das Problem ist).

Also, in der Projektdatei dann sowas:

Delphi-Quellcode:
Application.CreateForm(Tmain, main);
// ... weitere nötige Forms erzeugen...
if paramCount>0 then begin
  Application.showMainForm:=false;
  main.FormActivate(nil);  // das hier ist nötig, weil "OnActive" durch
                            // show=false nicht mehr aufgerufen wird
end;
Und dann im main-Form:

Delphi-Quellcode:
procedure Tmain.FormActivate(Sender: TObject);
begin
  if firstRun then begin
    firstRun:=false;  // wurde in FormCreate auf true gesetzt...
   
    if paramCount>0 then begin
      // mach hier das Zeugs, das automatisch passieren soll...
    end;
  end;
end;
Klappt eigentlich ganz gut. In Wahrheit prüfe ich in der Projektdatei noch, ob bei den Parametern einer dabei ist, der überhaupt für ein Verstecken des Hauptforms sorgen soll, aber das sind Details... ;)

Bis denn
Bommel

ralfiii 9. Sep 2008 14:48

Re: Wie kann man das Mainform "disablen" (nicht an
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Bbommel
Ich habe auch so einen Fall,
<Snip>

So ein MIST!

Ich hab das jetzt (voller Vorfreude) probiert, gleiches Problem wie immer.
Ich hab ein Zwergen-Demo-Projekt mal angehängt bei dem das Problem auftritt.
Um's compilieren zu können muss VirtualTreeView installiert sein.

Der Fehler: Wenn man die Anwendung mit einem Kommandozeilenparameter startet, kommt nur das TreeView-Fenster.
Wenn man dort über einen Eintrag hovert, wird ein Hinttext angezeigt.
Zieht man die Maus nun zügig kurz nach unten und dann vom Formular, so gibt's eine Exception.
Startet man die Anwendung ohne parameter tritt dieser Fehler nicht auf.

Hilfe!!!!

Bbommel 9. Sep 2008 15:06

Re: Wie kann man das Mainform "disablen" (nicht an
 
Edit vorab: Hm, vergiss das mal, der Fehler tritt immer noch manchmal auf, sorry. Ist halt doch nicht allzu leicht zu reproduzieren. Manchmal gehts nämlich. :-(

Bei mir läuft es, nachdem ich folgendes gemacht habe:

In der Projektdatei habe ich:

Delphi-Quellcode:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2); // also auch hier erzeugen...
Und den Code dann entsprechend umgeformt, also in Unit1:

Delphi-Quellcode:
procedure TForm1.butShowModuleClick(Sender: TObject);
begin
  Form2.ShowModal;
end;
Und in Unit2 dann natürlich noch das

Delphi-Quellcode:
var
  Form2: TForm2;
...ergänzen.

Ist natürlich jetzt nicht mehr so "schön", weil dein Form2 nicht mehr dynamisch erzeugt wird, aber offensichtlich wird da sonst noch irgendwas nicht richtig initialisiert. Jetzt kannst du natürlich noch tiefer wühlen und dafür die Ursache finden oder du machst es doch so und es läuft. Kommt halt drauf an, wie schön und ressourcenschonend du programmieren willst/musst.

Bis denn
Bommel

ralfiii 9. Sep 2008 15:16

Re: Wie kann man das Mainform "disablen" (nicht an
 
Zitat:

Zitat von Bbommel
Bei mir läuft es
<Snip>

Läuft trotzdem nicht.

Den Fehler auszulösen ist ein bisserl eine Timing-Sache.
Du musst mit der Maus so drüberfahren, dass der Hinttext auftaucht, dann in einem flotten Rutsch von dem Formular runter, aber so mit der Maus dass du bei einer anderen Zelle vorbeikommst und dort auch schon angefangen wird der Hinttext anzuzeigen.
(also hier eine Kurve zuerst nach unten dann nach links und links raus aus dem Fenster)

Ich schaff das mitterweile jedesmal und ich hab Angst das meine Kunden dann ähnlich "talentiert" sind.

Bbommel 9. Sep 2008 15:51

Re: Wie kann man das Mainform "disablen" (nicht an
 
Okay, einen hab ich noch. ;)

Ich glaube jetzt mal wieder, dass es läuft, aber bin auch noch nicht so zielsicher im Fehler-Nachstellen wie du selbst (aber keine Sorge, deine Kunden werden das auch schon schaffen, ich kenn das... ;) )

Projektdatei:

Delphi-Quellcode:
if ParamCount>0 then
begin
     Application.MainFormOnTaskbar := False;
     Application.showMainForm:=false;
     Form1.FormActivate(nil);
end;
Application.Run;
Also, application.run immer ausführen.

In der Unit1:

Delphi-Quellcode:
procedure TForm1.butShowModuleClick(Sender: TObject);
begin
  if ParamCount>0 then
    Form2.Show
  else
    Form2.ShowModal;
end;
So ist zumindest die Zugriffsverletzung weg. Aber: So schließt die Applikation nicht mehr ordentlich, wenn Form2 geschlossen wird. Das müsstest du dann noch irgendwie abfangen.

Sieht also so aus, als bräuchte das VirtualTreeView irgendwas, was erst durch das Apllication.Run gesetzt wird (da läuft ja immer HandleMessages, wahrscheinlich fehlt das dann, aber dazu habe ich mich noch nie tief genug da reinarbeiten müssen, um das sicher sagen zu können). Sollte vielleicht mal zum weitersuchen helfen.

Ach ja, eine Idee noch: Ich hatte es auch schon mal irgendwa,, dass ich diesen ganzen Parameter-Kram erst in einem Timer ausgewertet habe, der nach einigen Millisek. ansprang. Da könntest du dann auch das Form2 Modal anzeigen und trotzdem das Apllication.Run vorher aufrufen. Allerdings ist das natürlich auch nicht so richtig sauber. Aber der Kunde würde keine komischen Fehler sehen... ;)

Bis denn
Bommel

Bbommel 9. Sep 2008 15:59

Re: Wie kann man das Mainform "disablen" (nicht an
 
Noch eine Ergänzung (irgendwie reizt mich das jetzt):

So gehts auch immer und das Programm schließt auch ordentlich. Allerdings hab ich natürlich keine Ahnung, ob das auch für dein echtes Projekt tauglich ist:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if ParamCount>0 then begin
    Application.CreateForm(TForm2, Form2);
    Application.CreateForm(TForm1, Form1);
  end else begin
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
  end;

  Application.Run;
end.
Das OnActivate im Form1 kannst du dann löschen.

sirius 9. Sep 2008 16:11

Re: Wie kann man das Mainform "disablen" (nicht an
 
Ich würde mal das Hauptformular ändern. Also den Status Hauptformular einem anderen Formular zuweisen.


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

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