AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wie kann man das Mainform "disablen" (nicht anzeigen) ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann man das Mainform "disablen" (nicht anzeigen) ?

Ein Thema von ralfiii · begonnen am 9. Sep 2008 · letzter Beitrag vom 9. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#1

Wie kann man das Mainform "disablen" (nicht anzeig

  Alt 9. Sep 2008, 12:26
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!
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

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

  Alt 9. Sep 2008, 12:30
Vielleicht ein simples
Application.ShowMainForm := false
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 9. Sep 2008, 13:10
Zitat von Meflin:
Vielleicht ein simples
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)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 9. Sep 2008, 14:16
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
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 9. Sep 2008, 15:48
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!!!!
Angehängte Dateien
Dateityp: zip commandlineproblem_209.zip (4,8 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 9. Sep 2008, 16:06
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
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#7

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

  Alt 9. Sep 2008, 16:16
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.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 9. Sep 2008, 16:51
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
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 9. Sep 2008, 16:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 9. Sep 2008, 17:11
Ich würde mal das Hauptformular ändern. Also den Status Hauptformular einem anderen Formular zuweisen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
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