-
В модуле одной из форм своего проекта я разместил код, с помощью которого управляю активностья компонентов: procedure TFormPro.SetEnable(FormOnOff: TWinControl; pr, newz: boolean);
var ii: integer; begin 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-х форм путаются? Как это исправить?
-
> Может как-то данные из 2-х форм путаются?
Нет это фонтастика. if FormOnOff.Controls[ii] is TDataTimePiker А это где нахъодится? В примере такой строки нет. > Label9 есть на форме, в которой прописан этот код, но нет > на FormSmot!
Как ты это определил?
-
> 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, из модуля которой я беру код -есть!
-
ПРоверяй:
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
Сообщение видишь ? Если видишь, приводи дословный его текст
-
Да, спасибо за совет! При том, что ты мне подсказал, появляется тот-же: "Access violation"
а вот если довавить сразу после if FormOnOff.Controls[ii] is TDataTimePiker then begin после которого и появляется ошибка, узнаём: форма - FormSmot, компонент - DateTimePickerRabot
ошибка сдесь TDateTimePicker(Controls[ii]).Format := ''; может тут просто указывать надо FormOnOff.DateTimePicker(Controls[ii]).Format := '' !?!?! )))) может можно как-то в начале этой процедуры прописать case или with ?
-
как бы её сделать универсальной?
-
М.б. стОит всё же привести реальный код с указанием, где ошибка, а не эти ошмётки?
-
> При том, что ты мне подсказал, появляется тот-же: «Access > violation»
Какой еще тот же? Не о каком АВ речь не шла.
-
procedure TFormPro.SetEnable(FormOnOff: TWinControl; pr, newz: boolean);
var ii: integer; begin 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. ... ?!
-
> Format берёт компонент с Controls[ii] на той форме, в модуле > которой записан код!
Естественно.
> компонентов то сколько!
Ты про наследование что знаешь?
-
Сначала FormOnOff.Controls[ii] и вдруг TEdit(Controls[ii]) м.б. пора начать думать?
-
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; я прав?
-
> [FormOnOff. везде удаляем]
Этим ты что хотел сказать?
-
Что он написал with и теперь это не надо.
-
> Что он написал with и теперь это не надо.
Ааа, ну тогда, видимо, да.
ЗЫ Автор, ты бы на вопрос в [9] ответил, мож и горевать по поводу: «компонентов то сколько!» не пришлось бы
-
> и далее страницы на 2! компонентов то сколько!
> Ты про наследование что знаешь?
Хинт: Незачем, например, писать так: if Controls[ii] is TLabel then TLabel(Controls[ii]).Enabled:=<>; if Controls[ii] is TEdit then TEdit(Controls[ii]).Enabled:=<>; .... Это все сводится к одному предку.... Глядишь и две страницы кода в пару строк уложаться :) ...С такими-то вещами как то ShowHint, Enabled и т.п. ....
|