Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

MDI - получение ссылки на конкретное дочернее окно (inside). 


Fellomena   (2002-03-12 11:01) [0]

Всем привет ! Ситуация: имеется MDI приложение.
Из главной формы создаю дочернии:

procedure TForm1.CreateMDIChild(const Name: string);
var
Child: TForm2;
begin
{ create a new MDI child window }
Child := TForm2.Create(Application);
Child.Caption := Name;
end;

Name - это "NoName"+ MDIChild.Count;
Так же имеется ещё один тип дочернего окна, на котором располагается
только график - это окно я создаю из дочернего окна:

procedure TForm2.CreateGraph(const Name: string);
var
Graph: TForm3;
begin
{ create graph window }
Graph := TForm3.Create(Application);
Graph.Caption := Name;
Draw();
end;

Name - это должно быть имя "Graph" + IntToStr(номер того MDI окна из которого было
создано это)... как-то запутанно получилось... код что ли кинуть...
Вопрос в том, как мне в процедуре Draw() вывести в Chart только что созданной
дочерней формы некие точки ?
Ведь Form3.Series1.AddXY(x, y); не пойдёт, т.к. нужен указатель на определённое MDIChild
окно в Chart-е которого буду работать с Series.
Наверное это просто очень, но я потыкалась-потыкалась и ничерта так и не вышло.
(понятно, что из MDI окна (то что Form2) с именем "NoName1" будет производиться
отрисовка во второе MDI окно (то, что с графиком - Form3) с именем "Graph1").



Alx2   (2002-03-12 11:09) [1]

С ходу придумалось пока это:
заводим сортированный TStringList в главной форме, где храним имена форм и, в TStringList.Objects, линки на эти формы. А потом через indexOf (в отсортированном Liste он ищет быстрым бинарным поиском) ищем нужную форму с нужным именем и рисуем на ней.

PS
Честно говоря, немного не понял задачки :(



Fellomena   (2002-03-12 11:13) [2]

Привет Alx2 =)

Спасибо за подсказку... надо подумать и попробовать...

Согласна, вопрос достаточно "тяжёл". Просто надо видеть всю картину целеком, но вся картина очень велика, что бы её сюда постить.



Alx2   (2002-03-12 11:18) [3]

Привет!
Еще вариант из help:

property MDIChildren[I: Integer]: TForm;

Provides indexed access to all MDI child forms.


Description

Use MDIChildren to access a child form.
var
I: Integer;
begin
with Form1 do
for I := MDIChildCount-1 downto 0 do
MDIChildren[I].Close;

end;



Бурундук   (2002-03-12 13:04) [4]

А если так ?

var
LastChild: TForm2;

procedure TForm1.CreateMDIChild(const Name: string);
var
Child: TForm2;
begin
{ create a new MDI child window }
Child := TForm2.Create(Application);
Child.Caption := Name;
LastChild := Child;
end;

...
if Assigned(LastChild) then ...



Владислав   (2002-03-12 14:32) [5]

А так не проще?

type
TForm2 = class(TForm)
...
private
...
ChartForm: TForm3;
...
end;

...

procedure TForm2.CreateGraph(const Name: string);
begin
{ create graph window }
ChartForm := TForm3.Create(Application);
ChartForm.Caption := Name;
Draw();
end;


А в Draw():
procedure TForm2.Draw;
begin
with ChartForm do
begin
//Do something
end
end;



Fellomena   (2002-03-12 15:32) [6]

2 Владислав: мда... неплохо, я над таким вариантом даже и не задумывалась, надо попробовать - если заработает нормально - то, пожалуй, это будет наилучший вариант =) Спасибо.

2 Alx2: у меня похоже тот же help, что и у тебя :))))
Владислав, похоже, понял в чём была загвоздка у меня.

2 Бурундук: мне не последняя была нужна, а все ранее созданные

ВСЁ !!!
Думаю проблема решена - всем огромное спасибо !



Fellomena   (2002-03-13 10:10) [7]

Действительно, прописав в uses формы 2 unit3 и сделав, как предложил Владислав - всё получилось отлично.
Но пару подводных камней ещё всплыло, может кому понадобиться:

делаю в дочерней форме процедуру procedure MySave(name: String; flag: boolean = false); для сохранения всех значений в файл, обращаюсь к этой процедуре из главной формы.
Так вот, из этой процедуры я не смогла, сначала, получить "прямой" доступ к компонентам дочерней формы, значения свойств которых я собиралась сохранять (т.е. a:= Edit1.Text; - не работала).
Я сделала процедуру MySave методом класса TForm2 и соответственно её переписала, но в этом случае простой вызов MySave(params); из главной формы давал ошибку - не известная процедура, а Form2.MySave(params); естественно давал ошибку при работе программы.

В итоге вся эта лабуда вылелась в следующее, на мой взгляд не очень элегантное решение:
(эта процедура находится в дочерней MDI форме, а вызывается из главной)

procedure MySave(name: String; flag: boolean = false);
var
MyList: TStringList;
i: integer;
temp: string;
begin
i:= Length(name);
if name[i-3] <> "." then
name:= name + ".vac";
Form1.ActiveMDIChild.Caption:= name;
MyList:= TStringList.Create();
for i:= 0 to Form1.ActiveMDIChild.ComponentCount-1 do
if Form1.ActiveMDIChild.Components[i] is TEdit then
MyList.Add( TEdit(Form1.ActiveMDIChild.Components[i]).Text);

MyList.Add("Memo1Start");
MyList.Add( TMemo(Form1.ActiveMDIChild.FindComponent("Memo1")).Text);
MyList.Add("Memo1End");

MyList.Add("Memo2Start");
MyList.Add( TMemo(Form1.ActiveMDIChild.FindComponent("Memo2")).Text);
MyList.Add("Memo2End");

if FileExists(name) and not(flag) then // flag - для Save1
begin
if MessageBox(0, PChar("File already exist. Do you want to replace it ?"), PChar("Save As..."),MB_YESNO+MB_ICONWARNING+MB_DEFBUTTON2) = IDYES then
MyList.SaveToFile(name);
end
else
MyList.SaveToFile(name);

MyList.Clear;
end;


Скажите - выделенные фрагменты не являются ли извращением ? Может возможен более гибкий вариант доступа к визуальным компонентам дочерней формы ?



Бурундук   (2002-03-13 10:51) [8]

Идея сделать MySave методом TForm2 представляется мне правильной.

(Form1.ActiveMDIChild as TForm2).MySave(params);



Fellomena   (2002-03-13 10:57) [9]

2 Бурундук:
а это заработает - ты проверял ?
И будит ли будет в процедуре MySave(), если она станет методом класса TForm2, выполнять напрямую присвоения (str1:= Memo1.Text); ?
А то с этими MDI сюрпризы встречаются... хотя должно, по идее работать...
попробую.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.016 c
7-80697           a1                    2001-12-24 13:10  2002.03.25  
есть ли такая возможность заставить CDROM


3-80394           MetallAdm             2002-02-24 15:30  2002.03.25  
Определить Сушествование ADO, ODBS ???


1-80498           Abzetdin              2002-03-09 21:33  2002.03.25  
Как создать в Delphi нестандартный тип? Например ..


1-80546           ATLANTIDO             2002-03-08 00:34  2002.03.25  
Выделить цветом


1-80626           Eraser                2002-03-11 09:26  2002.03.25  
ско-ко размер файла