Конференция "Начинающим" » Ошибка в цикле "for ii := 0 to FormOnOff.ControlCount-1 do"
 
  • Zaicev (29.03.08 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 © (29.03.08 10:11) [1]
    > Может как-то данные из 2-х форм путаются?

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

    if FormOnOff.Controls[ii] is TDataTimePiker


    А это где нахъодится? В примере такой строки нет.


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

    Как ты это определил?
  • Zaicev (29.03.08 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, из модуля которой я беру код -есть!
  • Сергей М. © (29.03.08 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 (29.03.08 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 (29.03.08 11:01) [5]
    как бы её сделать универсальной?
  • Johnmen © (29.03.08 11:03) [6]
    М.б. стОит всё же привести реальный код с указанием, где ошибка, а не эти ошмётки?
  • Kolan © (29.03.08 11:06) [7]
    > При том, что ты мне подсказал, появляется тот-же: «Access
    > violation»

    Какой еще тот же? Не о каком АВ речь не шла.
  • Zaicev (29.03.08 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 © (29.03.08 11:31) [9]
    > Format берёт компонент с Controls[ii] на той форме, в модуле
    > которой записан код!

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


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

    Ты про наследование что знаешь?
  • Johnmen © (29.03.08 11:33) [10]
    Сначала
    FormOnOff.Controls[ii]


    и вдруг
    TEdit(Controls[ii])


    м.б. пора начать думать?
  • Zaicev (29.03.08 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 © (29.03.08 11:46) [12]
    > [FormOnOff. — везде удаляем]

    Этим ты что хотел сказать?
  • Johnmen © (29.03.08 11:50) [13]
    Что он написал with и теперь это не надо.
  • Kolan © (29.03.08 11:52) [14]
    > Что он написал with и теперь это не надо.

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

    ЗЫ
     Автор, ты бы на вопрос в [9] ответил, мож и горевать по поводу: «компонентов то сколько!» не пришлось бы…
  • {RASkov} © (29.03.08 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 и т.п. ....
 
Конференция "Начинающим" » Ошибка в цикле "for ii := 0 to FormOnOff.ControlCount-1 do"
Есть новые Нет новых   [134433   +22][b:0][p:0.002]