2010-07-08 43 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