Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Ищу инфу на программирование дочерних окон   Найти похожие ветки 

 
Heretic ©   (2004-09-08 12:07) [0]

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


 
TUser ©   (2004-09-08 12:11) [1]

Окна открываются щеколдой. Ни в коем случае не разбивай стекло. Закрываются - наоборот. Параметры передаются с помощью бумажных самолетиков.

PS. Сам ты свой вопрос понимаешь или как?


 
Jeer ©   (2004-09-08 12:19) [2]

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

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

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


 
Heretic ©   (2004-09-08 12:21) [3]

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


 
Fay ©   (2004-09-08 12:24) [4]

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


 
Heretic ©   (2004-09-08 12:24) [5]

> Jeer

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

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


 
Heretic ©   (2004-09-08 12:26) [6]

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


 
Fay ©   (2004-09-08 12:30) [7]

MDI ?


 
TUser ©   (2004-09-08 12:31) [8]

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


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

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


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

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

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


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

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


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

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

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


 
Heretic ©   (2004-09-08 12:46) [13]

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


 
TUser ©   (2004-09-08 12:51) [14]

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

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;

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


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

есть общий класс например 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;


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


 
Heretic ©   (2004-09-08 13:13) [16]

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


 
TUser ©   (2004-09-08 13:19) [17]

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


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

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, иначе создавать


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

Или так:

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;


 
Jeer ©   (2004-09-08 14:46) [20]

Heretic ©   (08.09.04 12:24) [5]

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


 
Jeer ©   (2004-09-08 14:48) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.037 c
1-1094816889
Still Swamp
2004-09-10 15:48
2004.09.26
Вызов внешнего редактора HTML


3-1093463113
S@shka
2004-08-25 23:45
2004.09.26
Объсните разницу триггеров Before и After


1-1094046629
Heretic
2004-09-01 17:50
2004.09.26
Регистрация Ehlib


3-1093422217
HanIP
2004-08-25 12:23
2004.09.26
DBGridEh


1-1094647438
Garfunkel
2004-09-08 16:43
2004.09.26
Распределение строк по captions