Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обращение к объектам, расположенным на MDIChild из MdiMain


Cosinus ©   (2005-02-18 15:12:00) 

Есть главная модальная форма, из которой в рантайм создаются 4 MdiChild окна, с тремя TChart на каждом. Формы создаются, как экземпляры созданной в дезайнтайм формы
type
 TStatus_fm = class(TForm)
   TempChart: TChart;
   Temp: TLineSeries;
   VoltChart: TChart;
   LineSeries1: TLineSeries;
   AmpChart: TChart;
   LineSeries2: TLineSeries;
end;

Что то никак я не пойму, как получить доступ к этим TСhart?


QuasiLamo   (2005-02-18 17:31:00) [1]

если

var f1,f2,f3,f4:TStatus_fm;


и

f1:=TStatus_FM.Create;

то наверно так

f1.VoltChart.(далее по интуиции)


Или возможно их удобнее будет в дин. массиве хранить...


Cosinus   (2005-02-18 17:05:00) [2]

Со StrToIntDefне вылетает. Ясно, значит что то просто не так с данными(хотя проверял же при трассировке?!). Видимо под вечер пятницы в предверие карпоративной вечеринки в честь пятилетия конторы уже совсем не думается:)))
Спасибо огромное за помощь, видимо буду завтра разбираться.


Семен Сорокин   (2005-02-18 17:04:00) [3]

CallStack чего показывает?
есть ли события на Series'ы по добавлению элементов или у самих чартов?


Cosinus   (2005-02-18 16:59:00) [4]


> Семен Сорокин ©   (18.02.05 16:50) [6]
Цикл остался от предыдущего варианта, просто не убрал пока...
Сейчас убрал и проверил на наличие Series. Есть. Все данные правильные, трассировал всю процедуру пошагово, AV вылетает на последнем, завершающем процедуру, End.


Семен Сорокин   (2005-02-18 16:50:00) [5]

>if MDIChildren[i].Tag=StrToInt(aData[1]) then
я бы все же добавил проверку на тип формы

не вижу смысла в этом цикле:
for j:=0 to ComponentCount-1 do
 if Components[j] is TChart then
Вы же все равно явно используете имена: VoltChart, AmpChart...
и к тому же получается что тело
begin
            if Param[1]<>'' then VoltChart.Series[0].AddXY(VoltChart.Series[0].Count,StrToInt(param[1]));
            if Param[2]<>'' then AmpChart.Series[0].AddXY(AmpChart.Series[0].Count,StrToInt(param[2]));
            if Param[3]<>'' then TempChart.Series[0].AddXY(TempChart.Series[0].Count,StrToInt(param[3]));
          end;
выполнится 3 (если чартов 3) раза.

>StrToInt(aData[1])
StrToIntDef

>...Series[0].
точно есть Series у каждого чарта?


Cosinus   (2005-02-18 16:43:00) [6]


> Семен Сорокин ©   (18.02.05 16:04) [3]
Хм... Может я туплю? Access violation на последнем End;
procedure TMain_fm.SetData(Str:string);
var
 aData:aStr;
 Param:aParam;
 i,j:word;
begin                                          
 aData:=StrParse(Str);
 if aData[5]='250' then
 begin
   Param:=DataParse(aData[6]);
   for i:=0 to MDIChildCount-1 do
     if MDIChildren[i].Tag=StrToInt(aData[1]) then
       with TStatus_fm(MDIChildren[i]) do
         for j:=0 to ComponentCount-1 do
           if Components[j] is TChart then
           begin
             if Param[1]<>'' then VoltChart.Series[0].AddXY(VoltChart.Series[0].Count,StrToInt(param[1]));
             if Param[2]<>'' then AmpChart.Series[0].AddXY(AmpChart.Series[0].Count,StrToInt(param[2]));
             if Param[3]<>'' then TempChart.Series[0].AddXY(TempChart.Series[0].Count,StrToInt(param[3]));
           end;
 end;
end;


Cosinus   (2005-02-18 16:07:00) [7]

Ага, ясно.
Спасибо.


Семен Сорокин   (2005-02-18 16:04:00) [8]


> Я думал так сделать. Но неужели только перебором?

А что Вас смущает?, даже если этих форм 1000 (в чём я сомневаюсь) - это будет длиться миллисекунды.

> Я же знаю имя созданной в рантайм формы('Status'+(index=set[1,2,3,4])).

А что Вам стоит написать нечто такой ф-ии:
GetFormByName('Status1') ?

> Знаю (или нет?) имена всех TChart. Имена остаются такие
> же, как я их задал в дизайнтайм?

да

>  Неужели оперируя этими данными нельзя сделать прямое обращение?

можно, если Вы сохраните ссылку на форму в отдельной переменной, ибо та же ф-я FindComponent (FindControl) использует банальный перебор.


Cosinus   (2005-02-18 15:23:00) [9]


> Семен Сорокин ©   (18.02.05 15:16) [1]
Я думал так сделать. Но неужели только перебором? Я же знаю имя созданной в рантайм формы('Status'+(index=set[1,2,3,4])). Знаю (или нет?) имена всех TChart. Имена остаются такие же, как я их задал в дизайнтайм? Неужели оперируя этими данными нельзя сделать прямое обращение?


Семен Сорокин   (2005-02-18 15:16:00) [10]

for _i := 0 to MDIChildCount-1 do
 if MDIChildren[_i] is TStatus_fm then
  TStatus_fm(MDIChildren[_i]).VoltChart....


Наверх

Титульная страница Поиск, карта сайта Написать письмо