Frage

Ich habe versucht, einige modalen Formulare in meiner Anwendung zu erhalten in der Taskleiste erscheinen -. Vorteil der neuen nützlichen Taskleiste unter Windows 7

Es gibt viele Probleme mit der VCL, dass Bedarf rückgängig gemacht werden, bevor ein Formular auf der Taskleiste vorhanden sein kann.

Aber das letzte Problem ist, dass die Form zu minimieren, dass die VCL des Hauptformular bezeichnet hat bewirkt, dass alle Fenster in der Anwendung verschwinden.

vor zehn Jahren, Peter Below (TeamB) dokumentiert diese Probleme , und versucht zu arbeiten um sie herum. Aber es gibt einige Probleme, die nicht gelöst werden können. Die Probleme laufen so tief in dem VCL selbst, dass es praktisch unmöglich ist Delphi-Anwendungen richtig verhalten zu machen.

Es ergibt sich aus der Tatsache, dass die Schaltfläche Sie auf der Symbolleiste sehen nicht das Fenster der Anwendung darstellt; es stellt die TApplications Fenster, das verborgen ist und nie gesehen. Und dann gibt es die MainForm Anwendung, die dann mit besonderen Fähigkeiten durchdrungen ist, wo, wenn es minimiert wird dann weist sie die Anwendung selbst zu verbergen.

Es scheint mir, dass, wenn ich tun kann,

Application.MainForm := nil;

dann all diese Fehler weggehen würde. Die Anwendung kann seine versteckten Fenster hat, und in der Zwischenzeit werde ich jede außer Kraft setzen andere Form in der Anwendung, einschließlich mein Hauptformular, mit :

procedure TForm2.CreateParams(var params: TCreateParams ); 
begin 
   inherited CreateParams(params); 
   params.ExStyle := params.ExStyle or WS_EX_APPWINDOW; 
end; 

Aber in Delphi die Application.MainForm Eigenschaft ist schreibgeschützt.

Wie kann ich keine MainForm in Delphi hat?

Siehe auch

War es hilfreich?

Lösung

Sie können keine GUI Projekt ohne Mainform zugewiesen laufen. Die Hauptnachrichtenschleife beendet sofort ohne ein. Doch das bedeutet nicht, dass die Mainform UI laufen muss. Sie können eine leere versteckt TForm als zugewiesen Mainform verwenden, und dann haben sie Ihre echte Mainform als sekundäre TForm instanziiert. Zum Beispiel:

HiddenMainFormApp.dpr:

project HiddenMainFormApp;

uses
  ..., Forms, HiddenMainForm;

begin
  Application.Initialize;
  Application.CreateForm(THiddenMainForm, MainForm);
  Application.ShowMainForm := False;
  Application.Run;
end.

HiddenMainForm.cpp:

uses
  ..., RealMainForm;

procedure THiddenMainForm.FormCreate(Sender: TObject);
begin
  RealMainForm := TRealMainForm.Create(Self);
  RealMainForm.Show;
end;

RealMainForm.cpp:

procedure TRealMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Application.Terminate;
end;

Alternativ:

HiddenMainFormApp.dpr:

project HiddenMainFormApp;

uses
  ..., Forms, HiddenMainForm, RealMainForm;

begin
  Application.Initialize;
  Application.CreateForm(THiddenMainForm, MainForm);
  Application.ShowMainForm := False;

  RealMainForm := TRealMainForm.Create(Application);
  RealMainForm.Show;
  RealMainForm.Update;

  Application.Run;
end.

RealMainForm.cpp:

procedure TRealMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Application.Terminate;
end;

Andere Tipps

Sie können nicht, besonders in Delphi 5.

Ihr Zitat des TApplication Fenster über die man auf der Taskleiste zu sehen ist, hat jetzt mehr Delphi-Versionen nicht wahr gewesen (ich glaube, es D2007 geändert).

Weil Sie mit Delphi 5, sind Sie eine veraltete Kopie von Delphi verwendet wird; aktuelle Versionen haben fast keine der Dinge, die Sie nicht mehr gerade schreiben. Ich würde vorschlagen, dass Sie auf eine neuere Version von Delphi Upgrade (D5 ist extrem alt); Delphi 2007, wenn Sie Unicode, Delphi XE vermeiden müssen, wenn Sie (oder nichts dagegen haben) Unicode-Unterstützung in der VCL und RTL verwenden können.

Die Dinge, die Sie beschreiben, sind nicht Bugs , BTW. Sie waren vorsätzliche Design-Entscheidungen zu der Zeit gemacht Delphi 1 entworfen wurde, und durch Delphi 7 haben gut funktioniert mit den Versionen von Windows, die zur Verfügung standen. Änderungen in späteren Versionen von Windows (XP / Vista / Win7 und den entsprechenden Server-Versionen) vorgenommenen Änderungen in dieser Architektur notwendig, und sie wurden wie Delphi unter Windows fortgeschritten zusammen. Weil Sie gewählt haben, nicht mit Ihrer Version von Delphi, um die Fortschritte zu halten es aktuelleren machen nicht die Dinge, die Sie über magische Weise werden Fehler schreiben. : -)

Mit Application.MainForm zugewiesen scheint kein Problem, hier zu sein, um eine andere modale Formular auf der Taskleiste zeigt, während die Mainform minimiert wird.

Project1.dpr:

program Project1;

uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {MainForm},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

var
  MainForm: TMainForm;

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  ShowWindow(Application.Handle, SW_HIDE);
  Application.Run;
end.

Unit1.pas:

unit Unit1;

interface

uses
  Windows, Messages, Classes, Controls, Forms, StdCtrls, Unit2;

type
  TMainForm = class(TForm)
    ShowForm2Button: TButton;
    ShowForm2ModalButton: TButton;
    procedure ShowForm2ButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ShowForm2ModalButtonClick(Sender: TObject);
  private
    FForm2: TForm2;
    procedure ApplicationActivate(Sender: TObject);
    procedure Form2Close(Sender: TObject; var Action: TCloseAction);
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Visible := True; //Required only for MainForm, can be set designtime
  Application.OnActivate := ApplicationActivate;
end;

procedure TMainForm.ApplicationActivate(Sender: TObject);
{ Necessary in case of any modal windows dialog or modal Form active }
var
  TopWindow: HWND;
  I: Integer;
begin
  TopWindow := 0;
  for I := 0 to Screen.FormCount - 1 do
  begin
    Screen.Forms[I].BringToFront;
    if fsModal in Screen.Forms[I].FormState then
      TopWindow := Screen.Forms[I].Handle;
  end;
  Application.RestoreTopMosts;
  if TopWindow = 0 then
    Application.BringToFront
  else
    SetForegroundWindow(TopWindow);
end;

procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_APPWINDOW;
    WndParent := GetDesktopWindow;
  end;
end;

procedure TMainForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MINIMIZE then
    ShowWindow(Handle, SW_MINIMIZE)
  else
    inherited;
end;

{ Testing code from here }

procedure TMainForm.ShowForm2ButtonClick(Sender: TObject);
begin
  if FForm2 = nil then
  begin
    FForm2 := TForm2.Create(Application); //Or: AOwner = nil, or Self
    FForm2.OnClose := Form2Close;
  end;
  ShowWindow(FForm2.Handle, SW_RESTORE);
  FForm2.BringToFront;
end;

procedure TMainForm.Form2Close(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FForm2 := nil;
end;

procedure TMainForm.ShowForm2ModalButtonClick(Sender: TObject);
begin
  with TForm2.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
end;

end.

Unit2.pas:

unit Unit2;

interface

uses
  Windows, Messages, Classes, Controls, Forms;

type
  TForm2 = class(TForm)
  private
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

{$R *.dfm}

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_APPWINDOW;
    WndParent := GetDesktopWindow;
  end;
end;

procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MINIMIZE then
    ShowWindow(Handle, SW_MINIMIZE)
  else
    inherited;
end;

end.

(Getestet mit D5 und D7 auf XP und Win7).

(Und ja, können Sie Flaggen dies als keine Antwort, denn es ist nicht gemeinfrei. Es gibt noch eine Mainform ist aber Ich mag diese Antworten denken, die Frage hinter der Frage ...)

Sie können Ihre modale Formulare in einer dll setzen, dann wirken sie ziemlich viel auf eigene Faust. (Wenn Sie nicht über die Anwendung Instanz der DLL verwenden, während sie die Schaffung (Application.CreateForm) dann Application.Mainform ist null in der dll).

Natürlich könnte dies nicht möglich sein, je nachdem, was die Formen benötigen könnten zu tun.

Eigentlich fast alles, was Sie sich beschweren ist etwa in der Tat das Design von Windows statt der VCL. Siehe Windows-Funktionen für alle Details .

Der Kern der Sache ist der Eigentümer Eigentum, und ich die Fenster Eigentümer bedeuten anstatt der VCL Besitzer.

Ein im Besitz Fenster wird ausgeblendet, wenn sein Besitzer minimiert wird.

Wenn Sie der Lage sein, die Hauptform zu minimieren, ohne andere Fenster, dann müssen Sie versteckt oben auf, wie im Besitz Fenster Arbeit bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top