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

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

Задам Вопрос Иначе - ;Как Упорядочить присвоение Свойствам


Демонов Е.В. ©   (2002-09-11 13:47:00) 

FActive:Boolean;
procedure SetActive(VAlue:Boolean);

FWinControl:TWinControl;

Property Active:Boolean read FActive Write SetActive;
Property WinControl:TWinControl read FWinControl set FWinControl;

procedure fff.SetActive(VAlue:Boolean);
begin
if assigned(FWinControl) then
begin
ФункцияWinApi(FWinControl.Handle,......)
fActive:=VAlue;
end
else
fActive:=False;


end;

Но программа сначало читает из дфм значение свойства проперти, когда ещё FWinControl=nil, а уж потом свойство WinControl
В Итоге всё работает не так как задуманно;

Как мне сделать чтобы сначало читалось свойство WinControl, а потом Active?

кстати может есть способ програмно читать свойство из дфм,
тогда и ComponentState можно Использовать


vuk   (2002-09-11 20:59:00) [1]

to Макс Черных:
Добавлю еще, что стоит помнить о свойствах предка...


Макс Черных   (2002-09-11 20:54:00) [2]

>Помоему Ты Неправ
>Приду Домой, проверю

Да тут и проверять то нечего.
1. При записи в dfm TWriter просто перебирает свойства
в том порядке как они объявлены, и записывает.
2. При чтении, сначала читается наименование свойства
потом оно находится через GetPropInfo и ему присваивается
считанное значение.

Это есть азбучная истина, в чем можно убедиться посмотрев
Classes.pas

Хотелось бы обратить внимание вот на что, считается хорошим
стилем писать код так, чтобы работоспособность не зависела
от порядка следования/присвоения свойств. Хотя это удается не всегда. Как то в конференции на Borland в ответ на эту рекомендацию переспросили - а как же тогда быть с:
TTreeView = class(TCustomTreeView)
...
published
...
property OnStartDrag;
{ Items must be published after OnGetImageIndex and OnGetSelectedIndex }
property Items;
end;


Борландовцы ответили - ну, так из каждого правила есть исключения :)


Демонов Е.В.   (2002-09-11 18:03:00) [3]

>>Макс Черных

>>Cвойства записываются в dfm, и соответственно потом читаются
>>именно в том порядке в котором они объявлены.
>>Так что, достаточно просто поменять местами Active и WinControl

Помоему Ты Неправ
Приду Домой, проверю


Макс Черных   (2002-09-11 17:01:00) [4]

>Как мне сделать чтобы сначало читалось свойство WinControl, а >потом Active

Cвойства записываются в dfm, и соответственно потом читаются
именно в том порядке в котором они объявлены.
Так что, достаточно просто поменять местами Active и WinControl:

Property WinControl:TWinControl read FWinControl set FWinControl;
Property Active:Boolean read FActive Write SetActive;


Демонов Е.В.   (2002-09-11 14:30:00) [5]

>>Lord Warlock

Уже в десятый раз говорю, мне нужно чтобы свойство сохранялось в
dfm и что бы свойства потом читались из dfm в некотором порядке, который я хочу.


Lord Warlock   (2002-09-11 14:18:00) [6]

По-моему, чтобы свойство не сохраняло свое значение в dfm, нужно написать так:

Property Active:Boolean read FActive Write SetActive stored False;


Демонов Е.В.   (2002-09-11 14:13:00) [7]

Спасибо, Это уже то что надо!!!!!


SEM   (2002-09-11 14:08:00) [8]

procedure fff.SetActive(VAlue:Boolean);
begin
if assigned(FWinControl) then
begin
if not (csLoading in ComponentState) then
ФункцияWinApi(FWinControl.Handle,......)
fActive:=VAlue;
end
else
fActive:=False;
end;

procedure MyControl.Loaded;
begin
inherited;
if FActive and Assigned(FWinControl) then ФункцияAPI...
end;


Демонов Е.В.   (2002-09-11 14:07:00) [9]

Кто нибудь ответьте!!!!!!!!!!!!!!!!


Старый Паскалист   (2002-09-11 14:07:00) [10]

Мы кушаем!!!

Используй Loaded:

procedure fff.SetActive(VAlue:Boolean);
begin
if csReading in ComponentState then
FActive := Value;
// откладываем выполнение значащего кода до Loaded;
else
IndeedSetActive(Value);
end;

procedure fff.Loaded; // override;
begin
inherited;
if FActive then IndeedSetActive(True);
//...и может быть, что-нибудь ещё.
end;


Демонов Е.В.   (2002-09-11 13:54:00) [11]

имел в виду
Property WinControl:TWinControl read FWinControl Write WinControl;

Ну Где Же Вы : Ученик, Старый Паскалист ?


Наверх

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