Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.27;
Скачать: CL | DM;

Вниз

Ошибка в цикле "for ii := 0 to FormOnOff.ControlCount-1 do"   Найти похожие ветки 

 
Zaicev   (2008-03-29 09:40) [0]

В модуле одной из форм своего проекта я разместил код, с помощью которого управляю активностья компонентов:
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-х форм путаются? Как это исправить?


 
Kolan ©   (2008-03-29 10:11) [1]

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

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

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


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

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


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

> 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, из модуля которой я беру код -есть!


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

ПРоверяй:

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:52) [4]

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

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

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


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

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


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

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


 
Kolan ©   (2008-03-29 11:06) [7]

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

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


 
Zaicev   (2008-03-29 11:26) [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:31) [9]

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

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


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

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


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

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


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

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;

я прав?


 
Kolan ©   (2008-03-29 11:46) [12]

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

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


 
Johnmen ©   (2008-03-29 11:50) [13]

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


 
Kolan ©   (2008-03-29 11:52) [14]

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

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

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


 
{RASkov} ©   (2008-03-29 12:12) [15]

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

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

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



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

Текущий архив: 2008.04.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1205737121
KSergey
2008-03-17 09:58
2008.04.27
BIOS выдает DMA Error


2-1207257029
FishNode
2008-04-04 01:10
2008.04.27
TCAlendarMouth


3-1196328581
ari_9
2007-11-29 12:29
2008.04.27
хранение пользовательских настроек программы в БД. идеология


2-1207050075
exe2k
2008-04-01 15:41
2008.04.27
Copyfile


2-1206891532
cyber-pilot
2008-03-30 19:38
2008.04.27
Создание и уничтожение дочерней формы