![]() |
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:
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.
procedure TfrmMain.bbSocketSettingsClick(Sender: TObject);
begin frmSockets := TfrmSockets.Create(Application); try frmSockets.PageControl.ActivePageIndex := 0; frmSockets.btnApply.Enabled := false; frmSockets.Show; finally end; end; Viele Grüße Zacherl |
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? |
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?
|
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. |
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 |
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 =/ |
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 |
Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
Zitat:
Zitat:
Zitat:
|
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 |
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?
|
Re: Form nicht-modal mit eigenem Taskleitsten Eintrag erstel
Ich glaub du hast den Delphi Virus auf deinem System:
![]() 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 |
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:
Und nochmal sorry für den Fehlalarm.
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; Ciao Chris |
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 =/ |
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 ![]() Ciao Chris |
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