Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение Visible [D5, Win95/98]


alex_ran ©   (2002-11-15 11:29:00) 

Уважаемые мастера. Пишу небольшую программку для ведения табеля отработанных часов. Значения для каждого дня месяца заносятся в свой DBEdit. 1-й день - DBEdit1,..., 31-день - DBEdit31.
Для удобства юзера из этих DBEdit-ов формируется подобие календаря. Поэтому была введена процедура CalendareConstructor, опирающаяся на значение года - Edit1 и месяца ComboBox1, в обработчике onChange которого она и запускается, а Edit1.onChange ссылается на ComboBox1.onChange. В ней задаются координаты каждого DBEdit-а и его Enable и Visible. Все работает, но...
По запуску приложения в onCreate главной формы значения Edit1 и ComboBox1 инициализируются значениями текущей даты, после чего вызывается CalendareConstructor, при этом координаты, Enable срабатывают, а Visible - нет, т.е. например сейчас в ноябре DBEdit31.Enable=False и это работает, а DBEdit31.Visible=False не работает - компонент виден !!!?. В отладчике проверял Visible=False. Причем нормальное поведение восстанавливается после смены месяца, но не года. И только после первой смены месяца начинает работать и смена года.
Разрешить эту проблему удалось отключением (ComboBox1 и Edit1).onChange в onCreate формы и включением в onActivate. Все заработало.
Вот работающий код:

procedure TForm1.FormCreate(Sender: TObject);
var Day, Month, Year : Word;
begin
Edit1.OnChange:=nil;
ComboBox1.OnChange:=nil;
DecodeDate(Now(), Year, Month, Day);
Edit1.Text:=IntToStr(Year);
ComboBox1.ItemIndex:=Month-1;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
CalendareConstructor;
Edit1.OnChange:=ComboBox1Change;
ComboBox1.OnChange:=ComboBox1Change;
end;

А вот неработающий:
procedure TForm1.FormCreate(Sender: TObject);
var Day, Month, Year : Word;
begin
DecodeDate(Now(), Year, Month, Day);
Edit1.Text:=IntToStr(Year);
ComboBox1.ItemIndex:=Month-1;
CalendareConstructor;
end;

Вопрос, хотя сейчас все и работает, но хотелось бы понять с чем связано такое поведение Visible?


gvb   (2002-11-15 11:45:00) [1]

Свойства элементов формы задаются приложением позднее, чем на этапе конструктора формы. Я предпочитаю такую работу делать в FormShow.


Наверх

Титульная страница Поиск, карта сайта Написать письмо