![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обращение к объектам, расположенным на 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....