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

MDI呼叫DLL能否判斷或避免重覆呼叫??

答題得分者是:eaglewolf
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-01 16:57:42 IP:123.204.xxx.xxx 訂閱
請問各位先進......
小弟已爬文了很久...
都找不到答案..!!
或是看不太懂..!!

問題是這樣子的..↓

小弟已做好DLL了..(DLL已設為fsMDIChild)
但是在做MDI呼叫DLL之後..
發現到..可重覆呼叫..!!

小弟主要是要避免重覆呼叫DLL...

請教各位先進能否教教小弟可以避免這個問題的方法嗎??
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-02 02:16:18 IP:122.116.xxx.xxx 未訂閱
用變數去記 ?


===================引 用 shine0989 文 章===================
請問各位先進......
小弟已爬文了很久...
都找不到答案..!!
或是看不太懂..!!

問題是這樣子的..↓

小弟已做好DLL了..(DLL已設為fsMDIChild)
但是在做MDI呼叫DLL之後..
發現到..可重覆呼叫..!!

小弟主要是要避免重覆呼叫DLL...

請教各位先進能否教教小弟可以避免這個問題的方法嗎??
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-02 12:44:05 IP:123.204.xxx.xxx 訂閱
感謝 eaglewolf 大大回覆~

請問大大說的 用變數去記..
小弟是Delphi 新手..不知道要怎麼去用變數去記!!??

這樣說好了..

那如何將已呼叫到的DLL的窗體 跳到最上層 也就是active 等於 true 的情況!!


===================引 用 eaglewolf 文 章===================
用變數去記 ?
?

===================引 用 shine0989 文 章===================
請問各位先進......
小弟已爬文了很久...
都找不到答案..!!
或是看不太懂..!!

問題是這樣子的..↓

小弟已做好DLL了..(DLL已設為fsMDIChild)
但是在做MDI呼叫DLL之後..
發現到..可重覆呼叫..!!

小弟主要是要避免重覆呼叫DLL...

請教各位先進能否教教小弟可以避免這個問題的方法嗎??
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-03 11:23:49 IP:211.75.xxx.xxx 未訂閱
簡單一點 用 Array 去存
假設你有20個不同的MDI ChildForm
DLLForm: array[1..20] of bool;
每次要載入前 檢查對應array value為true 若否則載入並設定相對應array value為true
若是則不再載入dll 而是呼叫dll的提供的procedure 讓視窗恢復 normal size 並將視窗提到最上層 (Form.BrintToFront)
當你卸載Dll時 設定相對應array value為false

===================引 用 shine0989 文 章===================
感謝 eaglewolf大大回覆~

請問大大說的 用變數去記..
小弟是Delphi 新手..不知道要怎麼去用變數去記!!??

這樣說好了..

那如何將已呼叫到的DLL的窗體 跳到最上層 也就是active 等於 true 的情況!!


===================引 用 eaglewolf 文 章===================
用變數去記 ?
?

===================引 用 shine0989 文 章===================
請問各位先進......
小弟已爬文了很久...
都找不到答案..!!
或是看不太懂..!!

問題是這樣子的..↓

小弟已做好DLL了..(DLL已設為fsMDIChild)
但是在做MDI呼叫DLL之後..
發現到..可重覆呼叫..!!

小弟主要是要避免重覆呼叫DLL...

請教各位先進能否教教小弟可以避免這個問題的方法嗎??
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-04-07 16:49:11 IP:123.204.xxx.xxx 訂閱
非常感謝eaglewolf 大大回覆...

不太懂大大的說方法.....
請問是將DLL FORM的名字存在陣列中是嗎??

還是我換個問法好了..!!

問題:
我怎麼得知(搜尋)我目前已開的DLL的FORM的名字??

目的:
當我用MDI呼叫DLL時~
MDI下方的任務欄能暫存有DLL的FORM的名字!
方便查看已呼叫的DLL~
且希望能防止重覆呼叫DLL!


===================引 用 eaglewolf 文 章===================
簡單一點 用 Array 去存
假設你有20個不同的MDI ChildForm
DLLForm: array[1..20] of bool;
每次要載入前 檢查對應array value為true 若否則載入並設定相對應array value為true
若是則不再載入dll 而是呼叫dll的提供的procedure 讓視窗恢復 normal size 並將視窗提到最上層 (Form.BrintToFront)
當你卸載Dll時 設定相對應array value為false

===================引 用 shine0989 文 章===================
感謝 eaglewolf大大回覆~

請問大大說的 用變數去記..
小弟是Delphi 新手..不知道要怎麼去用變數去記!!??

這樣說好了..

那如何將已呼叫到的DLL的窗體 跳到最上層 也就是active 等於 true 的情況!!


===================引 用 eaglewolf 文 章===================
用變數去記 ?
?

===================引 用 shine0989 文 章===================
請問各位先進......
小弟已爬文了很久...
都找不到答案..!!
或是看不太懂..!!

問題是這樣子的..↓

小弟已做好DLL了..(DLL已設為fsMDIChild)
但是在做MDI呼叫DLL之後..
發現到..可重覆呼叫..!!

小弟主要是要避免重覆呼叫DLL...

請教各位先進能否教教小弟可以避免這個問題的方法嗎??
編輯記錄
shine0989 重新編輯於 2010-04-07 16:49:50, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-04-07 23:24:41 IP:122.116.xxx.xxx 未訂閱
或者你可以用一個 TStringList 存 DLL Name(或MDI Child Name)
透過TStringList 提供的方法 應該可以達到你的要求
var
DLLNameList:TStringList;

//when Load Main Form
LoadedDLLs := TStringList.Create;

//when Close Main Form
LoadedDLLs.Clear;
LoadedDLLs.Free;

//load dll
if LoadedDLLs.IndexOf(DllName) < 0 then
begin
LoadedDLLs.Append(DllName);
//load dll
end
else
begin
//briing form to front
end;

//unload dll
var
index:Integer;
index := LoadedDLLs.IndexOf(DllName);
if (index > -1) then
begin
LoadedDLLs.Delete(index);
//unload dll
end;

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-04-08 09:51:59 IP:123.204.xxx.xxx 訂閱
太感謝eaglewolf大大回覆^^

大大真的太神了..!!
小弟真的佩服的呢~

剛用了大大給的語法..
行的通了耶.^^
真的不會再重覆呼叫了..

可是有一個問題..
就是..當DLL關掉後..釋放掉..
//unload dll
var
? index:Integer;
index := LoadedDLLs.IndexOf(DllName);
if? (index > -1) then
begin
?? LoadedDLLs.Delete(index);
?? //unload dll
end;
的這段語法要下在那.??

是MDI 那嗎...
還是DLL那???

還有另一個小問題..
大大指的↓
//briing form to front
要怎麼下??


===================引 用 eaglewolf 文 章===================
或者你可以用一個 TStringList 存 DLL Name(或MDI Child Name)
透過TStringList 提供的方法 應該可以達到你的要求
var
? DLLNameList:TStringList;

//when Load Main Form
LoadedDLLs := TStringList.Create;

//when Close Main Form
LoadedDLLs.Clear;
LoadedDLLs.Free;

//load dll
if LoadedDLLs.IndexOf(DllName) < 0 then
begin
? LoadedDLLs.Append(DllName);
?? //load dll
end
else
begin
?? //briing form to front
end;

//unload dll
var
? index:Integer;
index := LoadedDLLs.IndexOf(DllName);
if? (index > -1) then
begin
?? LoadedDLLs.Delete(index);
?? //unload dll
end;

eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-04-08 10:20:14 IP:211.75.xxx.xxx 未訂閱
(1) unload dll:
當User關閉MDI Child Form時
要通知Main Form卸載Dll
就是在這個時候 設定


(2) bring form to front:
在DLL中提供類似的procedure:

[code delphi]
procedure BringFormToFront;
begin
if WindowState <> wsNormal then
WindowState := wsNormal;
BringToFront;
end;
[/code]


------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-04-08 11:05:50 IP:123.204.xxx.xxx 訂閱
真的真的再次感謝eaglewolf大大用心回覆..!!

小弟真的太嫩了..

已將unload dll的這段語法
放置大大所說的地方了..
可是關掉時..會報錯..!!

我不知怎麼上傳圖片..
錯誤訊息是.↓
Access violation at address 0AFDCEB1 in module '我的DLL名稱'. Read of address B88366A7


真的是太麻煩大大了..><"





===================引 用 eaglewolf 文 章===================
(1) unload dll:
當User關閉MDI Child Form時
要通知Main Form卸載Dll
就是在這個時候 設定


(2) bring form to front:
在DLL中提供類似的procedure:

[code delphi]
procedure BringFormToFront;
begin
? if WindowState <> wsNormal then
??? WindowState := wsNormal;
? BringToFront;
end;
[/code]


eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-04-08 15:22:45 IP:211.75.xxx.xxx 未訂閱
這個就要檢查你的DLL  
相關資源是否有正確的被釋放


===================引 用 shine0989 文 章===================
真的真的再次感謝eaglewolf大大用心回覆..!!

小弟真的太嫩了..

已將unload dll的這段語法
放置大大所說的地方了..
可是關掉時..會報錯..!!

我不知怎麼上傳圖片..
錯誤訊息是.↓
Access violation at address 0AFDCEB1 in module '我的DLL名稱'. Read of address B88366A7


真的是太麻煩大大了..><"





===================引 用 eaglewolf 文 章===================
(1) unload dll:
當User關閉MDI Child Form時
要通知Main Form卸載Dll
就是在這個時候 設定


(2) bring form to front:
在DLL中提供類似的procedure:

[code delphi]
procedure BringFormToFront;
begin
? if WindowState <> wsNormal then
??? WindowState := wsNormal;
? BringToFront;
end;
[/code]


------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-04-09 09:25:15 IP:123.204.xxx.xxx 訂閱
感謝eaglewolf大大的回覆 ^^

小弟的問題已經結決了..
小弟把unload dll這段語法放置..
MDI的檢查子FORM是否關闢的小程式裡
居然可以通..^^

這陣子真的很感謝eaglewolf大大的大力幫忙..太謝謝您了..^^


===================引 用 eaglewolf 文 章===================
這個就要檢查你的DLL?
相關資源是否有正確的被釋放


===================引 用 shine0989 文 章===================
真的真的再次感謝eaglewolf大大用心回覆..!!

小弟真的太嫩了..

已將unload dll的這段語法
放置大大所說的地方了..
可是關掉時..會報錯..!!

我不知怎麼上傳圖片..
錯誤訊息是.↓
Access violation at address 0AFDCEB1 in module '我的DLL名稱'. Read of address B88366A7


真的是太麻煩大大了..><"





===================引 用 eaglewolf 文 章===================
(1) unload dll:
當User關閉MDI Child Form時
要通知Main Form卸載Dll
就是在這個時候 設定


(2) bring form to front:
在DLL中提供類似的procedure:

[code delphi]
procedure BringFormToFront;
begin
? if WindowState <> wsNormal then
??? WindowState := wsNormal;
? BringToFront;
end;
[/code]


shine0989
一般會員


發表:9
回覆:31
積分:8
註冊:2008-06-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-04-09 10:40:57 IP:123.204.xxx.xxx 訂閱
eaglewolf大大不好意思又打擾您...

請問一下..
以下這段語法的 //briing form to front

//load dll
if LoadedDLLs.IndexOf(DllName) < 0 then
begin
? LoadedDLLs.Append(DllName);
?? //load dll
end
else
begin
?? //briing form to front
end;

是我要先在MDI裡下↓再load dll時再呼叫它嗎??

procedure BringFormToFront;
begin
? if WindowState <> wsNormal then
??? WindowState := wsNormal;
? BringToFront;
end;


===================引 用 eaglewolf 文 章===================
這個就要檢查你的DLL?
相關資源是否有正確的被釋放


===================引 用 shine0989 文 章===================
真的真的再次感謝eaglewolf大大用心回覆..!!

小弟真的太嫩了..

已將unload dll的這段語法
放置大大所說的地方了..
可是關掉時..會報錯..!!

我不知怎麼上傳圖片..
錯誤訊息是.↓
Access violation at address 0AFDCEB1 in module '我的DLL名稱'. Read of address B88366A7


真的是太麻煩大大了..><"





===================引 用 eaglewolf 文 章===================
(1) unload dll:
當User關閉MDI Child Form時
要通知Main Form卸載Dll
就是在這個時候 設定


(2) bring form to front:
在DLL中提供類似的procedure:

[code delphi]
procedure BringFormToFront;
begin
? if WindowState <> wsNormal then
??? WindowState := wsNormal;
? BringToFront;
end;
[/code]


系統時間:2024-05-04 1:56:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!