主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.25;
下载:[xml.tar.bz2];

向下

如何使用动态记录。 找到类似的分支


MegaVolt   (2002-07-11 16:49) [0]

在下面的示例中,我尝试创建一个处理动态记录的示例,但是在尝试删除第二个列表时存在一些问题,因为 创建它时,我没有复制实际数据,而是仅复制了指向它们的指针,并且当我删除第一个列表时,所有数据都不再存在,但指针仍保留在第二个列表中。
问题:
如何在以下之间精确复制数据:
1. PData和PData
2. PData和TData
3. TData和PData
4. TData和TData
在此先感谢:)

单位Unit1; 介面 用途 Windows,消息,SysUtils,类,图形,控件,表单,对话框, StdCtrls; 类型 TForm1 =类(TForm) Button1:TButton; Button2:TButton; Button3:TButton; 程序Button1Click(发送者:TObject); 程序Button2Click(发送方:TObject); 过程FormCreate(Sender:TObject); 过程Button3Click(发送方:TObject); 私人的 {私人声明} 公开的 {公开声明} 结束 TsData =记录 列表:TList; Str:字串; 结束 TData =打包记录 测试:Int64; 属性:DWORD; 名称:字符串; 结束 PData = ^ TData; 变种 表格1:TForm1; MyList1,MyList2:TsData; 实作 {$ R * .DFM} 过程TForm1.FormCreate(发送者:TObject); 开始 MyList1.List:= TList.Create; MyList2.List:= TList.Create; 结束 过程TForm1.Button1Click(发送者:TObject); 变种 i:整数; z:PData; 开始 //创建一个动态数组: 对于i:= 1到1000000 开始 新(z); z ^属性:= 123456; z ^ Test:= 98765432; z ^ .Name:=“ Help me”; MyList1.List.Add(z); 结束 ShowMessage(“确定”); 结束 过程TForm1.Button2Click(发送者:TObject); 变种 i:整数; z:PData; 开始 //从第一个列表复制到第二个; 对于i:= 1到1000000 开始 z:= MyList1.List [i-1]; MyList2.List.Add(z); 结束 ShowMessage(“确定”); 结束 过程TForm1.Button3Click(发送者:TObject); 变种 z:PData; 开始 //删除两个群众: 而MyList1.List.Count <> 0做 开始 z:= MyList1.List [MyList1.List.count-1]; 处置(z); MyList1.List.Delete(MyList1.List.Count-1); 结束 而MyList2.List.Count <> 0做 开始 z:= MyList2.List [MyList2.List.count-1]; 处置(z); MyList2.List.Delete(MyList2.List.Count-1); 结束 ShowMessage(“确定”); 结束 结束。



Digitman   (2002-07-11 17:02) [1]

过程TForm1.Button3Click(Sender:TObject);
VAR
z:PData;
开始
//删除两个群众:
而MyList1.List.Count <> 0做
开始
z:= MyList1.List [MyList1.List.count-1];
处置(z);
MyList1.List.Delete(MyList1.List.Count-1);
结束;
而MyList2.List.Count <> 0做
开始
z:= MyList2.List [MyList2.List.count-1];
//处理(z); // !!!! 为什么??? 记录已被销毁
MyList2.List.Delete(MyList2.List.Count-1);
结束;
ShowMessage(“Ok”);
结束;



MegaVolt   (2002-07-11 17:06) [2]

所以我正确删除是因为 我相信这些是单独的数据。 在此示例中,我没有正确复制:(所以我要问如何复制而不是正确删除。复制时,仅复制了指针,但是我需要数据。该示例除了演示之外没有任何实际意义:)



Skier   (2002-07-11 17:10) [3]

> MegaVolt




Skier   (2002-07-11 17:12) [4]

> MegaVolt

>复制时,仅复制了指针,但我需要
>使数据


您需要使用重定向(^)复制数据。



MegaVolt   (2002-07-11 17:18) [5]

因此,您无法编写示例,因为似乎只有一条线是:)



Digitman   (2002-07-11 17:19) [6]

过程TForm1.Button2Click(Sender:TObject);
VAR
我:整数;
src,dst:PData;
开始
//从第一个列表复制到第二个;
对于i:= 1到1000000
开始
src:= MyList1.List [i-1];
新(dst);
dst ^:= src ^;
MyList2.List.Add(dst);
结束;
ShowMessage(“Ok”);
结束;



MegaVolt   (2002-07-11 17:27) [7]

非常感谢:) :) :) :) :) :)



valery_f   (2002-07-11 17:30) [8]

> MegaVolt©(11.07.02/17/06 XNUMX:XNUMX p.m.)...在此示例中我没有正确复制...

完全正确...首先,您需要创建一个新记录并将其复制到该记录(而不是复制指针)。 其次,当您遍历准备好的列表时,最好从零到Count-1,而不要依赖常量(事实就是这样,良好的音调规则:)通常:

过程TForm1.Button2Click(Sender:TObject);
var i:整数; z:PData;
开始
//从第一个列表复制到第二个;
对于i:= 0到MyList1.Count-1开始
新(z);
z ^:= PData(MyList1.List [i])^;
MyList2.List.Add(z);
结束;
ShowMessage(“Ok”);
结束;

至于销毁,那么对每个元素调用Delete都是不好的,因为 对于每个TList删除,u必须重新分配指针存储。

对于i:= 0到MyList1.List.Count-1确实开始
z:= MyList1.List [i];
处置(z);
结束;
MyList1.Clear;

或者,如果您不删除所有元素,则:

对于i:= 0到MyList1.List.Count-1确实开始
z:= MyList1.List [i];
如有必要,请开始
处置(z);
MyList1.List [i]:= nil;
结束;
结束;
MyList1.Pack;



MegaVolt   (2002-07-12 10:20) [9]

感谢您添加,但是我要引用的常量是什么?
删除时,建议您使用Pack方法,但是如果您认为有帮助,它只会删除= nil的指针,因此,为此您不需要使用Dispose而是FreeAndNil还是我错了?



valery_f   (2002-07-12 11:54) [10]

> MegaVolt©(12.07.02/10/20 XNUMX:XNUMX)...我要引用的常量是什么?

复制列表时,将循环设置为“对于i:= 1到1000000”,即 依靠这样的事实:您确切知道有多少。 这不是很正确,因为 您将开始在程序中进行更改,并且必须遍历所有源代码并查找所有“ 1000000”。 鉴于TList具有Count,最好使用它(请参见我的示例)。 通常,在复杂的项目中以任何方式开发正确的样式(不进行调试:)。

> ... Pack方法,但如果您认为有帮助,它将仅删除那些= nil的指针

没错 首先,我1)销毁对象,并将指针设置为nil,然后2)一次,我删除所有空指针。 再次-执行删除操作时,TList重新分配内存,它在每次迭代时都发生在您身上,这会降低性能,并且对我来说只有一次。 那就是全部。

> ...为此,您不需要使用Dispose而是FreeAndNil

好吧,首先,不要混淆对象和指针的工作。 在我的示例中,首先调用Dispose删除记录,然后将指针重置为nil(这是如果您要使用Pack方法,如果使用Clear,则无需重置指针)。 其次,FreeAndNil仅适用于对象(请参见sysutils中的FreeAndNil的实现),而不适用于记录,因此不适用于此处。



Yuri-7   (2002-07-12 13:34) [11]

> valery_f
为什么TList会分别删除所有元素?
帮助说,清除方法可以做到这一点。



valery_f   (2002-07-12 13:43) [12]

> Yuri-7(12.07.02/13/34 XNUMX:XNUMX p.m.)Help表示,无论如何,Clear方法可以做到这一点。

清除会删除用于存储指针(!)的内存,并且无论要删除的指针是否指向某个对象,它都会被切成两半。



Yuri-7   (2002-07-12 14:34) [13]

> valery_f
请参阅classes.pas以了解其清除方式!



Skier   (2002-07-12 14:59) [14]

> Yuri-7
你错了!



valery_f   (2002-07-12 15:04) [15]

> Yuri-7(12.07.02/14/34 XNUMX:XNUMX)看看classes.pas清除是如何完成的!

是的,您是对的-清除调用SetCount(0),然后为每个元素添加-删除(至少在D6中)。 考虑到您从列表末尾删除,移动指针数组不会消失。 您的清洁程序是正确的。

事实还不清楚,为什么在Clear内部,Borland为每个元素设置一个删除。 这就足够了:

程序TList.Clear;
开始
FCount:= 0;
SetCapacity(0);
结束;

好吧,好吧...您发现复制了吗?



Skier   (2002-07-12 15:07) [16]

> valery_f
仅限于D6吗?



Skier   (2002-07-12 15:16) [17]

> Yuri-7
我的意思是说Clear不会杀死“指针”上的数据。
它只释放分配给指针的内存...

如果您误会了您-对不起。



valery_f   (2002-07-12 15:21) [18]

>滑雪者©(12.07.02/15/07 6:XNUMX)这仅用于DXNUMX吗?

我现在只有六个。 看一看类……事实在其他版本中很可能是相同的。 Sortsy是一个非常有趣的地方,因为 当您突然发现它实际上是如何工作的... :))))



Skier   (2002-07-12 15:24) [19]

> valery_f
是的 我在D5中看起来是一样的:

在TList.SetCount中有这样一块:

对于I:= FCount-1到NewCount做Delete(I);

你是说他吗


> Sortsy是一个非常有趣的地方


而且也很有启发性:)



Yuri-7   (2002-07-12 15:34) [20]

>滑雪者
我的意思是数据被指针“杀死”。 在D5和D6中



Skier   (2002-07-12 15:36) [21]

> Yuri-7

在发生这种情况的地方拿一块。



Yuri-7   (2002-07-12 16:00) [22]

>滑雪者
怪罪的是,通知程序似乎保留供将来使用。



Skier   (2002-07-12 16:01) [23]

> Yuri-7
好吧....然后看滑雪者©(12.07.02/14/59 XNUMX:XNUMX PM :))



valery_f   (2002-07-12 16:16) [24]

> Yuri-7(12.07.02/16/00 XNUMX:XNUMX p.m.)...看起来他们的通知程序已保留供将来使用。

如果您需要创建自己的专门后代TList,则不是为了将来,而是为了您的未来。



чайнчек   (2002-07-12 20:00) [25]

启发对记录字段的访问方式有所不同:
z ^属性:= 123456;
и
z。属性:= 123456;
编译器接受两个选项。 而且都可以。
确实,当访问对象的字段时,我们不会写VarObject ^ .Field1
因为任何对象变量本质上都是指针。



чайничек   (2002-07-12 20:01) [26]

启发对记录字段的访问方式有所不同:
z ^属性:= 123456;
и
z。属性:= 123456;
编译器接受两个选项。 而且都可以。
确实,当访问对象的字段时,我们不会写VarObject ^ .Field1
因为任何对象变量本质上都是指针。



Zazoo   (2002-07-13 01:08) [27]

>茶壶

在C ++中,有一个这样的“->”运算符,它重命名指针并从相应的对象中提取字段/方法(类似于objptr ^ .item)。 在Delphi中,此运算符(通过对象的索引访问类成员)用“。”表示。因此,编译器可以理解这两种选择。

>任何对象变量本质上都是一个指针
通常,对于Delphi中的类而言,并不是所有事情都一目了然:一方面,这是一个对象(作为副本传递给函数),另一方面,是一个指针。



Случайный прохожий   (2002-07-14 12:18) [28]


> Zazoo©(13.07.02/01/08 XNUMX:XNUMX)


>一方面,这正是对象(传递给函数为
>复制)

没关系 仅传递一个指针。



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.25;
下载:[xml.tar.bz2];

楼上





内存:0.66 MB
时间:0.047 c
1-81222
神秘主义者
2002-07-13 17:13
2002.07.25
自动检测编码


1-81361
doroshka
2002-07-12 10:34
2002.07.25
如何更改按钮,菜单,滚动的颜色?


1-81263
叫醒
2002-07-15 07:55
2002.07.25
Delphi上的COM客户端。 我做对了吗?


14-81469
igorr
2002-06-28 12:25
2002.07.25
程序员


1-81258
Alex_win
2002-07-15 09:19
2002.07.25
升降索版





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский