强制类型装换的问题(再次问)(100分)

  • 主题发起人 主题发起人 新兵
  • 开始时间 开始时间

新兵

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码
procedure TForm1.Button1Click(Sender: TObject);
var
a : Pint64;
begin
New(a);
self.OraQuery1.Close;
self.OraQuery1.SQL.Text := 'select jgbm a,jgmc b from zzjgdmb where jglx = 0 and dwlbdm in(1) and xs=1 order by px';
self.OraQuery1.Open;
// a = 330799000000,330799000001,330799000002

if Not self.OraQuery1.IsEmpty then
begin
while Not self.OraQuery1.Eof do
begin
a^ := self.OraQuery1.fieldbyname('a').Asinteger;
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
self.OraQuery1.Next;
end;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
b : int64;
begin
self.Memo1.Text :='';
b := Pint64(self.ComboBox1.Items.Objects[self.ComboBox1.ItemIndex])^;

self.Memo1.Text := inttostr(b);
end;
memo取出的值不对,为什么
 
if Not self.OraQuery1.IsEmpty then
begin
while Not self.OraQuery1.Eof do
begin
New(a)
//////////////////////////////////移到这里
a^ := self.OraQuery1.fieldbyname('a').Asinteger;
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
self.OraQuery1.Next;
end;
end;
 
还是不对
 
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
a只是一个指针,这句话导致ComboBox的每一个单元的object都只保存了这个指针,而这个指针指向的值是最后一次赋值,也就是表里的最后一条记录的a值。

另外这段代码本身问题都很大,你a字段只是一个整数而已,干脆就声明一个a : Integer就行了,干嘛要用指针呢?你new了一个指针以后,哪里释放了?代码改成下面:
procedure TForm1.Button1Click(Sender: TObject);
var
a : Int64;
begin
self.OraQuery1.Close;
self.OraQuery1.SQL.Text := 'select jgbm a,jgmc b from zzjgdmb where jglx = 0 and dwlbdm in(1) and xs=1 order by px';
self.OraQuery1.Open;
// a = 330799000000,330799000001,330799000002

if Not self.OraQuery1.IsEmpty then
begin
while Not self.OraQuery1.Eof do
begin
a := self.OraQuery1.fieldbyname('a').Asinteger;
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
self.OraQuery1.Next;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
b : int64;
begin
self.Memo1.Text :='';
b := Int64(self.ComboBox1.Items.Objects[self.ComboBox1.ItemIndex]);

self.Memo1.Text := inttostr(b);
end;
 
按你的写法,结果也不对,为什么呀
 
self.Memo1.Text := string(b);试试
 
我现在这么写:
procedure TForm1.Button1Click(Sender: TObject);
var
a : string;
begin
self.OraQuery1.Close;
self.OraQuery1.SQL.Text := 'select jgbm a,jgmc b from zzjgdmb where jglx = 0 and dwlbdm in(1) and xs=1 order by px';
self.OraQuery1.Open;
// a = 330799000000,330799000001,330799000002

if Not self.OraQuery1.IsEmpty then
begin
while Not self.OraQuery1.Eof do
begin
a := self.OraQuery1.fieldbyname('a').AsString;
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
self.OraQuery1.Next;
end;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
b : string;
begin
b := string(self.ComboBox1.Items.Objects[self.ComboBox1.ItemIndex]);

self.Memo1.Text := b;
end;
提示 invalid pointer operation
 
因为指针相当于Integer,所以你在Objects中是存不了Int64的!
 
晕,TObject只能转换成整数型,楼主要存的是int64,所以它无能为力。
如果非要把这个int64存到Combobox的objects里,建一个结构链表吧:
PMyObj = ^TMyObj;
TMyObj = record
a : Int64;
b : String;
end;
每取一条数据new一个PMyObj,把地址存在Objects里。
记住在释放的时候逐个把这个地址指向的内存Dispose,否则会泄漏。
 
想来想去你只有两个字段,建个结构实在浪费,干脆就用你的老办法算了,你的问题是只有一个PInt64指针,所以只能保存一个变量,试试这个吧,应该可以:
procedure TForm1.Button1Click(Sender: TObject);
var
a : Pint64;
begin
//New(a);
self.OraQuery1.Close;
self.OraQuery1.SQL.Text := 'select jgbm a,jgmc b from zzjgdmb where jglx = 0 and dwlbdm in(1) and xs=1 order by px';
self.OraQuery1.Open;
// a = 330799000000,330799000001,330799000002

if Not self.OraQuery1.IsEmpty then
begin
while Not self.OraQuery1.Eof do
begin
New(a);
a^ := self.OraQuery1.fieldbyname('a').Asinteger;
self.ComboBox1.Items.AddObject(self.OraQuery1.fieldbyname('b').AsString,Tobject(a));
self.OraQuery1.Next;
end;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
//b : int64;
b : PInt64;
begin
self.Memo1.Text :='';
b := Pint64(self.ComboBox1.Items.Objects[self.ComboBox1.ItemIndex]);

self.Memo1.Text := inttostr(b^);
end;

记得在窗体释放时把每一个指针找到,挨个用 Dispose(b) 毙掉。
 
怎样释放,写个例子好吗
 
怎样释放,写个例子好吗
 
整体来说你这样申请内存挂指针在节点上不太妥当,不过不出意外的话倒也没有太大影响,释放内存可以这么写,在FormDestroy事件里:
procedure ...FormDestroy;
var
i : Integer;
P : PInt64;
begin
for i := 0 to ComboBox1.Items.Count - 1 do
begin
P := PInt64(ComboBox1.Items.Objects);
Dispose(P);
end;
end;
没有调试过,你自己试试,差不多就是这样的,拿你这几分真不容易啊,给分吧,嘿嘿。
 
谢了,散分
 
散分了?
 
也可以使用GetMem FreeMem函数,呵呵,差不多。
New Dispose比较省事,没有用过。
 
接受答案了.
 
后退
顶部