我使用TObjectList来处理特定的标签列表.但是当我在Try Final中执行推荐的.Free时,它也会删除列表中的控件.
3个标签的简单示例:
Procedure GetHeaderLabels(var aList:TObjectList<TLabel>);
begin
aList.Add(Form1.lblHeaderCars);
aList.Add(Form1.lblHeaderBrands);
aList.Add(Form1.lblHeaderModels);
end;
procedure TForm1.Button1Click(Sender: TObject);
var vHeaderLabelsList:TObjectList<TLabel>;
begin
vHeaderLabelsList:=TObjectList<TLabel>.Create;
try
GetHeaderLabels(vHeaderLabelsList);
{... process Header Labels }
finally
vHeaderLabelsList.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当我执行此代码时,我最终缺少标签控件 - 它们从表单中删除,在调试中我看到控件是零.
我不应该.Free TObjectList?我如何免费使用TObjectlist并保持控件?
我有一个带OwnsObjects = true的TObjectList.它包含很多对象.现在我想从该列表中删除索引Idx处的对象,而不释放它.
Extract方法是唯一的选择吗?
ExtractedObject := TheList.Extract(TheList[Idx]);
所有其他方法似乎都释放了对象.我正在寻找一些更高效的东西,每次都不进行线性搜索,因为我已经知道了对象的索引.像超载的东西......
ExtractedObject := TheList.Extract(Idx);
......不存在.
摘要:
1.调试时手动进行类型转换,LachlanG和Ken指出.
2.利用自Delphi 2010以来引入的Debugger Visualizers概念
.3.切换到泛型对应物.
=========================================
以下面的代码为例:
如果断点分别设置在结束时TestRegular和结束时TestGenerics,可以通过调试检查器查看通用列表的项目(甚至是项目的内容),但没有任何意义(甚至不是计数)当一个人将鼠标悬停在tmp变量上时,常规的ashjectlist .我想知道是否有一些方法可以实现常规tobjectlist的类似调试时间功能?
unit Unit2;
interface
uses
Contnrs, Generics.Collections,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyItem = class;
TMyItemList = class;
TForm2 = class;
TMyItem = class
private
fname: string;
public
property name: string read fname;
constructor Create(aName: string);
end;
TMyItemList = class(TObjectList)
protected
procedure SetObject (Index: Integer; Item: TMyItem);
function GetObject (Index: Integer): TMyItem;
public
function Add (Obj: TMyItem): Integer;
procedure Insert …Run Code Online (Sandbox Code Playgroud) 我在使用类似的方法的问题Contains,Remove或IndexOf的TObjectList<T>,类当T是如自定义类型TSocket在下面的示例中代码.
我开始实现一个自定义TSocket类型,并试图在类似的列表中使用它TObjectList<TSocket>:
list := nil;
socket := nil;
try
list := TObjectList<TSocket>.Create();
socket := TSocket.Create(TIpAddress.Parse('127.0.0.1'),6857);
// add new socket object with equal values to list
list.Add(TSocket.Create(TIpAddress.Parse('127.0.0.1'),6857));
// should return true but returns false
if list.Contains(socket) then
WriteLn('socket contained in list')
else
WriteLn('socket not contained in list');
// should return number 0 but returns -1
if list.IndexOf(socket) = 0 then
WriteLn('socket contained in list')
else
WriteLn('socket not …Run Code Online (Sandbox Code Playgroud) 我将一些图像加载到对象列表中,然后尝试回忆它们.但它没有显示图像?
procedure TForm1.LoadImages(const Dir: string);
var
i: Integer;
CurFileName: string;
JpgIn: TJPEGImage;
BmpOut: TBitmap;
begin
//sets index for object list
CurIdx := -1;
i := 0;
while True do
begin
//gets current folder
CurFileName := Format('%s%d.jpg',
[IncludeTrailingPathDelimiter(Dir), i]);
if not FileExists(CurFileName) then
Break;
//creates jpgin
JpgIn := TJPEGImage.Create;
try
//loads jpgin
JpgIn.LoadFromFile(CurFileName);
//creates TBitmap and sets width to same as jpgs
BmpOut := TBitmap.Create;
bmpout.Width := jpgin.Width;
bmpout.Height := jpgin.Height;
try
BmpOut.Assign(JpgIn);
//if i assign it here it works, showing …Run Code Online (Sandbox Code Playgroud) 有人可以确认一下,用Delphi编写的exe和dLL之间交换一个包含TobjectList的指针是不可能的?
Class definition shared between DLL and EXE
TCMStack = CLASS(TObject)
PRIVATE
FEquipment: TCMEquipment; /// equipement with associated constraints
FNbCoils: integer; /// coils used
FListeCoils: TCoilsList; ///coil list associaed with a stack
....
Run Code Online (Sandbox Code Playgroud)
在可执行代码中:
...
/// Transfer business information to optimisation module
/// fOptimisation is a instance of class
fOptimisation.TransfererDonneesMetiersDansOptimisation(@TStack, LEVEL_OPTIM_1, false);
Run Code Online (Sandbox Code Playgroud)
除了TobjectList之外,@ TStack的内容都很好
我有课
TFolder = class
NODE_INDEX: Integer;
FIRST_INDEX : Integer;
CODE_NAME: AnsiString;
NAME: AnsiString;
constructor Create(NewNODE_INDEX, NewFIRST_INDEX: Integer; NewCODE_NAME, NewNAME: AnsiString);
destructor Destroy; override;
end;
Run Code Online (Sandbox Code Playgroud)
我有类型
type
TFolderList = class (TObjectList<TFolder>)
end;
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用这种类型
TAccount = class
...
FOLDERS: TFolderList;
public
constructor Create(...);
destructor Destroy; override;
procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
Run Code Online (Sandbox Code Playgroud)
当我尝试发送我的TObject列表像参数
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TObjectList<TFolder>.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
Run Code Online (Sandbox Code Playgroud)
我收到错误"实际和正式var参数的类型必须相同".我做错了什么?
我有ObjectList容器,我想添加一个内部迭代器(访问者模式)实际上我正在尝试确定我的列表中的重复项.
样本:http://pastebin.com/pjeWq2uN
这段代码提供了我正在努力实现的目标.
TFindDuplicatesMethod = procedure(s1, s2: string) of object;
TPersonList = class(TObjectList)
public
procedure Iterate(pMethode: TFindDuplicatesMethod)
end;
procedure TPersonList.Iterate(pMethode: TFindDuplicatesMethod)
var
i: Integer;
begin
for i := 0 to Count - 1 do
pMethode(TMyClass(Items[i]).S1, {But i don't have the second parameter because
it comes from outside of PersonList Ex: OpenDialog.Files[i]})
end;
function FindDuplicate(S1, S2: string): Boolean;
begin
Result := False;
if S1 = S2 then
Result := True;
end;
begin
Files.Iterate(FindDuplicates(S1, S2));
end;
Run Code Online (Sandbox Code Playgroud)
我想知道OOP如何解决这个问题.
提前致谢...
我为什么不能使用Generics.Collections或者Generics.Default甚至只是Generics在拉撒路?
Uses
Generics.Collections;
Run Code Online (Sandbox Code Playgroud)
Uses
System.Generics.Default;
Run Code Online (Sandbox Code Playgroud)
Uses
System.Generics.Collections;
Run Code Online (Sandbox Code Playgroud)
Uses
System.Generics.Default,
System.Generics.Collections;
Run Code Online (Sandbox Code Playgroud)
Uses
SysUtils,
Generics;
Run Code Online (Sandbox Code Playgroud)
找不到项目检查员的uTest使用的Generics.Collections.
找不到项目检查员的uTest使用的Generics.Defaults.
找不到项目检查员的uTest使用的泛型.
delphi ×9
tobjectlist ×9
generics ×2
debugging ×1
delphi-2010 ×1
dll ×1
equals ×1
inspector ×1
lazarus ×1
loops ×1
parameters ×1
tlist ×1