線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1318
推到 Plurk!
推到 Facebook!

請問constructor Create(); 中的代碼執行失敗,我應怎樣 FREE 了這個Clas

尚未結案
Dot.com
一般會員


發表:19
回覆:18
積分:7
註冊:2003-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-16 21:57:35 IP:218.15.xxx.xxx 未訂閱
請問我繼承了一個類: TMyClass = Class(TObject) public constructor Create(FileName:string); end; implementation constructor TMyClass.Create(FileName: string); begin inherited Create; if FileExists(FileName) then try DoSth; //如果這果失敗,我應怎樣處理呢? except //這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎? end else begin //這果又應該怎樣寫才不創建這個CLASS呢? end; end; 另外: procedure TForm1.Button1Click(Sender: TObject); var MyClass:TMyClass; begin try MyClass := MyClass.Create('abc.txt'); //這裏編譯時爲什麽會有:Variable 'MyClass' might not have been //initialized 的警告? except MyClass.Free; end; end; 發表人 - Dot.com 於 2003/12/16 23:30:46
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-16 22:40:25 IP:218.161.xxx.xxx 未訂閱
小弟淺見: 物件應該沒有還到錯誤自己釋放自己的,通常都是建立物件的程式要負責在適當時機(例如 raise exception)把物件free掉. 這裡建議你應該是以下這樣的做法:
 
constructor TMyClass.Create(FileName: string);
begin
  inherited Create;
  try
    doSomething
  except
    raise Exception.Create('do something error/create error....');
  end;
end;
然後建立物件的程式碼這樣做:
var
  obj:TMyClass;
begin
  try
    obj:=TMyClass.Create(FileName);
  except
    ShowMessage('要告訴使用者的錯誤訊息..');
  end;
end;
Dot.com
一般會員


發表:19
回覆:18
積分:7
註冊:2003-07-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-17 07:25:12 IP:218.15.xxx.xxx 未訂閱
To change.jian 大俠: 如果沒發生到 錯誤 ,如下不滿足到某些條件,我就不創建這個 CLASS ,我又應該怎樣做呢?謝謝! Constructor TMyClass.Create(FileName: string); begin inherited Create; if FileExists(FileName) then try DoSth; //如果這果失敗,我應怎樣處理呢? except //這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎? end else begin //如果找不到 FileName 這個文件(並沒有發生except),則不創建這個 CLASS 的實體, //這果又應該怎樣寫才不創建這個CLASS呢? end; end;
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-17 17:01:00 IP:61.222.xxx.xxx 未訂閱
引言: To change.jian 大俠: 如果沒發生到 錯誤 ,如下不滿足到某些條件,我就不創建這個 CLASS ,我又應該怎樣做呢?謝謝! Constructor TMyClass.Create(FileName: string); begin inherited Create; if FileExists(FileName) then try DoSth; //如果這果失敗,我應怎樣處理呢? except //這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎? end else begin //如果找不到 FileName 這個文件(並沒有發生except),則不創建這個 CLASS 的實體, //這果又應該怎樣寫才不創建這個CLASS呢? end; end;
為你所設計的物件加上個function或property,用以檢查是否滿足某些條件,然後建立這個物件的程式,再依據這個屬性值來決定是否free.如下:
 
TMyClass=Class(TObject)
public
  constructor create(FileName:String);
  function IsReadyForUse:Boolean;
end;
呼叫的程式
var
  Obj:TMyClass;
begin
  Obj:=TMyClass.Create(MyFile);
  try
    if not Obj.IsReadyForUse then
      Obj.Free;
  finally
    if Assigned(Obj) then
      Obj.Free;
  end;
end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-17 17:30:10 IP:202.39.xxx.xxx 未訂閱
引言: 另外:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass:TMyClass;
begin
  try
  MyClass := MyClass.Create('abc.txt'); 
     //這裏編譯時爲什麽會有:Variable 'MyClass' might not have been 
     //initialized  的警告?
  except
    MyClass.Free;
  end;
end;
關於編譯警告的部份, 將 MyClass := TMyClass.Create('abc.txt'); 這行 移到 try .. except 的區塊外, 就不會出現這個 warning 訊息了, 即:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create('abc.txt');
  try
    // ...
  except
    MyClass.Free;
  end;
end;
--- Everything I say is a lie. 發表人 - hagar 於 2003/12/17 17:34:35
Dot.com
一般會員


發表:19
回覆:18
積分:7
註冊:2003-07-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-17 23:29:43 IP:218.15.xxx.xxx 未訂閱
我個人認爲: raise Exception.Create('do something error/create error....'); 或 Abort; 挺好的
 
procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass: TMyClass;
begin
  try
    MyClass := TMyClass.Create('abc.txt');
  except
    if assigned(MyClass) then   //這裏 MyClassc 已經是 Destroy 掉,只是 MyClass 指標
                                //非空而矣。所以下一句出現記憶體 read 出錯。MD ,就這
                                //裏讓我鑽了兩個晚上的死胡同,現在才想明白。          MyClass.Free;    end;    
系統時間:2024-11-25 4:20:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!