Wie man in einem Delphiprogramm sekundären Fenstern die Möglichkeit gibt auch in der Taskbar sichtbar zu sein, findet man ja relativ einfach im Internet.

Dazu braucht man in der entsprechenden Form nur den folgenden Code einfügen:

type
  TfrmExtra = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  protected
    procedure CreateParams(var Params : TCreateParams); override;
  end;

implementation

procedure TfrmExtra.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;

CreateParms wird bei der Erzeugung des Fensters aufgerufen. Dabei wird dem Fensterstyle der Parameter WS_EX_APPWINDOW hinzugefügt. Dieser Parameter erzeugt den Taskbareintrag für das entsprechende Fenster, sobald es sichtbar ist.

Nur diesen Parameter hinzufügen reicht in den meisten Fällen noch nicht, da dann zum Beispiel das Umschalten zwischen Haupt- und Sekundärfenster nicht wie gewohnt funktioniert. Die zweite Einschränkung fällt beim minimieren des Hauptfensters auf – das sekundäre Fenster wird einfach mit minimiert und zusätzlich dazu der Taskbareintrag entfernt. Das Problem entsteht, da das Fensterparent des zweiten Fensters immer noch das Hauptfenster ist.

Diese Problem löst man indem man das Parent der sekundären Form null zuweist. Im oben gezeigten Code wird dies durch die Zeile Params.WndParent := 0 erreicht.

Jetzt funktioniert erst mal alles so, wie erwartet. Jedenfalls so lange man nicht ins Detail geht. Da gibt’s dann noch ein paar Stolpersteine ;)

 

Das Problem mit den Standarddialogen

Ruft man einen Standarddialog, wie zum Beispiel Datei öffnen, aus der sekundären Form auf, dann wird jedes Mal die Hauptform in den Vordergrund geholt. Nicht kritisch aber unschön, aber dafür leicht zu lösen. Einfach den Aufruf des Standarddialog wie folgt ändern:

OpenDialog1.Execute(0);

Dadurch wird das Parent des Dialogs auf null geändert. Ohne die Null in den Klammern ist das Parent immer noch die Mainform und dadurch wurde dieses in den Vordergrund holen des Mainforms hervorgerufen.

 

Das Problem mit den Hints

Controls platziert auf der sekundären Form mit aktivierten Hints, holen spätestens beim zweiten Aufpoppen des Hints wieder einmal die Mainform in den Vordergrund. Auch hier greift wieder das Problem mit dem Parent auf die Mainform. Um das Problem mit den Hints zu lösen muss man eine Klasse von THintWindow ableiten und den Parent wieder auf Null setzen. Ich habe dies im Projektquelltext umgesetzt. Das Resultat ist in den folgenden Zeilen zu sehen:

program Project1;

uses
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {frmMain},
  Unit2 in 'Unit2.pas' {frmExtra};

{$R *.res}

type
  TFixedHintWindow = class(THintWindow)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure TFixedHintWindow.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;

begin
  Application.Initialize;
  HintWindowClass := TFixedHintWindow;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.

Bei mir läuft jetzt erst mal alles ohne Probleme.

Ach so, bevor ich es vergesse. Unter Delphi 2007 gibt es die neue Eigenschaft MainFormOnTaskBar unter TApplication. Eine gute Erklärung dazu ist hier zu finden.

Mit einer Aktivierung von MainFormOnTaskBar wird das neue Fenstermanagement in Delphi 2007 Anwendungen aktiviert und man kann sich die Zeile Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; sparen, da jedes Fenster der Anwendung mit einem auf Null gesetzten Parent eh schon extra in der Taskbar angezeigt wird.

Keine verwandten Beiträge.


Schreibe eine Antwort