Форум: "Основная";
Текущий архив: 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