Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI + много форм разных типов / 4 сообщений из 4, страница 1 из 1
21.04.2003, 08:29
    #32144744
Diagnost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI + много форм разных типов
Есть MDI приложение с массой разных форм
можно ли сделать универсальную процедуру для показа любой формы

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

а дальше уже проверяем: если есть то показываем, если нет создаем
а то щас приходится просто копировать один и тот же код для показа каждой формы
...
Рейтинг: 0 / 0
21.04.2003, 09:54
    #32144792
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI + много форм разных типов
Я например делаю так (может быть и не лучший спосооб) - формы порождены от одного типа 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
21.04.2003, 10:02
    #32144804
Ильшат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI + много форм разных типов
Вот процедра, которая у меня отображает любую форму. Параметры, те же, что и у 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
21.04.2003, 15:46
    #32145195
Moonspell13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI + много форм разных типов
если есть rxlib посмотри в модуле apputils функцию InternalFindShowForm, это должно быть то что надо!!!
Удачи.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI + много форм разных типов / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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