Lista okine w menu

0

W aplikacjach mdi istnieje mechanizm umożliwiający wyświetlanie w menu informacji o otwartych oknach. Czy istnieje jakiś gotowiec wyświetlający informacje o otwartych oknach dla aplikacji które nie są mdi? Szukałem w sieci ale nic interesującego nie znalazłem.

Dziękuję za sugestie.
Romek

1

Wyświetlania jakich informacji o otwartych oknach?

Jeśli chodzi Ci o stworzenie menu, posiadające tyle pozycji ile otwartych okien, a każda pozycja z nich miałaby mieć treść zgodną z tytułem okna, to nie potrzebujesz do tego żadnego gotowego mechanizmu. Zrobienie czegoś takiego to 20 linijek kodu.

1
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.AppEvnts, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Timer1: TTimer;

    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var form:TForm;
begin
 form:=TForm2.Create(Form1);
 form.Parent:=Form1;
 form.Visible:=True;
 form.Name:='Form'+IntToStr(Random(10))+IntToStr(Random(10))+IntToStr(Random(10));
 form.Caption:=form.Name;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Randomize;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
 Memo1.Lines.Clear;
 i:=0;
 for i := 0 to ComponentCount -1 do
  begin
   if Components[i] is TForm then
    begin
     Memo1.Lines.Add(TForm(Components[i]).Caption);
    end;
  end;

end;

end.
3

@PrzemysławWiśniewski: to zadziała ale tylko w przypadki kiedy wszystkie formularze są childem głównego formularza. Jeśli formularze są zagłębione to to już nie spełni zadania.

Jeśli chcemy uzyskać efekt taki jak na obrazku poniżej, w którym na liście są oka wywoływane zarówno z głównego modułu aplikacji jak i zagnieżdżone to trzeba samodzielnie je rejestrować.
Najlepiej zrobić jakąś własną klasę TWindowManager w niej odpowiednie metody t.j. add, remove itd... trzymać wszystko na liście do której okna dodajemy i kasujemy.
Jeszcze lepiej jak nie robisz formularzy "na chama" z systemowego TForm tylko wyprowadzasz własną TFormTemplate dziedziczącą po Tform.

Taki formularz potem dodaje się poprzez:
screenshot-20210909221831.png
screenshot-20210909221910.png

screenshot-20210909220912.pngscreenshot-20210909221800.png

1

No jak się tworzy formularze, ustawia Parent i gubi referencję, to trudno żeby się dało cokolwiek z tego zrobić. I o ile nie problem jest przeiterować po dzieciach okna i wylistować sobie formularze, o tyle to w którym momencie to zrobić, jest już zupełnie inną kwestią. Bo menu powinno być raz zbudowane i aktualizowane tylko wtedy, gdy formularz się tworzy lub zwalnia — tylko wtedy można poprawnie aktualizować zawartość menu.

Opcja jest prosta — lista z referencjami wszystkich dynamicznie tworzonych okien (bez względu na rodzica i przeznaczenie). Nieważne czy będzie to fabryka, czy luźno napisana klasa, do której będzie się wrzucało referencje i usuwało. Serio, to 20 linijek kodu, nie ma się nawet nad czym głowić.

0

Mam jeszcze jedno pytanie związane z tematem. Menu utworzyłem za pomocą komponentu TActionMainMenuBar. Poszczególne elementy menu to TActionClientItem. Dla elementów menu ustawiam Action. Czy jest możliwość w Action.OnExecute określić który element memu został kliknięty? Przyglądam się użytym klasom i nie widzę rozwiązania. Dla TMainMenu, TToolBar i TAction taka możliwość istnieje. Chodzi mi o to aby dla wielu elementów menu (TActionClientItem) wykorzystać jeden obiekt TAction.

0
Romek Atomek napisał(a):

Czy jest możliwość w Action.OnExecute określić który element memu został kliknięty?

OnExecute to TNotifyEvent — sprawdź co zawiera Sender.

0

Sender to TAction. Elementy menu to TActionClientItem potomek TCollectionItem. Z tego powodu property TAction.ActionComponent nie jest ustawiane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1