全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1373
推到 Plurk!
推到 Facebook!

如何判斷變數內容非 nil

尚未結案
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-07 14:20:05 IP:211.20.xxx.xxx 未訂閱
各位好: 如下圖    if assigned(frmwork[j]) and (frmwork[j] is Tform) AND (length(string(frmwork[j].name)) > 30) then begin .. .. end; 當 j=1 時這行 length(string(frmwork[j].name) 會出現 如下錯誤 不知如何解,此判斷是要檢查變數內是否為 nil 或 tform 且為可正常 show 的變數!!謝謝!!
hagar
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-07 14:26:51 IP:202.39.xxx.xxx 未訂閱
確定 frmword[j] 不是 nil 後, 底下的判斷式才不會出現 Access Violation
begin
  if Assigned(frmwork[j]) then
  begin
    if (frmwork[j] is Tform) AND
      (length(string(frmwork[j].name)) > 30) then 
    begin
     ..
     .. 
  end;
end;
-- 歡迎光臨 KTop 研究院!
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-07 15:05:13 IP:211.20.xxx.xxx 未訂閱
引言: 確定 frmword[j] 不是 nil 後, 底下的判斷式才不會出現 Access Violation
begin
  if Assigned(frmwork[j]) then
  begin
    if (frmwork[j] is Tform) AND
      (length(string(frmwork[j].name)) > 30) then 
    begin
     ..
     .. 
  end;
end;
-- 歡迎光臨 KTop 研究院!
但 Assigned(frmwork[j]) 傳回 true
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-07 15:28:19 IP:219.80.xxx.xxx 未訂閱
你好:
  可能你的物件已被釋放,而frmwork[2] 的內容卻未設為 nil。切記,物件釋放並不會將物件變數內的值設為 nil。

   frmwork[2].Free;
   frmwork[2] := nil;    
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-07 15:45:06 IP:211.20.xxx.xxx 未訂閱
引言:
你好:
  可能你的物件已被釋放,而frmwork[2] 的內容卻未設為 nil。切記,物件釋放並不會將物件變數內的值設為 nil。

   frmwork[2].Free;
   frmwork[2] := nil;    
是已被釋放了,但我要何補救!!因 frmwork 為 mainFrom 的 Tfrom array 且是以 MDI From 去 Create 並已設 Action:=caFree 但子 form close 並無法將 frmWrok[j] := nil .
hagar
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-07 16:11:53 IP:202.39.xxx.xxx 未訂閱
小弟用如下的方式試了一下
var
  Form2: TForm2;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(nil);
  Form2.ShowModal;
  Form2.Free;
  ShowMessage(Form2.Name); // Form2 已經 Free 了, 未設成 nil, 但並不會產生 Access Violation
  Form2 := nil;
end;
想不通 ROLAND168 兄的 if 條件式裡為何有 AV 的現象?
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-07 17:23:01 IP:211.20.xxx.xxx 未訂閱
引言: 小弟用如下的方式試了一下
var
  Form2: TForm2;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(nil);
  Form2.ShowModal;
  Form2.Free;
  ShowMessage(Form2.Name); // Form2 已經 Free 了, 未設成 nil, 但並不會產生 Access Violation
  Form2 := nil;
end;
想不通 ROLAND168 兄的 if 條件式裡為何有 AV 的現象?
因為是 MDI FORM 所以是用 SHOW 非 ShowModal,所以將 FORM.Action:=caFree 但確出現 AV 的現象??
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-08 09:19:14 IP:219.80.xxx.xxx 未訂閱
你好:
  我試過 hagar 版大的方法運用在 MDI FORM 上,結過也
跟 hagar 版大一樣。所以你要不要把 Source 傳上來看看,
說不定問題出在其他的地方。      但我不清楚為何遭釋放的資源依然能夠存取而不發生錯誤< >
但測試結果又不假< >但我認為離開座位前把桌面清乾淨是一個
好習慣喔      至於如何將 >>    < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
        
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-08 09:53:04 IP:211.20.xxx.xxx 未訂閱
不好意思,有勞各位了 !!    ----- MainForm.pas call sub-form procedure ------
procedure TMainform.FormCreate(Sender: TObject);
begin
  inherited;
  RegisterClasses([TFBAS_Employee]);
end;    procedure TMainform.doform(muSelect: TObject);
var
  frmClass: TComponentClass;
  frmName:String;
  RSNO,j:integer;
  CreateFlag:Boolean;
  NewItem : TMenuItem;
begin
  TmpConn168.Connected:=false;
  try
    Screen.Cursor:=crHourGlass;
    frmName := 'TF' trim(TmainMenu(muselect).Name);
    frmClass:= TComponentClass(GetClass(frmName));
    CreateFlag:=true;
    FrmPoint:=FrmPoint 1;
    if FrmPoint >= 2 then
    begin
      for j:=0 to frmpoint-1 do
      begin
        if  assigned(frmwork[j]) and (frmwork[j] is Tform) AND
          (length(string(frmwork[j].name)) > 30)  then
        begin   //檢查是否已 create 
          if (UpperCase(trim('T' frmwork[j].name)) = UpperCase(trim(frmName))) then
          begin
            FrmWork[j].WindowState:=wsMaximized;
            frmwork[j].SetFocus;
            CreateFlag:=False;
            frmPoint:=FrmPoint-1;
          end
          else FrmWork[j].WindowState:=wsMinimized;
        end
        else frmwork[j]:=nil;
      end;
    end;
    if createFlag then
    begin
      frmWork[FrmPoint] := THWEnterForm(frmClass.Create(NIL));
      TForm(frmWork[FrmPoint]).Position := poOwnerFormCenter;
      THWEnterForm(frmWork[FrmPoint]).FormArrayPoint:=FrmPoint;
      Screen.Cursor:=crDefault;
      frmWork[FrmPoint].WindowState:=wsMaximized;
      frmWork[FrmPoint].formstyle:=fsMDIChild;
      frmWork[FrmPoint].Show;
    end;
  except
    ts_syserror('Sys Error(Open Form '  frmName);
  end;
  Screen.Cursor:=crDefault;
end;    ------- FBas_Employee.pas Employee Form on close event -----------
procedure TFBAS_Employee.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
  FreeAndNil(dmBAS_Employee);
end;
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-08 13:37:03 IP:219.80.xxx.xxx 未訂閱
你好:
  把紅色那行去掉試試。    >  //>    < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
        
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-08 14:37:35 IP:211.20.xxx.xxx 未訂閱
引言:
你好:
  把紅色那行去掉試試。    >  //>    < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
還是不行,另新增一個空白 FORM 也不行??
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-08 14:48:13 IP:211.20.xxx.xxx 未訂閱
引言:
你好:
  我試過 hagar 版大的方法運用在 MDI FORM 上,結過也
跟 hagar 版大一樣。所以你要不要把 Source 傳上來看看,
說不定問題出在其他的地方。      但我不清楚為何遭釋放的資源依然能夠存取而不發生錯誤< >
但測試結果又不假< >但我認為離開座位前把桌面清乾淨是一個
好習慣喔      至於如何將 >>    < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
版主您好,若用您的方法的確可行但 UNIT2 必須 USES UNIT1,因 FrmWork array 在 unit1 內,是否還還有其他方式能讓 unit2 不需 uses unit1 ,且在 unit1 內已知 unit2 已 close.謝謝
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-08 20:51:26 IP:220.135.xxx.xxx 未訂閱
Hi ROLAND168 你好: 以下這行要拆
if assigned(frmwork[j]) and (frmwork[j] is Tform) AND
   (length(string(frmwork[j].name)) > 30)  then
變成
if assigned(frmwork[j]) then
   if (frmwork[j] is Tform) then
      if length(string(frmwork[j].name)) > 30 then 
試試~~~~ 我不是高手, 高手是正在銀幕前微笑的人. 發表人 -
------


我不是高手, 高手是正在銀幕前微笑的人.
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-09-13 08:15:54 IP:211.20.xxx.xxx 未訂閱
謝謝各位!!我改用其他方式好了!!
系統時間:2024-04-19 14:52:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!