-
кгшзх © (20.08.15 11:36) [20]раз:
property DropDownList : TTSTDropDownList read FDropDownList write SetDropDownList;
два:procedure TTSTPanel.SetDropDownList(const Value: TTSTDropDownList);
begin
FDropDownList := Value;
end;
какая магия при чтении панели из дфм должна вызвать SetItemList, если ты сам этого не сделал? -
кгшзх © (20.08.15 11:37) [21]Удалено модератором
-
r00xus © (20.08.15 11:42) [22]а какая магия тогда вызывает SetActive????? который тоже метод TTSTDropDownList скопируй код поставь breakpoint в SetActive и программа там остановиться. а в SetItemList нет. объясни это гений блин :)
-
кгшзх © (20.08.15 11:46) [23]Удалено модератором
-
r00xus © (20.08.15 11:52) [24]
TTSTDropDownList = class(TPersistent)
...
published
property Active : Boolean read FActive write SetActive;
property ItemList : TStrings read FItemList write SetItemList;
end;
гений, обрати пожалуйста внимание, что и Active и ItemList это published свойства TTSTDropDownList а не панели :))))) -
кгшзх © (20.08.15 13:03) [25]Ты наконец уже обрати внимание, умник, что в дфм лежат компоненты формы.
а на форме лежит панель, а не твой драный дропдаунлист.
он всего лишь свойство у панели.
вот если бы на форме лежал сам TTSTDropDownList тогда и был бы тебе вызов SetItemList при загрузке из дфм.
хотя кому я это говорю..... -
r00xus © (20.08.15 13:20) [26]Удалено модератором
-
кгшзх © (20.08.15 13:54) [27]
procedure TTSTDropDownList.SetActive(const Value: Boolean);
begin
ShowMessage('вызван TTSTDropDownList.SetActive(' + VarToStr(Value) + ')'#13#10'Список итемов:' + ItemList.Text);
ShowMessage('А появится он только после того, как отработает Loaded панели. Но дятлам это пофик. Они из чайлд-класса хотят рулить заполнением списков парента. Не имея представления ни о чем');
FActive := Value;
if FActive then
begin
FOwner.FComboBox := TComboBox.Create(FOwner);
FOwner.FComboBox.Parent := FOwner;
UpdateItems;
end
else
begin
if Assigned(FOwner.FComboBox) then
FreeAndNil(FOwner.FComboBox);
end;
end; -
кгшзх © (20.08.15 13:57) [28]причем в примере выше все паблишед уже переставлены в "правильном" порядке
published
property ItemList : TStrings read FItemList write SetItemList;
property Active : Boolean read FActive write SetActive default False; -
кгшзх © (20.08.15 14:08) [29]
TTSTPanel = class(TCustomPanel)
.....
procedure Loaded; override;
...
procedure TTSTPanel.Loaded;
begin
inherited;
ShowMessage('Вызван TTSTPanel.Loaded'#13#10'Списочек из дизайнтайм-редактора' + FDropDownList.ItemList.Text + #13#10'А теперь, осёл, запусти еще раз и на бумажке запиши последовательность появления всех мессаджбоксов');
end; -
DimaBr © (20.08.15 15:29) [30]
> 1. Почему если я ставлю breakpoint-ы в методе SetActive
> и SetItemList то при запуске программы breakpoint срабатывает
> только в SetActive. Ведь оба значения этих свойств по идее
> грузятся из DFM если они не установлены в значения по умолчанию.
Потому что вы не читали то что я вам написал, особенно пункт № 4. Методы SET для классов присваиваются при НАЗНАЧЕНИИ свойствам новых ВНЕШНИХ классов.
Если я в коде напишу так, то сработает SetItemListvar SL: TStringList;
begin
SL := TStringList.Create;
TSTPanel.DropDownList.ItemList := SL;
> 2. Насколько я понял порядок загрузки свойств из DFM аналогичен
> алфавитному порядку их имен (я сделал свойство AA и оно
> загрузилось раньше Active). Возможно ли как-то изменить
> этот порядок? При определении свойства можно указать index,
> но это вроде не для этого. Как поменять порядок?
Загрузки из DFM происходит в том порядке, в котором в DFM хранятся данные. А вот сохраняются они туда в том порядке, в котором расположены в описании.TTest = class(TComponent)
published
property AAA: integer;
property BBB: string;
end;
// в DFM сохранится свойство ААА, а за ним свойство BBB
TTest = class(TComponent)
published
property BBB: string;
property AAA: integer;
end;
// в DFM сохранится свойство BBB, а за ним свойство AAA -
имя(20.10.15 17:50) [31]Удалено модератором -
имя(20.10.15 19:16) [32]Удалено модератором -
имя(20.10.15 20:14) [33]Удалено модератором