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

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

Ошибка в цикле "for ii := 0 to FormOnOff.ControlCount-1 do"


Zaicev ©   (2008-03-29 09:40:00) 

В модуле одной из форм своего проекта я разместил код, с помощью которого управляю активностья компонентов:
procedure TFormPro.SetEnable(FormOnOff: TWinControl; pr, newz: boolean);
var ii: integer; //pr=true-разрешить ввод данных, false-только просмотр
begin            //newz=true -новая запись = пустые поля
for ii := 0 to FormOnOff.ControlCount-1 do
begin
 if FormOnOff.Controls[ii] is TLabeledEdit
 then begin
  .......

чтобы его не дублировал я объявил его в public и по нажатию на кнопку прописал:
procedure TFormSmot.ToolButtonNewClick(Sender: TObject);
begin  //разрешить, новая запись
FormPro.SetEnable(FormSmot, true, true);
end;

но при нажатии на кнопку появляется ошибка, а пошаговая трассировка показала:
- при очередном цикле (for ii := 0 to FormOnOff.ControlCount-1 do) обрабатывается компонент с названием "Label9", и при этом срабатывает if FormOnOff.Controls[ii] is TDataTimePiker...! Label9 есть на форме, в которой прописан этот код, но нет на FormSmot! Может как-то данные из 2-х форм путаются? Как это исправить?


{RASkov}   (2008-03-29 12:12:00) [1]

> и далее страницы на 2! компонентов то сколько!

> Ты про наследование что знаешь?

Хинт:
Незачем, например, писать так:
if Controls[ii] is TLabel then TLabel(Controls[ii]).Enabled:=<>;
if Controls[ii] is TEdit then TEdit(Controls[ii]).Enabled:=<>;
....
Это все сводится к одному предку.... Глядишь и две страницы кода в пару строк уложаться :)
...С такими-то вещами как то ShowHint, Enabled и т.п. ....


Kolan   (2008-03-29 11:52:00) [2]

> Что он написал with и теперь это не надо.

Ааа, ну тогда, видимо, да.

ЗЫ
 Автор, ты бы на вопрос в [9] ответил, мож и горевать по поводу: «компонентов то сколько!» не пришлось бы…


Johnmen   (2008-03-29 11:50:00) [3]

Что он написал with и теперь это не надо.


Kolan   (2008-03-29 11:46:00) [4]

> [FormOnOff. — везде удаляем]

Этим ты что хотел сказать?


Zaicev   (2008-03-29 11:37:00) [5]

procedure TFormPro.SetEnable(FormOnOff: TWinControl; pr, newz: boolean);
var ii: integer;
begin
with FormOnOff do
 for ii := 0 to [FormOnOff. - везде удаляем] ControlCount-1 do
 begin
  ...
 end;
end;
end;

я прав?


Johnmen   (2008-03-29 11:33:00) [6]

Сначала
FormOnOff.Controls[ii]
и вдруг
TEdit( Controls[ii])
м.б. пора начать думать?


Kolan   (2008-03-29 11:31:00) [7]

> Format берёт компонент с Controls[ii] на той форме, в модуле
> которой записан код!

Естественно.


> компонентов то сколько!

Ты про наследование что знаешь?


Zaicev   (2008-03-29 11:26:00) [8]

procedure TFormPro.SetEnable(FormOnOff: TWinControl; pr, newz: boolean);
var ii: integer; //pr=true-разрешить ввод данных, false-только просмотр
begin            //newz=true -новая запись = пустые поля
for ii := 0 to FormOnOff.ControlCount-1 do
begin
if FormOnOff.Controls[ii] is TEdit then
begin
 if newz=true then TEdit(Controls[ii]).Text:='';
 TEdit(Controls[ii]).Active:=false;
 TEdit(Controls[ii]).ShowHint:=true;
end;
if FormOnOff.Controls[ii] is TDataTimePiker
then begin
 if pr=true then TDateTimePicker(Controls[ii]).Format := '';
end;
end;
end;

и далее страницы на 2! компонентов то сколько!
ошибка, я так понял, из-за того, что FormOnOff.Controls[ii] is TDataTimePiker программа находит правильно, а TDateTimePicker(Controls[ii]).Format берёт компонент с Controls[ii] на той форме, в модуле которой записан код! и это уже может быть совсем не TDataTimePiker - отсюда и АВ и Label9!

А как тогда бы, вот хотя бы на этом маленьком примерчике можно привязять весь код к форме procedure TFormPro.SetEnable( FormOnOff: TWinControl; pr, newz: boolean); не переписывая повсюду FormOnOff. ... ?!


Kolan   (2008-03-29 11:06:00) [9]

> При том, что ты мне подсказал, появляется тот-же: «Access
> violation»

Какой еще тот же? Не о каком АВ речь не шла.


Johnmen   (2008-03-29 11:03:00) [10]

М.б. стОит всё же привести реальный код с указанием, где ошибка, а не эти ошмётки?


Zaicev   (2008-03-29 11:01:00) [11]

как бы её сделать универсальной?


Zaicev   (2008-03-29 10:52:00) [12]

Да, спасибо за совет!
При том, что ты мне подсказал, появляется тот-же: "Access violation"

а вот если довавить сразу после
if FormOnOff.Controls[ii] is TDataTimePiker
then begin
после которого и появляется ошибка, узнаём:
форма - FormSmot, компонент - DateTimePickerRabot

ошибка сдесь
TDateTimePicker(Controls[ii]).Format := '';
может тут просто указывать надо FormOnOff.DateTimePicker(Controls[ii]).Format := ''
!?!?! ))))
может можно как-то в начале этой процедуры прописать case или with ?


Сергей М.   (2008-03-29 10:31:00) [13]

ПРоверяй:

for ii := 0 to FormOnOff.ControlCount-1 do
begin
if FormOnOff.Controls[ii] is TLabeledEdit
then begin
   if FormOnOff.Controls[ii].Name = 'Label9' then
     ShowMessage('На форме ' + FormOnOff.Name + ' ЕСТЬ контрол с именем Label9 !!!')
   ...
end
...
end

Сообщение видишь ?
Если видишь, приводи дословный его текст


Zaicev   (2008-03-29 10:18:00) [14]

> if FormOnOff.Controls[ii] is TDataTimePiker А это где нахъодится?
for ii := 0 to FormOnOff.ControlCount-1 do
begin
if FormOnOff.Controls[ii] is TLabeledEdit
then begin
 .......
end;
if FormOnOff.Controls[ii] is TDataTimePiker
then begin
 .......
end;

всё по-порядку!
> Label9 есть на форме, в которой прописан этот код, но нет
на FormSmot! Как ты это определил?

Ну что я н знаю что у меня на форме находится!?!? На той форме, которую я в данный момент хочу "обработать" FormPro.SetEnable( FormSmot, true, true) - Label9 нет! А вот на FormPro, из модуля которой я беру код -есть!


Kolan   (2008-03-29 10:11:00) [15]

> Может как-то данные из 2-х форм путаются?

Нет это фонтастика.

if FormOnOff.Controls[ii] is TDataTimePiker
А это где нахъодится? В примере такой строки нет.


> Label9 есть на форме, в которой прописан этот код, но нет
> на FormSmot!

Как ты это определил?


Наверх

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