Как реализовать своего рода диспетчер форм? - PullRequest
0 голосов
/ 03 января 2012

Я нахожусь в середине проекта с несколькими дочерними формами. Многие из форм могут быть открыты одновременно. Я хотел бы знать, есть ли уже что-то, что я могу использовать для управления и отслеживания этих форм, так же как панель задач Windows и / или диспетчер задач. Если нет, то каков будет лучший подход? Я не хочу изобретать велосипед, если это уже сделано.

Описание

Как уже упоминалось выше, этот проект имеет много форм, которые могут быть открыты одновременно. Я также буду реализовывать некоторый визуальный элемент управления списком (так же, как панель задач или диспетчер задач) для управления пользователями этими формами (или, в случае пользователя, формы называются окнами). Наиболее идеальным способом управления ими было бы сначала захватить каждую из этих форм по мере их создания и вести их учет где-либо. Некоторые формы нуждаются в этом поведении, а некоторые - нет. Например, модальные формы никогда не нуждаются в такой обработке.

Я предоставлю пользователю доступ к показу, свертыванию или закрытию этих форм, а также к некоторой другой необдуманной обработке в будущем, например, к пользовательскому всплывающему меню, связанному с одной из этих форм (но это другой вопрос). Дело в том, что мне нужно создать что-то, чтобы захватить эти формы и сохранить их в порядке.

Это также будет включать некоторое другое взаимодействие пользователя со всеми формами одновременно, а также простой доступ к каждой из них, аналогично тому, как Screen.Forms уже работает. Например, команда для минимизации всех форм (FormManager.MinimizeAll), максимизации текущей активной формы (FormManager.ActiveForm.Maximize) или с определенной формой (FormManager[3].Maximize).

Возможные варианты

Я понимаю, что есть несколько разных подходов для достижения похожих результатов, и я еще не начал кодировать их, потому что у каждого из этих подходов есть разные отправные точки. Возможны варианты ...

  • Обтекание экрана. Формы и другие связанные с ним функциональные возможности с экрана (которые не позволили бы мне достичь желаемой гибкости)
  • Каждый раз, когда я создаю форму, регистрируйте ее в этом менеджере форм (который очень гибок, но я должен всегда регистрировать каждую созданную форму)
  • Создайте мастер-форму, чтобы зарегистрировать ее в менеджере форм и унаследовать от нее все (что также очень гибко, но по-разному и намного сложнее)

Второй вариант звучит наиболее многообещающе. Но опять же, я не хочу начинать строить это, если уже есть решение для этого. Я уверен, что я не первый, кто это делает. Я не знаю, как искать такую ​​вещь, я не получаю ничего, что мне нужно в Google.

Ответы [ 3 ]

3 голосов
/ 03 января 2012

Глобальная переменная ScreenForms единица) выполняет некоторое «отслеживание», т.е.

3 голосов
/ 03 января 2012

Вы можете добавить каждую форму в список TObjectList.Я написал компонент под названием FormStack, который позволяет добавлять формы (даже формы с одинаковыми именами), извлекать, удалять и т. Д. Чтобы получить поведение, подобное диспетчеру задач, я думаю, что вам просто нужно выполнить итерацию списка, чтобы получить формуимена.Надеемся, что вы можете использовать что-то здесь, чтобы пролить свет на вашу идею ..

Вот код для FormStack.

unit uFormstack;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Contnrs; 

type
  TFormstack = class(TComponent)
  private
    { Private declarations }
    FormList: TObjectList;
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); Override;
    Destructor Destroy; Override;
    Procedure Add(InstanceClass: TComponentClass; Var Reference);
    Procedure RemoveLast;
    Procedure RemoveAll;
    Function FindForm(AComponentClass: TComponentClass): Boolean; 
    Function GetForm(AComponentClass: TComponentClass): TObject;
    Function GetByIndex(AIndex: Integer): TObject;
    Procedure RemoveByIndex(AIndex: Integer);
  published
    { Published declarations }
  end;

procedure Register;

implementation

//{$R *.res}

procedure Register;
begin
  RegisterComponents('FormStack', [TFormstack]);
end;

{-----------------------------------------------------------------------------
  TFormStack
-----------------------------------------------------------------------------}

Constructor TFormStack.Create(AOwner: TComponent);
Begin
  Inherited Create(AOwner);
  FormList := TObjectList.Create;
  FormList.OwnsObjects := True;
End;

Destructor TFormStack.Destroy;
Begin
  FormList.Free;
  Inherited Destroy;
End;

Procedure TFormStack.Add(InstanceClass: TComponentClass; Var Reference);
Var
  Instance: TComponent;
Begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  Instance.Create(Self); // Owner is FormList   <<-- blows up if datamodule in D2010
  FormList.Add(Instance);
  Instance.Tag := FormList.Count-1;
End;


Procedure TFormStack.RemoveAll;
Var
  I: Integer;
Begin
  For I := FormList.Count -1 downto 0 do  // last in first out
  begin
    Self.RemoveLast;
  End;
End;

// This removes the last form on the stack
Procedure TFormStack.RemoveLast;
Begin
  if FormList.Count > 0 then
     FormList.Remove(FormList.Items[FormList.Count-1]);
End;

Function TFormStack.FindForm(AComponentClass: TComponentClass): Boolean;
Var
  I: Integer;
Begin
  Result := False;
  For I := FormList.Count-1 downto 0 do
    If Formlist.Items[I].ClassType = AComponentClass then
      Result := True;
End;

Function TFormStack.GetForm(AComponentClass: TComponentClass): TObject;
Var
  I: Integer;
begin
  Result := Nil;
  For I := FormList.Count-1 downto 0 do
    If Formlist.Items[I].ClassType = AComponentClass then
      Result := FormList.Items[I];
end;

Function TFormStack.GetByIndex(AIndex: Integer): TObject;
begin
  Result := Nil;
  If FormList.Count-1 >= AIndex then
    Result := FormList.Items[AIndex];
end;

Procedure TFormStack.RemoveByIndex(AIndex: Integer);
begin
  If FormList.Count-1 >= AIndex then
    FormList.Remove(FormList.Items[AIndex]);
end;

end.
2 голосов
/ 03 января 2012

Если я правильно вас понимаю, вы хотите отслеживать это в коде, пока приложение работает? Может быть, вы можете что-то сделать с Screen.Forms?

...