2011-07-31 5 views
2

은이 코드를 사용하여 절차 내에서 메모를 작성 : 다시 프로 시저를 호출 할 때사용자 정의 구성 요소가 생성되었는지 어떻게 알 수 있습니까?

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을 만들 Global_MemoIni.Free 생성 코드 위에 사용 ...하지만 난이가 만들어 알고 싶어 할 수

+0

게으른 초기화/싱글 톤 패턴처럼 보이지만 도우미 메서드 (GetMemoIni)로 추출 할 수 있습니다. 그러나 '사용자 정의'는 무엇입니까? – mjn

답변

5

당신에게 Global_MemoIni가 Nil인지 확인하고 TMemo를 작성하십시오. 그렇지 않으면 이미 존재하므로 Free 또는 FreeAndNil을 사용하여 해제 할 수 있습니다. 무료로 사용하는 경우 NilGlobal_MemoIni으로 지정하십시오. 그렇지 않은 경우 Global_MemoIni <> Nil 수표를 사용할 수 없습니다.

+2

나는 직접 nil을 검사하지 말고'Assigned (GlobalMemoIni) then then'을 사용할 것을 권합니다. 더 큰 소스 기반에서 이러한 수표를 찾는 것이 훨씬 쉬우 며 "xxx가 아닌"테스트 대신 "긍정적 인"테스트의 추가 보너스가 있습니다. –

+0

전 상황에 만족하지 않습니다. 구성 요소는 정의 된 지점에서 한 번만 만들어야하며 반복해서 호출 될 수있는 함수가 만들어서는 안됩니다. 양식이 수동으로 처리되므로 수동으로 해제해서는 안됩니다. 게으른 인스턴스 생성이 필요한 경우, 이미 생성되었는지 (실제로는 Assigned, Marjan을 사용하여) 만들어 졌는지 확인하고 그렇지 않은 경우에만 생성하는 속성이 될 수 있습니다. 그렇지 않으면 생성자 나 폼의 FormCreate에서이 작업을 수행합니다. –

+0

FWIW,'TStrings' 홀더로 남용되는 경우,'TStringList'가 실제로 훨씬 낫습니다. –

3

나는 더 가벼운 TStringList 대신에 메모를 사용하는 것에 대해 솔직히 이해하지 못합니다.

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

그리고 오브젝트를 파괴 할 때 FreeAndNil(Global_MemoIni)를 사용하는 것을 잊지 마세요 : 당신이 객체 사용의 생성 상태를 모르는 경우 단지

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; 
+0

메모가 시각적으로 사용되지 않았다는 결론에 도달 한 방법 –

+0

Global_MemoIni.Visible : = False; 하지만 당신은 맞습니다. 그는 언젠가 그것을 보여줄 것입니다 ... – ComputerSaysNo

+0

많은 사람들이 데이터 구조로 컨트롤을 사용합니다,이 가정은 정확할 수도 있습니다 : 불행히도 :-( –

1

을한다.

+0

그게 더 쉽습니다 ... 나는 아주입니다. 바보 같은 – azrael11

1

임의의 기능이 아닙니다. 어느 형태의 FormCreate에서 구성 요소 또는 생성자를 만들거나 그것을 형태의 읽기 전용 속성을 확인하고 게으른 인스턴스를 사용, 즉

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

을하지만, 왜 세계인가? 양식의 필드 및 해당 읽기 전용 속성을 만들면 쉽게 액세스 할 수 있으며 위에 표시된 방법으로 보호 할 수 있습니다.

FWIW, 구성 요소를 해제하는 대신 Owner (양식)로 보냅니다. 그렇게하면 양식이 존재하는 한 사용할 수 있으며 불쾌한 잘못된 포인터 문제는 발생할 수 없습니다.

+0

그게 아주 쉽지 ... 나는 어리 석다 – azrael11

+0

하나는 바보 같은 글로벌 변수를 사용하지 않아도됩니다.

관련 문제