Delphi-PRAXiS

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 Form nicht-modal mit eigenem Taskleitsten Eintrag erstellen (https://www.delphipraxis.net/140584-form-nicht-modal-mit-eigenem-taskleitsten-eintrag-erstellen.html)

Zacherl 21. Sep 2009 16:59


Form nicht-modal mit eigenem Taskleitsten Eintrag erstellen
 
Hey,

wie kann ich in meinem Programm zur Laufzeit ein Formular erstellen, dass ..

1) .. einen eigenen Eintrag in der Taskleiste besitzt
2) .. nicht modal angezeigt wird
3) .. hinter das Hauptfenster "rutschen" kann

Delphi-Quellcode:
procedure TfrmMain.bbSocketSettingsClick(Sender: TObject);
begin
  frmSockets := TfrmSockets.Create(Application);
  try
    frmSockets.PageControl.ActivePageIndex := 0;
    frmSockets.btnApply.Enabled := false;
    frmSockets.Show;
  finally

  end;
end;
Bisher wird das Formular nicht modal angezeigt, kann aber aus irgendwelchen Gründen nicht vom Hauptfenster verdeckt werden, sprich die erzeugen Child Fenster liegen IMMER über dem Main Window. Einen eigenen Taskleisten Eintrag haben sie auch nicht.

Viele Grüße
Zacherl

Zacherl 29. Sep 2009 20:12

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Ich pushe hier nochmal und beschränke meine Frage folgendermaßen:

Wie kann ich verhindern, dass meine zur Laufzeit erstellten Fenster immer vor dem Hauptfenster sind und nicht dahinter rutschen können?

himitsu 29. Sep 2009 20:30

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
irgendwie wiederspricht sich hier einiges ... Modal bedeutet ja, daß die anderen (Parent)Forms nicht aktiv sind ... also wozu soll man dann die einzig aktive Form dann hinter diesen verstecken wollen?

Zacherl 29. Sep 2009 20:33

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Nein pass auf ich habe mein TfrmMain, welches das Hauptfenster ist. Dann erstelle ich ein TfrmSubForm. Als Parent nehme ich Application und ich zeige das Fenster mit der Show() [nicht der ShowModal()] Methode an.

Dieses Fenster liegt nun allerdings IMMER über TfrmMain. Selbst wenn ich TfrmMain anklicke und somit den Fokus gebe, bleibt TfrmSubForm immer vor TfrmMain im Vordergrund. Dieses Verhalten würde ich gerne abschalten.

Chris.R 30. Sep 2009 07:38

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Hallo,

hat die Eigenschaft FormStyle von TSubForm eventuell den Wert fsStayOnTop? Dann musst du den wieder auf fsNormal stellen.

Um dem zweiten Fenster einen eigenen Eintrag in der Taskleiste zu spendieren, musst du folgende Funktion z.B. im FormCreate
aufrufen:

Delphi-Quellcode:
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);

Ciao Chris

Zacherl 30. Sep 2009 10:59

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Danke dir für deine Antwort, das mit der Taskleiste funktioniert schonmal. Der Wert von FormStyle war allerdings auf fsNormal (hatte da auch nichts dran geändert). Das Formular ist ja auch nicht im Vordergrund aller geöffneten Fenster.

Sagen wir ich erstelle 2 SubForms, dann kann ich durch Anklicken entweder das eine oder das andere Fenster in den Vordergrund holen. Währenddessen wird das jeweils andere SubForm verdeckt oder zumindest teilweise verdeckt. Klicke ich aber auf das MainForm, so wird dieses zwar aktiviert, die zwei SubForms bleiben aber dennoch im Vordergrund =/

Chris.R 30. Sep 2009 11:40

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Ist TSubForm direkt von TForm abgeleitet? Wurde in dem Formular die Funktion CreateParams überschrieben?
Hast du mal eine leere Form hinzugefügt und mal probiert, ob die sich genauso verhält?

btw: fsStayOnTop bedeutet nicht, das das Fenster über allen Fenstern liegt, sondern nur über allen Fenstern deiner Anwendung.

Ciao Chris

Zacherl 30. Sep 2009 14:39

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Zitat:

Zitat von Chris.R
Ist TSubForm direkt von TForm abgeleitet?

Jap

Zitat:

Zitat von Chris.R
Wurde in dem Formular die Funktion CreateParams überschrieben?

Nein

Zitat:

Zitat von Chris.R
Hast du mal eine leere Form hinzugefügt und mal probiert, ob die sich genauso verhält?

Jap, verhält sich genauso. Auch in einem komplett neuen Projekt, können die SubForms niemals hinter das MainForm rutschen.

Chris.R 30. Sep 2009 16:53

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Hallo,

kannst du mir evtl mal ein kleines Projekt hochladen, das den Fehler demonstriert?
Es reicht, wenn nur eine Hauptform mit Button drauf ist, das ein SubForm anzeigt.

Bei mir kann ein SubForm auch hinter dem MainForm liegen.

Ciao Chris

Zacherl 30. Sep 2009 17:42

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier die kleine Demo. EXE liegt auch bei. Vielleicht ist es ja ein generelles Problem unter D2010?

Chris.R 1. Okt 2009 09:17

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Ich glaub du hast den Delphi Virus auf deinem System:

Delphi Virus


Auf jedenfall sind jetzt alle Exen die ich mit Delphi erstell mit Virusmeldung von AntiVir

FEHLALARM: War wohl ein anderes Programm, was ich kurz vorher installiert hab :oops:

Ciao Chris

Chris.R 1. Okt 2009 09:59

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Hallo,

hab grad dein Projekt getestet. Bei deiner Exe hab ich das gleiche Problem wie du, wenn ich das Projekt mit Delphi 7 neu übersetze, dann funktioniert alles wie gewünscht.

Du hast Delphi 2010? Wenn du noch eine ältere Version von Delphi hast, kannst du ja mal TCustomForm in der Unit Forms.pas mit alten Version vergleichen,
interessant wär hier die Stelle CreateParams. Kannst ja in der SubForm das CreateParams auch mal überschreiben:

Delphi-Quellcode:
TForm4 = class(TForm)
    Button1: TButton;
  private
    { Private-Deklarationen }
  protected
    procedure CreateParams(var AParams: TCreateParams); override;
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TForm4 }

procedure TForm4.CreateParams(var AParams: TCreateParams);
begin
  inherited;

  AParams.ExStyle := AParams.ExStyle and not WS_EX_TOPMOST;
end;
Und nochmal sorry für den Fehlalarm.


Ciao Chris

Zacherl 2. Okt 2009 13:16

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Danke für deine Antwort, werde das zu Hause mal testen. Den Sourcecode kann ich leider nicht vergleichen, da bei der Demo glaube ich keine Sourcen dabei sind.
Ich versuche mal das CreateParams zu überschreiben.

Vermutlich handelt es sich hier um einen Bug in D2010 :)

Edit: Kann leider vermutlich erst am Sonntag oder Montag Rückmeldung geben, da mein Anbieter zur Zeit Wartungsarbeiten an der Leitung durchführt =/

Chris.R 2. Okt 2009 13:28

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Hallo,

so lange offline :pale: Das macht nix, ich bin eh übers Wochenende nicht da.

Du solltest den Fehler dann auch mal ans Quality Central Embarcadero melden, wenn sich keine Lösung findet.

Ciao Chris

Zacherl 4. Okt 2009 10:40

Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
 
Irgendwie wird der Parent nicht korrekt übernommen. Es hat nun endlich funktioniert, indem ich CreateParams überschrieben habe und AParams.ParentWindow auf Application.Handle gesetzt habe :) Danke für deine Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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