我的问题是delphi的变量不兼容的问题。(200分)

  • 主题发起人 主题发起人 小花生
  • 开始时间 开始时间

小花生

Unregistered / Unconfirmed
GUEST, unregistred user!
我相信重赏之下必有勇夫。

以下是原代码
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MConnect, ObjBrkr, StdCtrls, Buttons,Registry;

type
a = POleVariant;
TForm1 = class(TForm)
BitBtn1: TBitBtn;
SimpleObjectBroker1: TSimpleObjectBroker;
BitBtn2: TBitBtn;
SimpleObjectBroker2: TSimpleObjectBroker;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
P : a
i: Integer;
begin
with TRegistry.Create do
try
if OpenKey('/Software/Borland/Delphi/Servers/', False) then
begin
i := ReadInteger('ServerInfoSize');
ShowMessage(IntToStr(i));
New(P);
try { read the state and restore SimpleObjectBroker1 }
ReadBinaryData('ServerInfo', P^, i);
SimpleObjectBroker2.ServerData := OleVariant(P^)
//这句话运行出错!!!
finally
FreeMem(P);
end;
end;
finally
Free;
end;
ShowMessage( SimpleObjectBroker2.Servers[0].ComputerName );
ShowMessage( SimpleObjectBroker2.Servers[1].ComputerName );
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
i: Integer;
S1: String;
Ole1: a;
begin
with SimpleObjectBroker1 do
begin
for i:=0 to Servers.Count - 1 do
begin
if not Servers.HasFailed then {don抰 enable down servers }
begin
S1 := 'Do you want ' + Servers.ComputerName + ' enabled?';
if MessageBox(Handle, PChar(S1), PChar(Caption), MB_YESNO) = IDYES then
Servers.Enabled := True
else
Servers.Enabled := False;
end;
end;
New(Ole1);
Ole1^ := ServerData;
end;
{ save the ServerData to the registry for later use. }
with TRegistry.Create do
try
OpenKey('/Software/Borland/Delphi/Servers/', True);
WriteInteger('ServerInfoSize', SizeOf(Ole1^));
WriteBinaryData('ServerInfo', Ole1^, SizeOf(Ole1^));

finally
Free;
end;
ShowMessage(IntToStr(SizeOf(Ole1^)));
end;
end.
 
没问题啊?
 
我试过了,没出错啊
错误信息是什么?
 
以上两位高手,如果你们先按bitbtn1,或者说直接从注册表中取数据,就会发生错误。
 
是啊怎么不说错误信息
 
我个人认为是因为DELPHI有严格的指针类型检查,例如
var
a : ^Integer;
b : ^Integer;
a与b并不兼容。
希望各位高手理解我的问题其中奥妙!
 
世上没有高手了吗?
 
我看 你的代码功能是保存再取出,
可能的原因:
2: 必须先运行BitBtn2Click,然后再运行BitBtn1Click,
因为必须先刷新地址,否则P^指向错误地址.
1: SimpleObjectBroker1的Servers属性中的TServeItem个数没有两个.
 
DarwinZhang兄说得有点眉目了,可你没有拿出解决方案来啊!
 
我不明白,既然说了原因,哪不就可以很容易根据原因来解决了吗?
2.必须先刷新注册表,否则其中的/Software/Borland/Delphi/Servers/ServerInfo
数据不是指向SimpleObjectBroker1的服务器。所以必须先运行BitBtn2Click来刷新。
1.向SimpleObjectBroker1的Servers属性中加入两个TServeItem.
 
DarwinZhang兄,如果我每次都先将数据写入注册表,再取出来,那我不是吃饱了撑的。你
了解了我这段代码的用意了吗?
 
那看你的意思不是做实验性程序了:
那你必须把这两段程序分开,一个是服务器程序,运行BitBtn2Click初始化工作,
让这个服务器程序一直运行,然后再运行一个客户程序,其中用BitBtn1Click中的内容
来请求服务。你看一下Demos下的例子吧。
 
请斑竹取消这个问题吧,他们的答案不能令人满意。
 
//请斑竹取消这个问题吧,他们的答案不能令人满意。
你不知道什么叫“复水难收”吗?
本来我准备回答你的问题,看了这句话我差点决定“取消”我的回答(想一想算了)。
现在这种人越来越多了,要问问题就拿出点诚意来。
何况你根本就是在误导大家,这个问题根变量兼容完全没有关系。

废话说完了,回答问题:
你在 ReadBinaryData 之前先用 KeyExists 和 ValueExists 判断一下你要读的东西是否
存在,如果不存在,你就别执行 SimpleObjectBroker2.ServerData := OleVariant(P^);
并给出相应的错误提示,不就什么问题都没有了。你明明没有读到东西还到处拿去用,当
然会出问题了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
574
import
I
I
回复
0
查看
627
import
I
后退
顶部