動態建立的視窗如何傳遞? |
尚未結案
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
我在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 發送簡訊給我 |
補充一下
像我在上述的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 發送簡訊給我 |
我試出一個簡的問題了
就是要變更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 發送簡訊給我 |
再試了一下
把使用到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 發送簡訊給我 |
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
終於找到問題了
這跟視窗傳遞沒有關係, 而是跟物件.....
main form有ttoolbutton
form2則沒有, 而在最下面的地方, 少了一個判斷式, 就出錯啦~
引言:加入紅色那一行就ok了 ********************************** 做簽名檔就跟寫程式一樣,想不出來!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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |