powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI + много форм разных типов
4 сообщений из 4, страница 1 из 1
MDI + много форм разных типов
    #32144744
Diagnost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть MDI приложение с массой разных форм
можно ли сделать универсальную процедуру для показа любой формы

т.е. что то типа ShowForm(TMyForm);

а дальше уже проверяем: если есть то показываем, если нет создаем
а то щас приходится просто копировать один и тот же код для показа каждой формы
...
Рейтинг: 0 / 0
MDI + много форм разных типов
    #32144792
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я например делаю так (может быть и не лучший спосооб) - формы порождены от одного типа TCustFormClass, и собраны в динамический список:

в UnitCustForm:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  TCustForm = class(TForm)
    MainMenuLocal: TMainMenu;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SyncViewSettings(Saving:boolean=false); virtual;
    procedure AfterLogin; virtual;
    procedure BeforeLogoff; virtual;
    procedure ShowParamertic(Parametrs:array of variant); virtual;
    function StatusText:string; virtual;
  end;
  TCustFormClass=class of TCustForm;


в файле главной формы:
Код: plaintext
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.
63.
64.
type
  TChildForm=class(TCollectionItem)
   private
    FId:string;
    FImageIndex:Integer;
    FAction:TAction;
    FCreated:boolean;
    FCategory:string;
    FClass:TCustFormClass;
    FLink:TCustForm;
  end;

var Childs:TCollection=nil; // of TChildForm

procedure RegisterChildForm(IdStr:string;
     CustFormClass:TCustFormClass;
     Category:string='';
     ImageIndex:Integer = - 1 );
begin
  if Category='' then Category:=sCatMain;
  Assert(Assigned(Childs));
  with Childs.Add as TChildForm do begin
    fId:=IdStr;
    FImageIndex := ImageIndex;
    FAction:=nil; //constructed in TMainForm.Create
    FCreated:=false;
    FCategory:=Category;
    FClass:=CustFormClass;
    FLink:=nil;
  end;
end;

procedure TMainForm.SomeFormCall(Sender: TObject);
begin
  SafeCallWindow((Sender as TAction).Caption,[]);
end;

function TMainForm.SafeCallWindow(Id:string; Parametrs:array of variant):boolean;
var i:integer;
begin
  i:= 0 ;
  while (Childs.Items[i] as TChildForm).FId<>Id do inc(i);
  Assert(i<Childs.Count);
  with Childs.Items[i] as TChildForm do begin
    if not(FCreated) then begin
      //Screen.Cursor:=crHourGlass;
      //LockWindowUpdate(Handle);
      try
        Application.CreateForm(FClass,FLink);
        FLink.Caption:=FId;
        if Connected then FLink.AfterLogin;
        FCreated:=true;
      finally
        //LockWindowUpdate( 0 );
        //Screen.Cursor:=crDefault;
      end;
    end;
    FLink.ShowParamertic(Parametrs);
    FLink.BringToFront;
    result:=Assigned(FLink) and (FLink.Visible);
  end;
  FreshStatus;
end;



И в initialization для каждого модуля формы:
Код: plaintext
1.
2.
initialization
    RegisterChildForm(sIdAP,TAPForm,'', 35 );
...
Рейтинг: 0 / 0
MDI + много форм разных типов
    #32144804
Фотография Ильшат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот процедра, которая у меня отображает любую форму. Параметры, те же, что и у Fpplication.CreateForm;
Если этой формы еще нет, то создается.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TfrmMain.ShowBrowser( AClass: TComponentClass;
                                var Browser);
begin

  if not Assigned( TComponent( Browser)) then
  begin
    Application.CreateForm( AClass, Browser);
    ApplySettingsForForm( TFormBrowser(  Browser));
  end;

  with TForm( Browser) do
  begin
    BringToFront();
    if WindowState = wsMinimized then
      WindowState := wsNormal;
  end;
end;
...
Рейтинг: 0 / 0
MDI + много форм разных типов
    #32145195
Фотография Moonspell13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если есть rxlib посмотри в модуле apputils функцию InternalFindShowForm, это должно быть то что надо!!!
Удачи.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI + много форм разных типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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