![]() |
Hauptformular ausblende beim wechsel auf ein anderes Form ?
Hallo, wer kann mir helfen bin Neuling :P in Delphi.
Ich habe folgendes Problem: habe ein Programm das mit einem Form1 startet.Auf diesem Form1 habe ich Buttons die weiter Formulare öffnen (Form2,3,4,5 usw.)soweit funktioniert es. Nur leider sind immer beide Formulare sichtbar. Wie kann ich machen ,dass nur noch Form2 sichtbar ist und das Form1=Mainform verschwindet.Auf dem Form2 ist dann wieder ein Button mit dem ich zurück auf Form1 komme. Danke für Eure Hilfe cu Megabyte :coder: |
Hi Megabyte,
du kannst doch einfach im OnShow-Ereignis von Form 2/3/4/5 Form1.Hide eintragen, beim Klick auf den Button, der zu Form1 zurückführt, dann Form1.Show. MfG, d3g |
Moin MegaByte,
herzlich willkommen in der Delphipraxis. Die Formulare habe eine Eigenschaft Visible. Wird diese auf false gesetzt, so wird das Formular ausgeblendet. Das gilt natürlich auch für das MainForm. [EDIT]Mist, zu spät :mrgreen:[/EDIT] |
Irgend wie versteh ich das nicht wie das geht mit der onshow funktion
Habe folgenden Code:
Delphi-Quellcode:
wer weiss wie ich den code modifizieren muss dass Form1 unsichtbar wird wenn Form2 lädt???
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2,Unit3,Unit4,Unit5; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Form2.Showmodal; Form1.hide end; Danke für eure Hilfe Megabyte :P |
Moin Megabyte,
die Methode ShowModal zeigt das Formular an (in Deinem Falle also Form2) und wartet darauf, dass es geschlossen wird. Folge: Form1.Hide wird erst aufgerufen, wenn Form2 wieder geschlossen wird. Wenn Du die beiden Zeilen vertauscht klappts. Der von d3g vorgeschlagene Weg sieht ähnlich aus:
Delphi-Quellcode:
// Mit Button1 auf Form1 wird Form2 angezeigt
procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; end; // Wird Form2 angezeigt, dann wird Form1 ausgeblendet procedure TForm2.FormShow(Sender: TObject); begin Form1.Hide; end; // Wird Form2 wieder geschlossen, so wird Form1 wieder angezeigt procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.Show; end; |
Delphi-Quellcode:
// unit Unit1
procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; // ----- // unit Unit2 procedure TForm2.FormShow(Sender: TObject); begin Form1.Hide; end; procedure TForm2.Button1Click(Sender: TObject); begin Hide; Form1.Show; end; |
Hi,
das mit dem Showmodal habe ich noch nicht ganz kapiert. Vermute aber, daß es bei mir auch Ärger macht. Kann mir das mal jemand kurz erklären ? Das taucht überall auf, aber ich weiß nicht recht damit was anzufangen. Gruß Hansa P.S.: Sowas steht bei mir auch auf der Liste unerledigt, die halt nicht erledigt wird. :mrgreen: |
ShowModal bedeutet, dass dein Form in deiner Anwendung im Vordergrund steht, du deswegen kein anderes Form aktivieren kannst... (ganz einfach)
Chris |
Hallo Hansa,
sobald Du ein weiteres Fenster mit ShowModal öffnest, so hast Du nur noch auf dieses ein Zugriff, nicht mehr auf das hintere. Threads und Schleifen der Unit1, bleiben z.B. auch stehen, so lange, bist Du Form2 wieder geschlossen hast, solltest Du probleme haben, öffne die Fenster mal nur mit Show, anstatt mit ShowModal. Grüsse, Daniel :hi: |
AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
Hallo zusammen,
wie kann ich in diesem Fall verhindern, das solange das MainForm versteckt ist, das Programm aus der Taskleiste verschwindet? Danke und Gruß Torsten |
AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
Ist bestimmt ein Window-Style/ExStyle.
Früher war in der Taskleiste ja nicht die MainForm, sonder die unsichtbare ControllForm und bei der war/ist ja dennoch der Button sichtbar. ![]() Ich würde einfach mal schauen, was der Unterschied ist, siehe Application.Handle gegen Application.MainFormHandle (bzw. DeineMainForm.Handle). |
AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
Habe mir vor ein paar Jahren dafür zwei kleine Prozeduren gebastelt:
Delphi-Quellcode:
Zur Sicherheit kann man vielleicht noch prüfen, ob die Form assigned ist, bevor man damit hantiert.
procedure ShowFormOnTaskbar(Form : TForm);
var WindowStyle : LONG_PTR; begin WindowStyle := GetWindowLongPtr(Form.Handle, GWL_EXSTYLE); if (WindowStyle and WS_EX_APPWINDOW) <> WS_EX_APPWINDOW then begin SetWindowLongPtr(Form.Handle, GWL_EXSTYLE, WindowStyle or WS_EX_APPWINDOW); end; end; procedure HideFormFromTaskbar(Form : TForm); var WindowStyle : LONG_PTR; begin WindowStyle := GetWindowLongPtr(Form.Handle, GWL_EXSTYLE); if (WindowStyle and WS_EX_APPWINDOW) = WS_EX_APPWINDOW then begin SetWindowLongPtr(Form.Handle, GWL_EXSTYLE, WindowStyle xor WS_EX_APPWINDOW); end; end; Aber eine kleine Warnung noch: Wenn die Anwendung dann im aktuellen Fenster ungünstig abschmiert, kommt man evtl. nicht mehr ins vorherige Fenster zurück, da es ja nicht mehr sichtbar ist. |
AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
Die Frage ist aber auch, wird "nur" mit WS_EX_APPWINDOW der Taskbutton auch dann angezeigt, wenn die Form unsichtbar (Visible=False) ist?
PS: GetWindowLongPtr ist eigentlich hier falsch, denn die Windows-Styles sind immer Integer, deswege nur GetWindowLong, denn LongPtr ist bei 64 Bit-Programmen ein LargeInteger/Int64. Und da WS_EX_APPWINDOW nur 1 Bit ist, brauchst es nicht geziehlt/doppelt zu vergleichen.
Delphi-Quellcode:
procedure ShowFormOnTaskbar(Form : TForm);
var WindowStyle : LONG_PTR; begin WindowStyle := GetWindowLong(Form.Handle, GWL_EXSTYLE); if WindowStyle and WS_EX_APPWINDOW = 0 then SetWindowLong(Form.Handle, GWL_EXSTYLE, WindowStyle or WS_EX_APPWINDOW); end; procedure HideFormFromTaskbar(Form : TForm); var WindowStyle : LONG_PTR; begin WindowStyle := GetWindowLongPtr(Form.Handle, GWL_EXSTYLE); if WindowStyle and WS_EX_APPWINDOW <> 0 then SetWindowLongPtr(Form.Handle, GWL_EXSTYLE, WindowStyle xor WS_EX_APPWINDOW); end;
Delphi-Quellcode:
// auf Neudelphianisch
procedure ShowFormOnTaskbar(Form : TForm); begin var WindowStyle := GetWindowLong(Form.Handle, GWL_EXSTYLE); if WindowStyle and WS_EX_APPWINDOW = 0 then SetWindowLong(Form.Handle, GWL_EXSTYLE, WindowStyle or WS_EX_APPWINDOW); end; // oder einfach immer zuweisen, egal ob es sich geändert hat procedure ShowFormOnTaskbar(Form : TForm); begin SetWindowLongPtr(Form.Handle, GWL_EXSTYLE, GetWindowLongPtr(Form.Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW); end; |
AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
Zitat:
Den geziehlten Vergleich habe ich mir irgendwann mal so angewöhnt. Ich finde das so besser lesbar. Ist natürlich Geschmackssache. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 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