2010-07-08 39 views
2

德爾福單位,我有一個名爲「語境」全球記錄:德爾福:分配給全球紀錄 - 全球記錄不改變

interface 
    type 
    TContext = record 
     ... 
    end; 

    var 
    context: TContext; 

我也有在這個單元中的初始化程序,採取背景:

interface 
    procedure Init(AContext: TContext); 

的初始化過程裏面,我試着給定上下文分配給全球範圍內:

implementation 
    procedure Init(AContext: TContext); 
    begin 
    context := AContext; 
    end; 

佛由於某種原因,作業後的全局範圍仍然是空的。這是爲什麼? 在過程中聲明一個局部變量,並賦予它按預期工作。


我應該提到的是,這個單元住在一個dll中,而init程序是從exe中調用的。 聲明一個全局記錄,或聲明幾個全局字符串沒有區別。分配的值將丟失。

問候,
-Vegar

+3

如果你按住Ctrl鍵單擊在程序「初始化」的「語境」的IDE應該帶你到的有關情況。 – 2010-07-08 09:08:16

+1

關於您的更新:IIUC「丟失」的值是字符串。混合字符串和DLL總是很棘手。你使用ShareMem,FastMM或類似的東西嗎? – 2010-07-08 10:18:12

+1

您尚未演示如何在EXE中調用該函數。這個函數聲明在EXE端看起來如何? – 2010-07-08 14:17:32

回答

0

找到錯誤。一切都真的是一團糟......原來,負責調用init方法的對象存在兩次,並且包含全局變量的單元同時存在於dll和exe項目中。出於某種原因,其中一個調用類的實例操縱EXE內的全局變量,另一個是DLL裏面的全局變量,以及開發人員和調試器都停止響應...

代碼是是我們試圖拆分和清理的一些舊的,凌亂的遺留代碼的一部分。我們真的開始得到'破'的部分......

感謝您的答覆,並遺憾浪費您的時間。

問候, -Vegar

3

我想你必須表明,更多的代碼。隨着

unit Unit1; 

interface 

type 
    TContext = record 
    dummy: Integer; 
    end; 

var 
    context: TContext; 

procedure Init(AContext: TContext); 

implementation 

procedure Init(AContext: TContext); 
begin 
    context := AContext; 
end; 

end. 

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    Unit1 in 'Unit1.pas'; 

procedure Test; 
var 
    c: TContext; 
begin 
    c.dummy := 666; 
    Init(c); 
end; 

begin 
    Test; 
end. 

我得到預期的結果,即cUnit1.context都包含666 Test執行Init(c);後。

+0

我總是覺得很難決定說明問題所需的適當代碼量。發佈完整的圖片很少是一種選擇。 – Vegar 2010-07-08 19:11:34

+0

呃...明顯,它應該是42,而不是666! :D – Alex 2010-07-26 08:08:40

+0

這很無聊 - *每個人*使用42. :-) – 2010-07-26 16:51:49

-1

如果你不改變

程序初始化(AContext:TContext);

procedure Init(Var AContext:TContext);

+4

不,因爲他在'Init'裏面,他*從AContext中讀*。但'const'(而不是'var')可能是個好主意。 – 2010-07-08 13:28:30

+0

編號----------- – 2010-07-08 13:29:08

+0

他說他想更改全局變量上下文,但是當使用本地變量時,它的工作原理 – DwrCymru 2010-07-08 13:49:14