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

動態建立的視窗如何傳遞?

尚未結案
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-03 17:33:02 IP:140.128.xxx.xxx 未訂閱
我在form1 create a new form2 在form1呼叫SetRunPermit(form1, myPermit)沒有問題 但是, form2卻不能SetRunPermit(form2, myPermit) 錯誤訊息如下: Access violation at address .... in module 'ProUtility.DLL'    應該嚴格來說, form2的property也都不能在form2裡面更改 我試過form2.keypreview:=True;在run時也會錯    不知道哪兒疏忽了, 煩請各位前輩指點一下, 謝謝!    程式如下: unit PubPackage; ...... procedure SetRunPermit(fmSRP: TForm; srPermit: String); far; external 'ProUtility.DLL'; ...... procedure TfmDataUpdate.GetDBData; begin   .......   SetRunPermit(fmPubPackage, myPermit); end; ...... procedure TfmPubPackage.bbtnAppendClick(Sender: TObject); var fmPPDU: TfmDataUpdate; begin try fmPPDU:=TfmDataUpdate.Create(Self); fmPPDU.ShowModal; finally fmPPDU.Free; end; end; -------------------------------------------------------- unit DataUpdate ...... procedure SetRunPermit(fmSRP: TForm; srPermit: String); far; external 'ProUtility.DLL'; ...... procedure TfmDataUpdate.InitialButton(const ibflag:Boolean); begin ....... SetRunPermit(fmDataUpdate, myPermit); end; ********************************** 做簽名檔就跟寫程式一樣,想不出來!
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-03 17:43:00 IP:140.128.xxx.xxx 未訂閱
補充一下 像我在上述的form2裡要取得這個視窗的元件 不能如下: procedure TfmDataUpdate.UpdateState; var   i: Integer;   CTemp: TComponent; begin   with fmDataUpdate do begin for i:=0 to ComponentCount-1 do begin CTemp:=Components[i]; if CTemp is TDBEdit then ........... end; end; end; 而必需如下: procedure TfmDataUpdate.UpdateState; var i: Integer; CTemp: TComponent; begin with fmPubPackage.Components[ifmDUP] do begin for i:=0 to ComponentCount-1 do begin CTemp:=Components[i]; if CTemp is TDBEdit then ....... end; end; end; ifmDUP是在TfmDataUpdate.formcreate時取得的 ifmDUP:=fmPubPackage.ComponentCount-1; 這樣子不是表示fmDataUpdate是fmPubPackage的一個元件了嗎? 而不算是一個獨立的視窗 我用過三種方法建立, 結果上述的問題還是有 fmPPDU:=TfmDataUpdate.Create(Self); fmPPDU:=TfmDataUpdate.Create(Nil); fmPPDU:=TfmDataUpdate.Create(Application); ********************************** 做簽名檔就跟寫程式一樣,想不出來!
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-04 15:30:25 IP:140.128.xxx.xxx 未訂閱
我試出一個簡的問題了 就是要變更form2的屬性和取得form2裡的元件 把上述的fmDataUpdate改成Self就可以用了 form2.keypreview:=True; => Self.keypreview:=True; with fmPubPackage.Components[ifmDUP] do => with Self do 至於SetRunPermit(Self, myPermit);還是有錯 ********************************** 做簽名檔就跟寫程式一樣,想不出來! 發表人 -
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-05 11:08:46 IP:140.128.xxx.xxx 未訂閱
再試了一下 把使用到DLL裡的那個程式(SetRunPermit)拿出來放在form2裡 是正常無誤的, 不過有點小小問題 程式如下 procedure SetRunPermit(fmSRP: TForm; srPermit: String); const   //                                      執行(查詢)    新增         修改         刪除          刪除        統計             列印         資料庫設定    資料庫複製     備份       還原       程式設定     特殊功能   aryPermits: array [1..13] of String = ('RunProgram', 'bbtnAppend', 'bbtnEdit', 'bbtnDelete', 'pmDelete', 'tbtnStatistic', 'tbtnPrint', 'tbtnDBSetup', 'tbtnDBCopy', 'tbtnBNR', 'tbtnBNR', 'tbtnSetup', 'Special');       // 權限名稱   //                                 貼查日期       完成日期         歸還日期          清除歸還   sPermits='0123456789ABZ'; var   CTemp: TComponent;   i, j: Integer; begin   with fmSRP do   begin     for i:=1 to Length(sPermits) do       if Pos(sPermits[i], srPermit)<=0 then       // 無權限者         if i<>11 then   // 非還原權限         begin           CTemp:=FindComponent(aryPermits[i]);           if CTemp=nil                     then Continue;           if CTemp.ClassName='TBitBtn'     then TBitBtn(CTemp).Enabled:=False;           if CTemp.ClassName='TPopupMenu'  then TPopupMenu(CTemp).AutoPopup:=False; if CTemp.ClassName='TToolButton' then TToolButton(CTemp).Enabled:=False; end else // 無還原權限, 依有無備份權限設定 else if i=11 then // 有還原權限 begin CTemp:=FindComponent(aryPermits[i]); // if CTemp.ClassName='TToolButton' then TToolButton(CTemp).Enabled:=True; end; end; end; 因為form2裡沒有(form1有) TPopupMenu和TToolButton, 所以compiler錯誤 我暫時 mark 掉那兩行就okay了 所以是不是這樣子造成第一篇的問題呢? 可是 > ********************************** 做簽名檔就跟寫程式一樣,想不出來!
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-05 14:52:12 IP:140.128.xxx.xxx 未訂閱
我又測試了 form2只要uses 加入Menus, ComCtrls Compiler就沒問題了, 也可正常執行 可是!! 我把SetRunPermit移回DLL裡 而DLL裡也有uses Menus, ComCtrls 它還是錯....... 麻煩前輩幫幫忙吧~~   ********************************** 做簽名檔就跟寫程式一樣,想不出來!
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-10 15:15:42 IP:140.128.xxx.xxx 未訂閱
終於找到問題了 這跟視窗傳遞沒有關係, 而是跟物件..... main form有ttoolbutton form2則沒有, 而在最下面的地方, 少了一個判斷式, 就出錯啦~    
引言:
procedure SetRunPermit(fmSRP: TForm; srPermit: String);
const
  //                                      執行(查詢)    新增         修改         刪除          刪除        統計             列印         資料庫設定    資料庫複製     備份       還原       程式設定     特殊功能
  aryPermits: array [1..13] of String = ('RunProgram', 'bbtnAppend', 'bbtnEdit', 'bbtnDelete', 'pmDelete', 'tbtnStatistic', 'tbtnPrint', 'tbtnDBSetup', 'tbtnDBCopy', 'tbtnBNR', 'tbtnBNR', 'tbtnSetup', 'Special');       // 權限名稱
  //                                 貼查日期       完成日期         歸還日期          清除歸還
  sPermits='0123456789ABZ';
var
  CTemp: TComponent;
  i, j: Integer;
begin
  with fmSRP do
  begin
    for i:=1 to Length(sPermits) do
      if Pos(sPermits[i], srPermit)<=0 then       // 無權限者
        if i<>11 then   // 非還原權限
        begin
          CTemp:=FindComponent(aryPermits[i]);
          if CTemp=nil                     then Continue;
          if CTemp.ClassName='TBitBtn'     then TBitBtn(CTemp).Enabled:=False;
          if CTemp.ClassName='TPopupMenu'  then TPopupMenu(CTemp).AutoPopup:=False;
          if CTemp.ClassName='TToolButton' then TToolButton(CTemp).Enabled:=False;
        end
        else              // 無還原權限, 依有無備份權限設定
      else
        if i=11 then      // 有還原權限
        begin
          CTemp:=FindComponent(aryPermits[i]);
          if CTemp=nil                     then Continue; 
          if CTemp.ClassName='TToolButton' then TToolButton(CTemp).Enabled:=True;
        end;
  end;
end;
加入紅色那一行就ok了 ********************************** 做簽名檔就跟寫程式一樣,想不出來!
系統時間:2024-11-23 7:16:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!