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