powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создать набор форм на главной форме
5 сообщений из 5, страница 1 из 1
Создать набор форм на главной форме
    #39832550
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть главная форма, в ней меню. По нажатию кнопок меню открываются формы и размещаются внутри основной формы, занимая всю выделенную площадь.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  
  if fmRepairObject = nil then
    begin
      fmRepairObject := TfmRepairObject.Create(Application);
      fmRepairObject.FormStyle := fsMDIChild;
      fmRepairObject.WindowState := wsMaximized;
    end
  else
    fmRepairObject.BringToFront;



При закрытии формы у нее срабатывает обнуление ссылки и уничтожение формы:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TfmRepairObject.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not IsDialog then
    Action := caFree;
end;

procedure TfmRepairObject.FormDestroy(Sender: TObject);
begin
  inherited;
  fmRepairObject := nil;
end;



Однако, таким образом можно создать только одну форму одного типа (if fmRepairObject = nil then...).
А мне надо, чтобы как в новой 1С-бухгалтерии, можно было открыть форму счетов, и в ней отрыть несколько счетов, которые сами становятся отдельными формами, т.е. все они становятся открытыми.
Для этого очевидно, недостаточно одной переменной fmRepairObject, а нужно создавать где-то список с адресацией по id или номеру счета, чтобы при вызове счета, если он уже открыт, то его форма просто активировалась, а не создавалась заново.
Может есть какие-то готовые компоненты для формирования подобных списков (невидимые пользователю, типа TActionList). Или подскажите, как лучше самому создать такой список, ObjectList или коллекцию?
...
Рейтинг: 0 / 0
Создать набор форм на главной форме
    #39832551
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, может быть в меню в рантайме создавать элементы в пункте "Окна" и уничтожать их при закрытии окна.
...
Рейтинг: 0 / 0
Создать набор форм на главной форме
    #39832598
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, может не стоит выкидывать ссылки на созданные формы? вести список. при закрытии - удалять из списка.
тогда у вас будет полный список ваших открытых форм, можете искать в нем по любому параметру
...
Рейтинг: 0 / 0
Создать набор форм на главной форме
    #39832645
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Как идея
Код: pascal
1.
2.
3.
4.
5.
6.
unit FormMain;
...
procedure TfmMain.ShowRepairObject(AIdent: Variant);
begin
  TfmRepairObject.OpenForm(Application, AIdent);
end;


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
unit RepairObject;

uses ..., System.Generics.Collections;

type
  TfmRepairObject = class(TForm)
  ...
  private
  ...
    FList: TList<TfmRepairObject>;
  public
    Ident: Variant;
    class procedure OpenForm(AOwner: TComponent; AIdent: Variant);

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses ...

...

constructor TfmRepairObject.Create(AOwner: TComponent);
begin
  inherited;

  FList.Add(Self);
end;

destructor TfmRepairObject.Destroy; override;
begin
  FList.Remove(Self);

  inherited;
end;


class procedure TfmRepairObject.OpenForm(AOwner: TComponent; AIdent: Variant);
var
  fm: TfmRepairObject;
  Found: Boolean;
begin
  Found := False;
  for fm in FList do
    if fm.Ident = AIdent then
    begin
      Found := True;
      fm.Show;
      Break;
    end;

  if not Found then
    with TfmRepairObject.Create(AOwner) do
    begin
      Ident := AIdent;
      Show;
    end;
end;

end.

Нужно идентифицировать уже открытые окна - значит нужен список открытых окон и поле, в котором будет храниться идентификатор окна.
Перед открытием окна нужно найти окно с указанным идентификатором. Если нашли, то показываем, если нет - создаем.
...
Рейтинг: 0 / 0
Создать набор форм на главной форме
    #39832656
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitri Krizhanovski,

тогда уж лучше TObjectList, который хранит не указатели, а сами объекты. Заодно и подчищает за собой сам.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создать набор форм на главной форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]