Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ищу инфу на программирование дочерних окон [D7, WinXP]


Страницы:   1 2

Heretic ©   (2004-09-08 12:07:00) 

В частности меня интересует: Правильное открытие, закрытие, недопускания одновременного открытия одного и того же окна и передача параметра при открытии окна (Типа "только чтение", "редактирование" и т.д.)


Jeer   (2004-09-08 14:48:00) [1]

На самом-то деле делал всегда Disable контролов на создание child-окон. Так юзеру понятнее.


Jeer   (2004-09-08 14:46:00) [2]

Heretic ©   (08.09.04 12:24) [5]

Ну так добавь OnDestroy
fmMy := nil;


Рамиль   (2004-09-08 13:28:00) [3]

Или так:

Style ©   (03.07.04 0:34) [21]

А не модальные формы вызываю вот так:

ShowForm(self, TFrm_Receptures);

Ну естественно эта процедура уже есть в заранее u_utils или добавляю ее отдельно в f_main.pas

procedure ShowForm(Owner: TComponent; InstanceClass: TComponentClass);
var
Instance: TComponent;

function CreateForm: TForm;
 var Reference: TForm;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Owner);
  except
    TForm(Reference) := nil;
    raise;
  end;
  result := Reference;
end;

function FormByClass(FormClass: TClass): TForm;
var
 i: integer;
begin
   result := nil;
   for  i := 0 to Screen.FormCount-1 do
   begin
     if Screen.Forms[i].ClassName = FormClass.ClassName then
     begin
       result := Screen.Forms[i];
       break;
     end;
   end;
end;

begin

if(FormByClass(InstanceClass) = nil) then
begin
  with CreateForm do Show;
end else
begin
  with FormByClass(InstanceClass) do
  begin
    WindowState := wsNormal;
    Show;
  end;
end;

end;


Рамиль   (2004-09-08 13:22:00) [4]

Heretic ©   (08.09.04 13:13) [16]
б) если Form2 неоткрыто - открыть его.
Проблема пункта б) в том, что после команды "Action:=caFree" - проверка на "Form2=nil" уже ошибочна т.к. Form2<>nil. При этом ни пересоздать окно ни передать фокус уже не могу - выкидывает ошибку.

Читай ответы внимательнее!
Семен Сорокин ©   (08.09.04 12:40) [11]
1. проверять по MDIChilds[i], MDIChildCount наличие того или иного окна, если есть - делать BringToFront, иначе создавать


TUser   (2004-09-08 13:19:00) [5]

Может создавать его по любому, а потом только писать Form2.Visible:=true;
Form2.AnyControl.SetFocus;
и в OnClose
Action:=caHide ?


Heretic   (2004-09-08 13:13:00) [6]

> Семен Сорокин
Надеюсь...
Щас разберусь.
> TUser
По поводу п.1: Из главной (допустим Form1) вызываю подчиенное окно (допустим Form2). Дальнейшие действия при повторном вызове Form2:
а) если Form2 создано(открыто) - передать ему фокус
б) если Form2 неоткрыто - открыть его.
Проблема пункта б) в том, что после команды "Action:=caFree" - проверка на "Form2=nil" уже ошибочна т.к. Form2<>nil. При этом ни пересоздать окно ни передать фокус уже не могу - выкидывает ошибку.


Семен Сорокин   (2004-09-08 12:59:00) [7]

есть общий класс например TBaseMDIChil:
type
 TViewMode = (vmRead, vmWrite);

 TBaseMDIChild = class(TForm)
 private
   FViewMode: TViewMode;
 public
   constructor Create(AOwner: TComponent; AViewMode: TViewMode); reintroduce;
   property ViewMode: TViewMode read FViewMode;
 end;

 TBaseMDIChildClass = class of TBaseMDIChild;

constructor TBaseMDIChild.Create(AOwner: TComponent; AViewMode: TViewMode);
begin
inherited Create(AOwner);
FViewMode:= AviewMode;
end;


эта процедура создания нового окна (в главном окне):


function TMainMDI.ViewWindow(AClass: TBaseMDIChildClass): TBaseMDIChild;
var
 _i: integer;
begin
for _i := 0 to MDIChildCount-1 do
 if MDIChildren[_i] is AClass then begin
  Result := MDIChildren[_i];
  Result.BringToFront;
  Exit
 end;
Screen.Cursor := crHourGlass;
try
 Result := AClass.Create(self, vmRead {здесб можно анализировать AClass и выставлять другой флаг})
finally
 Screen.Cursor := crDefault
end
end;


ЗЫ. надеюсь понятно,
ахтунг псевдокод (с) кто-то с форума :)


TUser   (2004-09-08 12:51:00) [8]

Пишешь для своей формы

TAncestor = class(TForm)
private
FRO:boolean;
public
constructor Create(RO:boolean);override;
procedure Edit(Data:TYourDataDyte);abstract;

property RO:boolean read FRO;
end;

TChild1 = class(TAncestor);
public
procedure Edit(...); override;
end;

TChild2 = class(TAncestor);
public
procedure Edit(...); override;
end;

constructor TAncestro.Create(RO:boolean);
begin
inherited Create(Application);
FRO:=ro;
end;

procedure TChild1.Edit(...);
begin
...
end;

procedure TChild2.Edit(...);
begin
...
end;

Примерно так.


Heretic   (2004-09-08 12:46:00) [9]

> Семен Сорокин
Хм.
Извените меня гуру, но я только учусь. :)
Если это вас не оскорбит - поподробней и желательно в коде.
Я не так крут и понятие "перекрыть конструктор" у меня не вызывает никаких ассоциаций.
Если здесь это трудно - мой ящик avt2000@ukr.net


TUser   (2004-09-08 12:45:00) [10]

> MDI так MDI, какая разница?
Разница в понятности.

Хотя все-таки не все понятно. Что значит п.1? Что такое одно и то же подчиненное окно. MDI-чайлды одного класса? Или детки, в которых открыт один и тот же документ? Или ... ?


Семен Сорокин   (2004-09-08 12:40:00) [11]

1. проверять по MDIChilds[i], MDIChildCount наличие того или иного окна, если есть - делать BringToFront, иначе создавать
2. Сделать общего предка для всех MDIChild- окон, перекрыть конструктор, куда передавать флаг readonly


Heretic   (2004-09-08 12:37:00) [12]

MDI так MDI, какая разница?
Есть главное окно (иногда пишут родительское) и подчиненные окна (иногда пишут дочерние).
Открывать я знаю как("MDIForm1 := TForm.Create(Self);"), закрывать тоже ("Action:=caFree"). Остались вопросы:
1) недопускание одновременного открытия одного и того же подчиненного окна
2) передача параметра при открытии окна (Типа "только чтение", "редактирование" и т.д.)

Если кто знает - лучше дайте ссылку на доку. Читать я умею. :)
Заранее спасибо.


Семен Сорокин   (2004-09-08 12:35:00) [13]

File->New->Other...
Projects->MDI Application


TUser   (2004-09-08 12:31:00) [14]

Телепатически догадываюсь, что вопрос про mdi интерфейс. задай главной форме fsmdiform, а дочерним - fsmdichild. Потом создавай дочерние формы (сколько надо), например так
i:=length(ChForms);
setlength(chforms,i+1);
chforms[i]:=TChildForm.Create(Application)


Fay   (2004-09-08 12:30:00) [15]

MDI ?


Heretic   (2004-09-08 12:26:00) [16]

> Fay
Из одной доки:
"Основные особенности дочерних окон:  
дочерняя форма всегда располагается в границах родительской;  
дочернюю форму нельзя переместить за границы родительской формы;  
дочернее окно сворачивается только внутри родительского;  
при разворачивании дочернее окно занимает все внутреннее пространство родительского окна."


Heretic   (2004-09-08 12:24:00) [17]

> Jeer

"В главной:
if fmMy = nil then
fmMy := TfmMy.Create(Self);"

Я так делал, но после выполнения Action := caFree повторное открытие того же окна выдает ошибку т.к. "fmMy" уже не равно "nil"


Fay   (2004-09-08 12:24:00) [18]

Ужас какой-то. "ПРИЛОЖЕНИЯ". Я уж было подумал драйвера.
Но вопрос не понял. Скажи - в чём дочернесть?


Heretic   (2004-09-08 12:21:00) [19]

Ха-ха... Читай заголовки!
Поясняю...
Хочу узнать как правильно программировать процедуру открытия дочернего окна ПРИЛОЖЕНИЯ.  как правильно программировать процедуру закрытия дочернего окна ПРИЛОЖЕНИЯ и т.д. по тексту.
В общем хочу научиться работе с дочерними окнами.


Jeer   (2004-09-08 12:19:00) [20]

В главной:
if fmMy = nil then
 fmMy := TfmMy.Create(Self);
..

В дочерней:
OnFormClose
..
Action := caFree;

Передавать параметры через сообщения.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо