안녕하세요 박태성님.
Create 절은 클래스로 오브젝트를 생성할 때 호출됩니다.
반면 initialization 절은 해당 유닛이 로드 될때 호출됩니다.
행위는 동일하다고 보시면 됩니다.
올려주신 코드랑 본문의 글을 보고 원하신는 바가 이런것이 아닐까 생각하고 테스트 해보았습니다.
1. Initialization 절에서 작성하신 Class로 FExcelProc 오브젝트 생성, 그과정에서 ExcelApp를 할당하였습니다.
2. MainForm에서 ExcelApp의 할당 여부를 Caption에 찍었습니다.
그럼...
unit Unit19;
interface
uses
SysUtils, Classes;
Type
TExcelProc = class(TObject)
protected
public
constructor Create;
destructor Destroy; override;
end;
var
ExcelApp : OleVariant;
implementation
uses
ComObj, Dialogs, Variants;
var
FExcelProc: TExcelProc;
{ TExcelProc }
constructor TExcelProc.Create;
begin
inherited Create;
try
ExcelApp := GetActiveOleObject('Excel.Application');
except
try
ExcelApp := CreateOleObject('Excel.Application');
except
ShowMessage('Cannot start Excel/Excel not installed ?');
Exit;
end;
end;
end;
destructor TExcelProc.Destroy;
begin
if not VarIsEmpty(ExcelApp) then
begin
ExcelApp.DisplayAlerts := False; // Discard unsaved files...
ExcelApp.Quit;
ExcelApp := Unassigned;
end;
inherited Destroy;
end;
initialization
FExcelProc := TExcelProc.Create;
finalization
FreeAndNil(FExcelProc);
end.
MainForm
unit Unit18;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm18 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form18: TForm18;
implementation
{$R *.dfm}
uses
Unit19;
procedure TForm18.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
Caption := BoolToStr(VarIsEmpty(ExcelApp), True);
end;
end.
박태성 님이 쓰신 글 :
: gomsun2 님이 쓰신 글 :
: : CoInitialize를 호출 하셨나요 ?
:
: uses
: ActiveX;
:
: initialization
: CoInitialize(nil);
:
: finalization
: CoUnInitialize;
: end.
:
:
: 말씀해주신대로 해봐도 같은 현상이 발생하는것 같습니다. 일단은 클래스를 생성하는 방식으로 해서
: 프로젝트를 계속 진행할까 합니다.
:
: 다시 한번 더 답변 감사드립니다.
|