标签: tobjectlist

为什么释放TObjectList也会删除控件?

我使用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并保持控件?

delphi tobjectlist delphi-10.1-berlin

3
推荐指数
2
解决办法
221
查看次数

从TObjectList中提取对象

我有一个带OwnsObjects = true的TObjectList.它包含很多对象.现在我想从该列表中删除索引Idx处的对象,而不释放它.

Extract方法是唯一的选择吗?

ExtractedObject := TheList.Extract(TheList[Idx]);

所有其他方法似乎都释放了对象.我正在寻找一些更高效的东西,每次都不进行线性搜索,因为我已经知道了对象的索引.像超载的东西......

ExtractedObject := TheList.Extract(Idx);

......不存在.

delphi tobjectlist tlist

2
推荐指数
1
解决办法
5279
查看次数

调试时如何检查非泛型TObjectList的内容?

摘要:
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)

delphi generics debugging tobjectlist inspector

2
推荐指数
1
解决办法
1619
查看次数

如何使用TObjectList <T>的Contains,Remove或IndexOf等方法

我在使用类似的方法的问题Contains,RemoveIndexOfTObjectList<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)

delphi equals tobjectlist

2
推荐指数
1
解决办法
1213
查看次数

objectlist不检索数据

我将一些图像加载到对象列表中,然后尝试回忆它们.但它没有显示图像?

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 tobjectlist

1
推荐指数
1
解决办法
321
查看次数

Delphi中exe和DLL之间的TobjectList

有人可以确认一下,用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的内容都很好

delphi dll tobjectlist

1
推荐指数
1
解决办法
440
查看次数

Delphi发送TObjectList就像var参数一样

我有课

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参数的类型必须相同".我做错了什么?

delphi parameters compiler-errors tobjectlist

1
推荐指数
1
解决办法
329
查看次数

迭代TObjectList

我有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如何解决这个问题.

提前致谢...

delphi loops tobjectlist visitor-pattern delphi-2010

0
推荐指数
1
解决办法
4723
查看次数

Delphi Lazarus找不到Uses Generics

我为什么不能使用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 generics tobjectlist lazarus

-1
推荐指数
1
解决办法
1501
查看次数