![]() |
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:
Wie wäre es denn besser?
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. Vielen Dank für eure Anregungen! |
Re: Wie kann man das Mainform "disablen" (nicht an
Vielleicht ein simples
Delphi-Quellcode:
:?:
Application.ShowMainForm := false
|
Re: Wie kann man das Mainform "disablen" (nicht an
Zitat:
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) |
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:
Und dann im main-Form:
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;
Delphi-Quellcode:
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... ;)
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; Bis denn Bommel |
Re: Wie kann man das Mainform "disablen" (nicht an
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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!!!! |
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:
Und den Code dann entsprechend umgeformt, also in Unit1:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2); // also auch hier erzeugen...
Delphi-Quellcode:
Und in Unit2 dann natürlich noch das
procedure TForm1.butShowModuleClick(Sender: TObject);
begin Form2.ShowModal; end;
Delphi-Quellcode:
...ergänzen.
var
Form2: TForm2; 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 |
Re: Wie kann man das Mainform "disablen" (nicht an
Zitat:
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. |
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:
Also, application.run immer ausführen.
if ParamCount>0 then
begin Application.MainFormOnTaskbar := False; Application.showMainForm:=false; Form1.FormActivate(nil); end; Application.Run; In der Unit1:
Delphi-Quellcode:
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.
procedure TForm1.butShowModuleClick(Sender: TObject);
begin if ParamCount>0 then Form2.Show else Form2.ShowModal; end; 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 |
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:
Das OnActivate im Form1 kannst du dann löschen.
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. |
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 21:51 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 by Thomas Breitkreuz