Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hauptformular ausblende beim wechsel auf ein anderes Form ? (https://www.delphipraxis.net/1411-hauptformular-ausblende-beim-wechsel-auf-ein-anderes-form.html)

Megabyte 23. Nov 2002 16:33


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:

d3g 23. Nov 2002 16:56

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

Christian Seehase 23. Nov 2002 17:02

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]

Megabyte 23. Nov 2002 18:04

Irgend wie versteh ich das nicht wie das geht mit der onshow funktion
Habe folgenden Code:

Delphi-Quellcode:
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;
wer weiss wie ich den code modifizieren muss dass Form1 unsichtbar wird wenn Form2 lädt???

Danke für eure Hilfe

Megabyte :P

Christian Seehase 23. Nov 2002 18:18

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;

d3g 23. Nov 2002 18:20

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;

Hansa 23. Nov 2002 18:36

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:

CalganX 23. Nov 2002 18:42

ShowModal bedeutet, dass dein Form in deiner Anwendung im Vordergrund steht, du deswegen kein anderes Form aktivieren kannst... (ganz einfach)

Chris

Daniel B 23. Nov 2002 18:58

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:

Metschu 24. Jul 2020 11:10

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

himitsu 24. Jul 2020 11:23

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.

Delphi-Referenz durchsuchenApplication.MainFormOnTaskbar

Ich würde einfach mal schauen, was der Unterschied ist, siehe Application.Handle gegen Application.MainFormHandle (bzw. DeineMainForm.Handle).

Jasocul 24. Jul 2020 11:48

AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
 
Habe mir vor ein paar Jahren dafür zwei kleine Prozeduren gebastelt:
Delphi-Quellcode:
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;
Zur Sicherheit kann man vielleicht noch prüfen, ob die Form assigned ist, bevor man damit hantiert.
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.

himitsu 24. Jul 2020 13:58

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;

Jasocul 27. Jul 2020 07:03

AW: Hauptformular ausblende beim wechsel auf ein anderes Form ?
 
Zitat:

Zitat von himitsu (Beitrag 1470298)
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.

Danke für die Infos. War mir nicht bewusst, dass GetWindowLong reicht.
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