当我访问存储在列表视图项中的对象时,为什么会出现意外值?

时间:2013-10-08 00:55:14

标签: multithreading delphi

当我在线程中使用记录时,例如:

type

TClient = Class(TThread)
public
    mcmd:record
    cid:Byte;
    kd, recvresponse:Boolean;
end;

当我尝试访问变量时,它返回一个随机值。 这是编译器的问题吗? 我在Windows 7 x64&amp ;;上使用Delphi 6我要做的就是:

var
    c:TClient;
begin
    if listview1.itemfocused = nil then Exit;
    c := ListView1.ItemFocused.Data;
    if c = nil then Exit;
    ShowMessage(IntToStr(c.mcid.cid));
end;

我如何分配itemfocused数据变量:

Procedure TClient.New;
Begin
    Main.ListView1.Items.BeginUpdate;
    item := Main.ListView1.Items.Add;
    item.Caption := Split(dat1, '|', 0);
    item.SubItems.Add(ip);
    item.Data := @Self;
    Main.ListView1.Items.EndUpdate;
End;

我在Synchronize打电话。

1 个答案:

答案 0 :(得分:1)

Self是一个局部变量。只要Data返回,您在New中存储的指针就会变为无效。您需要存储其值:

,而不是存储指向Self的指针
Item.Data := Self;

如果没有编译,请输入。