Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

Как задать порядок присвоения св-в компоненты при создании?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.091 c
2-1162219520
term1t
2006-10-30 17:45
2006.11.19
operator/operand type mismach


15-1162270269
Zeqfreed
2006-10-31 07:51
2006.11.19
Проблема с DNS


3-1158744974
zdm
2006-09-20 13:36
2006.11.19
DROP GENERATOR


15-1162401978
Ne-Ld
2006-11-01 20:26
2006.11.19
Тонкий намек. Рекомендую к прочтению.


1-1159865750
Sham
2006-10-03 12:55
2006.11.19
Проблема с типами данных