Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1162473263
Leva
2006-11-02 16:14
2006.11.19
Подскажите как решить проблему?


2-1162226881
Evo
2006-10-30 19:48
2006.11.19
как убрать ошибку


2-1162358799
apic
2006-11-01 08:26
2006.11.19
TPersistent


2-1162562295
~Aid~
2006-11-03 16:58
2006.11.19
ProcessMessages


15-1162368065
Slider007
2006-11-01 11:01
2006.11.19
Чисто человеческий вопрос. Автошкола.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский