我正在開發一個MDI應用程序(Delphi 7),它將以插件的形式加載.bpl包作爲MDI子代。只能打開一個插件實例,但顯然可以同時打開多個插件。使用指針共享組件的Delphi MDI應用程序
我有一個類是一個共同的類,用於'共享'MDI父母上可用的某些組件。我通過讓公共類在構建時存儲指向每個相關組件的指針來實現這一點。
例如:
...
TCommonClass = class(TObject)
public
MainMenu: ^TMainMenu;
MyClass: ^TMyClass;
...
constructor TCommonClass.Create;
var
CtrlItm: array[0..999] of TComponent;
...
for i := 0 to (Application.MainForm.ComponentCount - 1) do
begin
CtrlItm[i] := Application.MainForm.Components[i];
if CtrlItm[i].ClassName = ‘TMainMenu’ then MainMenu := @CtrlItm[i];
if CtrlItm[i].ClassName = ‘TMyClass’ then MyClass := @CtrlItm[i];
end;
每當我引用一個對象,我只是做如下:
...
var
tmp: String;
begin
MainMenu^.items[0].Caption := 'Something'; //just to demonstrate
MyClass.DoSomething;
end;
每個插件都將擁有自己的這個共同的類的實例的想法,任何更新到其中一個組件將真正更新MDI父組件。 這種方法對我來說一直很好,直到我寫的最後一個插件(這個插件相當龐大並且包含很多TMS組件)開始給我提供我無法跟蹤的錯誤。
我想知道的是,如果這種方法在內存(指針)使用方面是健全的?通過加載和卸載軟件包,內存映射中的更改有可能破壞指針嗎?我應該這樣做嗎?
你的方法看上去是可行的,我和無記憶的問題,因爲每個指針只是4或8個字節,所以千個指針是隻有4或8K的內存,但另一方面,它看起來像你沒有意識到在軟件包之間共享類和對象的能力。例如,您的主窗體可以提供(或實現)一個接口,您可以從任何包插件直接從該接口窗體請求主菜單或任何其他對象。 – jachguate 2013-03-01 00:34:29