Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизКак задать порядок присвоения св-в компоненты при создании? Найти похожие ветки
← →
Doma © (2006-10-07 04:48) [0]Создал я свой компонет: (код неполный)
uses classes;
type
TMyComponent = class(TComponent)
private
FFiles: TStrings;
FActive: boolean;
//...
procedure SetActive (const Value: boolean);
procedure SetFiles (const Value: TStrings);
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
procedure ReadFiles(FileName: string);
published
property Active: boolean read FActive write SetActive;
property Files: TStrings read FFiles write SetFiles;
end;
implementation
{ TMyComponent }
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FFiles := TStringList.Create;
end;
destructor TMyComponent.Destroy;
begin
FFiles.Free;
FActive := false;
inherited;
end;
procedure TMyComponent.ReadFiles(FileName: string);
begin
//...
end;
procedure TMyComponent.SetActive(const Value: boolean);
var i: integer;
begin
FActive := Value;
if Active then
for i := 0 to FFiles.Count - 1 do // FFiles.Count = 0!!
ReadFiles(FFiles.Strings[i]);
end;
procedure TMyComponent.SetFiles(const Value: TStrings);
begin
FFiles.Assign(Value);
end;
Проблема заключается в том, что если в Design-Time установить св-во компоненты Active = true, и внести в список Files некоторые значения, при запуске сработает метод SetActive, в котором Files будет еще пустой. Как сделать так, чтобы св-ву Active значение присваивалось в последнюю очередь, чтобы всем остальным св-вам значения были уже присвоены?
← →
Ketmar © (2006-10-07 05:24) [1]сохранить Active во временной переменной и по-настоящему установить в перекрытом методе Loaded()?
← →
Loginov Dmitry © (2006-10-07 08:53) [2]В SetFiles можно добавить строку:
Active := FActive
← →
Percent (2006-10-07 09:08) [3]published
property Files: TStrings read FFiles write SetFiles;
property Active: boolean read FActive write SetActive;
end;
← →
Doma © (2006-10-07 12:09) [4]Спасибо за то что уделили мне свое драгоценное время, но
> Percent (07.10.06 09:08) [3]
>
> published
> property Files: TStrings read FFiles write SetFiles;
> property Active: boolean read FActive write SetActive;
> end;
Не помогает!
> Loginov Dmitry © (07.10.06 08:53) [2]
>
> В SetFiles можно добавить строку:
> Active := FActive
А если у меня не только Files надо заполнять, а еще кучу всего?
Сейчас попробую первый вараиан!
← →
jack128 © (2006-10-07 12:12) [5]Doma © (07.10.06 12:09) [4]
Не помогает!
нужно переустановить компонент в IDE, тогда поможет..
← →
Doma © (2006-10-07 12:35) [6]
> jack128 © (07.10.06 12:12) [5]
> нужно переустановить компонент в IDE, тогда поможет..
Да я его перекомпелировал? или этого не достаточно?
В итоге сделал как посоветовал Ketmar © и получилось следующее:
procedure TMyComponent.SetActive(const Value: boolean);
var i: integer;
begin
FActive := Value;
if not(csLoading in ComponentState) then
if Active then
for i := 0 to FFiles.Count - 1 do
ReadFiles(FFiles.Strings[i]);
end;
procedure TudPluginsManager.Loaded;
begin
inherited;
Active := FActive;
end;
Спасибо всем за помощь!
Правда возникла еще одна проблемка - как сделать так, чтобы когда закрываешь приложение, срабатывало бы Active := false, чтобы выгрузить эти файлы (т.к. эти файлы на самом деле dllки и их надо выгружать)
← →
Джо © (2006-10-07 19:27) [7]> [6] Doma © (07.10.06 12:35)
> Спасибо всем за помощь!
> Правда возникла еще одна проблемка - как сделать так, чтобы
> когда закрываешь приложение, срабатывало бы Active := false,
> чтобы выгрузить эти файлы (т.к. эти файлы на самом деле
> dllки и их надо выгружать)
Написать соответствующий код в деструкторе. Деструктор должен быть объявлен как override и в нем должен вызываться inherited (как правило, в самом конце метода).
← →
RASkov (2006-10-07 22:07) [8]
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FFiles := TStringList.Create;
FActive := False;
end;
destructor TMyComponent.Destroy;
begin
Active := false;
FFiles.Free;
inherited;
end;
procedure Zagruzit;
var i: Integer;
begin
for i := 0 to FFiles.Count - 1 do
ReadFiles(FFiles.Strings[i]);
end;
procedure Vigruzit;
var i: Integer;
begin
for i := 0 to FFiles.Count - 1 do
UnLoadFiles(FFiles.Strings[i]);
end;
procedure TMyComponent.SetActive(const Value: boolean);
var i: integer;
begin
if FActive<>Value then begin
FActive := Value;
if not(csLoading in ComponentState) and FActive then
Zagruzit else Vigruzit;
end;
end;
procedure TudPluginsManager.Loaded;
begin
inherited;
if Active then Zagruzit;
end;
ИМХО правильно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c