Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 сюрпризы встречаются... хотя должно, по идее работать...
попробую.



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

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

Наверх





Память: 0.48 MB
Время: 0.004 c
1-80590
AlexNord
2002-03-10 03:19
2002.03.25
Progress Bar или что то похожее!:)


14-80658
Елена
2002-02-08 12:48
2002.03.25
Не срабатывает таймер!!!


14-80661
Lena
2002-02-11 02:24
2002.03.25
Что значит ИМХО???


1-80543
heruvim4ik
2002-03-09 14:05
2002.03.25
Иконка к приложению


1-80493
A.H.
2002-03-12 19:26
2002.03.25
TImage - почему у меня ничего не получается :-(( ??





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский