Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1094333382
olookin
2004-09-05 01:29
2004.09.26
Как смертник скребет по бумаге...


1-1094717450
prorok2
2004-09-09 12:10
2004.09.26
CheckListBox и перерисовка


14-1094640803
Димитрий
2004-09-08 14:53
2004.09.26
Библиотеки компонентов параллельного программирования


3-1093240908
gunner
2004-08-23 10:01
2004.09.26
Post данных из DataSet в базу


14-1094585099
www.COMPDIALOG.narod.ru
2004-09-07 23:24
2004.09.26
Напишите несложную программу и получите 10 000$





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский