Значение лог. пер. Checkbox.Checked не передается в подпрограмму

Федор_Федор
Дата: 13.10.2006 09:41:37
Есть процедура DFT, которая имеет следующий список формальных параметров:

//ПРОЦЕДУРА ПРЯМОГО ДИСКРЕТНОГО ПРЕОБРАЗОВАНИЯ ФУРЬЕ
Procedure DFT(bmp:TBitmap; Var sp:MasComposite; OneDimensional,Centered:Boolean);

Процедуру DFT я использую в другой процедуре:

//FILTER4 (ФИЛЬТРАЦИЯ В ЧАСТОТНОЙ ОБЛАСТИ)
Procedure Filter4(bmp:TBitmap);
Begin
   If Assigned(bmp) then
   Begin
      DFT(bmp,spectr2,False,True);
      H(spectr2);
      IDFT(spectr2,bmp, False, True);
   End;
End;{Procedure}
//******************************************************************************

Так вот, если я указываю DFT(bmp,spectr2,False,True); то все работает.
Если в качестве третьего параметра (OneDimensional) я указываю не False, а Form3.Checkbox1.Checked, (который тоже False!), то не работает.

Как будто при вызове подпрограммы DFT не удается считать состояние чекбокса с третьей формы.
Стоит мне предварительно эту форму 3 показать, как все начинает работать.
В чем может быть дело? Подскажите, пожалуйста.
arni
Дата: 13.10.2006 09:46:07
1. Точное сообщение об ошибке процитируйте
2. Форма точно создана в момент обращения к чек-боксику?
Федор_Федор
Дата: 13.10.2006 10:18:58
arni
1. Точное сообщение об ошибке процитируйте

Не ошибка появляется, а процедура работает неправильно. Галочка у меня убрана, то есть OneDimensional = False, то есть должно производиться не одномерное, а двумерное преобразование Фурье.
А если я "напролом" задаю при вызове процедур False, то все работает.

arni
2. Форма точно создана в момент обращения к чек-боксику?

Не знаю. Я не совсем понимаю, в какой момент создается форма. Вроде бы форма должна создаваться в момент запуска программы. Я обращаюсь к чекбоксу не в момент создания формы 1 (вот тогда форма 3 еще не создана, как я понимаю), а уже значительно позже, после открытия файла с битмапом...
Obrazer
Дата: 13.10.2006 10:22:19
Федор_Федор
...Стоит мне предварительно эту форму 3 показать, как все начинает работать...

А откуда ты знаешь какое сосояние у чека, если форму еще ни разу не показывал (а может и не создавал).
Возможно, что все правильно работает и чек действительно включен
Андрей Спильный
Дата: 13.10.2006 10:23:35
Федор_Федор

Так вот, если я указываю DFT(bmp,spectr2,False,True); то все работает.
Если в качестве третьего параметра (OneDimensional) я указываю не False, а Form3.Checkbox1.Checked, (который тоже False!), то не работает.

что то я не понял с вашего объяснения - там должно быть true или false?
Андрей Спильный
Дата: 13.10.2006 10:24:18
Андрей Спильный

сорри, ступил %)
Федор_Федор
Дата: 13.10.2006 10:25:45
Я решил провести эксперимент - проверить, что творится с Чекбоксом перед вызовом процедуры.

//FILTER4 (ФИЛЬТРАЦИЯ В ЧАСТОТНОЙ ОБЛАСТИ)
Procedure Filter4(bmp:TBitmap);
Var
   abc:boolean;
Begin

abc:=Form3.CheckBox1.Checked;
ShowMessage(BoolToStr(abc));//Смотрим, в каком состоянии чекбокс.

   If Assigned(bmp) then
   Begin
      DFT(bmp,spectr2,False,True);
      H(spectr2);
      IDFT(spectr2,bmp, False, True);
   End;
End;{Procedure}

Лирическое отступление :-) :
Процедура фильтрации запускается у меня два раза, для двух изображений:

   Case Form1.ComboBox1.ItemIndex of
      0: {нет фильтра}                              Begin  Filter0;                           end;
      1: {метод ближайшего соседа}                  Begin  Filter0; Filter1(b1); Filter1(b2); end;
      2: {метод билинейной интерполяции}            Begin  Filter0; Filter2(b1); Filter2(b2); end;
      3: {метод обычной бикубической интерполяции}  Begin  Filter0; Filter3(b1); Filter3(b2); end;
      4: {Фильтрация в частотной области}           Begin  Filter0; Filter4(b1); Filter4(b2); end;
      5: {Фильтр Гаусса}                            Begin  Filter0; Filter5(b1); Filter5(b2); end;
   end;

Так вот. При первом запуске (для битмапа b1) значение чекбокса равно TRUE, хотя он на самом деле False. А при втором запуске (для битмапа b2) значение чекбокса равно False. В итоге первый битмап у меня все время фильтруется неправильно.
Сразу появляется мысль - значение чекбокса изменяется где-то программно. Но у меня такого нет.
В программе нигде нет строчки Form3.Checkbox1.Checked:=True (или False).
Федор_Федор
Дата: 13.10.2006 10:32:22
Obrazer
Федор_Федор
...Стоит мне предварительно эту форму 3 показать, как все начинает работать...

А откуда ты знаешь какое сосояние у чека, если форму еще ни разу не показывал (а может и не создавал).
Возможно, что все правильно работает и чек действительно включен


Большое спасибо - нашел ошибку! Вы правы. У меня при создании формы в редакторе стояло значение чекбокса = True.
Когда я показывал форму, то у меня считывались данные из ini-файла и чекбокс всегда сбрасывался в False (в ini-файле на данный момент так прописано). Вот я и думал, что у меня чекбокс всегда в фолс.
Часа два сидел...
Obrazer
Дата: 13.10.2006 10:39:43
Совет мой -
не пользовать явное обращение к компанентам других форм

abc:=Form3.CheckBox1.Checked;

А прописывать параметр в вызове функции,

Procedure Filter4(bmp:TBitmap; Check: boolen);

тогда значение всегда будет передаваться принудительно, и вопроса "откуда взялось такое" уже не будет
Федор_Федор
Дата: 13.10.2006 10:47:43
Obrazer
Совет мой -
не пользовать явное обращение к компанентам других форм
abc:=Form3.CheckBox1.Checked;
А прописывать параметр в вызове функции,
Procedure Filter4(bmp:TBitmap; Check: boolen);
тогда значение всегда будет передаваться принудительно, и вопроса "откуда взялось такое" уже не будет


У меня сначала было сделано так:
      DFT(bmp,spectr2,Form3.CheckBox1.Checked,True);
      H(spectr2);
      IDFT(spectr2,Form3.CheckBox1.Checked, True);
Это то, что вы имеете ввиду? А это не явное обращение к компоненту другой формы?

Просто у меня получалось так:
в процедуре DFT чекбокс был True, потому что так прописано при создании формы в редакторе.
а в процедуре H чекбокс уже был False, потому что я уже считывал настройки из ini-файла.

Вот и получался разлад. ДПФ считалось одномерное, а весовая функция (фильтр) и ОДПФ были уже двумерными.