![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задам Вопрос Иначе - ;Как Упорядочить присвоение Свойствам
Демонов Е.В. © (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;
Ну Где Же Вы : Ученик, Старый Паскалист ?