Как я могу узнать, создан ли пользовательский компонент? - PullRequest
2 голосов
/ 31 июля 2011

Я создаю памятку внутри процедуры, используя этот код:

  Global_MemoIni := TMemo.Create(Conf);
  Global_MemoIni.Parent := Conf;
  Global_MemoIni.Visible := False;
  Global_MemoIni.Align := alClient;
  Global_MemoIni.WordWrap := False;

Когда я снова вызываю процедуру, она снова создает global_memoini.
Как я могу узнать, создан ли компонент, поэтому мне не нужно вызывать его снова?

Обновление: могу ли я использовать Global_MemoIni.Free над кодом создания, чтобы в следующий раз создать Global_memoini один раз ... Но я хочу знать, если это создано ...

Спасибо

Ответы [ 4 ]

5 голосов
/ 31 июля 2011

Вы можете проверить, является ли Global_MemoIni Nil, и создать TMemo, если это так. В противном случае он уже существует, затем вы можете освободить его, используя Free или FreeAndNil. Если вы используете бесплатный, будьте осторожны, чтобы назначить Nil на Global_MemoIni. Если вы этого не сделаете, вы не можете использовать чек Global_MemoIni <> Nil.

3 голосов
/ 31 июля 2011

Честно говоря, я не понимаю смысла использования заметки вместо TStringList, который является более легким. просто сделай

unit UnitName;

interface

uses SysUtils, Windows, Classes, ...;

var Global_INI: TStringList; // <-- it's defined in the interface section, therefore
                             //     it can be accessed by any unit which uses this unit

implementation

initialization
  Global_INI := TStringList.Create;
  Global_INI.LoadFromFile( 'C:\config.ini' ); // <-- replace the file name with the
                                              //     one you want

finalization
  FreeAndNil( Global_INI );

end;
1 голос
/ 31 июля 2011

Не делайте это произвольная функция.Либо создайте компонент в FormCreate, либо даже в конструкторе формы, либо сделайте его доступным только для чтения, а затем используйте ленивый экземпляр, то есть

if not Assigned(Global_MemoIni) then
begin
  Global_MemoIni := TMemo.Create(Self);
  // rest of your code
end;
Result := Global_MemoIni;

Но почему он глобальный?Если вы сделаете его полем и соответствующим только для чтения свойством формы, оно будет легко доступно, и вы сможете защитить его, как показано выше.

FWIW, вместо освобождения компонента, разрешите Владельцу(форма) сделать это.Таким образом, он доступен, пока существует форма, и никаких неприятных проблем с недействительными указателями не может быть.

1 голос
/ 31 июля 2011

Если вы не знаете состояние создания объекта, используйте:

if not Assigned(Global_MemoIni) then
begin
  Global_MemoIni := TMemo.Create(Conf);
  ...
end

И не забудьте использовать FreeAndNil(Global_MemoIni) при уничтожении объекта.

...