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

Вниз

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 сюрпризы встречаются... хотя должно, по идее работать...
попробую.



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
1-80463
Vince
2002-03-05 22:03
2002.03.25
Генерация собственных событий


1-80584
RMIR
2002-03-10 18:21
2002.03.25
Ищётся конвертер из PAS в C/C++


6-80649
otari
2002-01-09 10:59
2002.03.25
Как мне откривать кокоинибуть TPC/IP порт


3-80427
dmitryK
2002-02-22 15:46
2002.03.25
Ошибки ADO


1-80474
Alek_1
2002-03-12 13:18
2002.03.25
Как скопировать файл?