Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизИщу инфу на программирование дочерних окон Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c