Fórum Dúvida com Generics.Collection #403881

27/06/2011

0

Ola.
Minha dúvida é simples... como eu posso encontrar uma objeto meu com uma de suas propriedades tendo um determinado valor sendo este estar dentro de uma TList<MyObject>
Minha classe:
TMyclass = Class(SaveSystem) //não liguem pro savesystem, meu objeto para salvar a classe com seus valores em arquivo.
private
  FName: String;
  FDamage: Integer;
public
  property Name: String read FName write FName;
  property Damage: Integer read FDamage write FDamage;
end;


No meu form tenho a variável:

MyClassList: TList<TMyClass>;


Tentei o pai google pra saber se o BinarySearch ajuda, mas não entendi como funciona.
Se eu tiver um valor de TMyClass com Name sendo "Teste" dentre outros... Como posso fazer uma busca (um locate, sei la) para me retornar o indice ou a minha classe da variável "MyClassList" ???

Aguardo.
Pjrm1470

Pjrm1470

Responder

Posts

28/06/2011

George Bonespírito

Tenta isso:  
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Generics.Collections, StdCtrls;
type
    TMeuObj=Class
      private
      aDamage: String;
      aName: String;
      public
        property Name : String Read aName Write aName;
        property Damage : String Read aDamage Write aDamage;
    End;
type
  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    MinhaLista : TObjectList<TMeuObj>;
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
  obj : TMeuObj;
  I : Integer;
begin
  MinhaLista := TObjectList<TMeuObj>.Create;
  MinhaLista.OwnsObjects := True;
  for I := 0 to 9 do
    begin
      obj := TMeuObj.Create;
      obj.Name := IntToStr(I)+'NAME';
      Obj.Damage := IntToStr(I);
      MinhaLista.Add(obj);
    end;
  for I := 0 to pred(MinhaLista.Count) do
    if MinhaLista.Items[I].Damage = '8' then
      Memo1.Lines.Add(Format('My name is %s and my damage is %s',[MinhaLista.Items[I].Name, MinhaLista.Items[I].Damage]));
  MinhaLista.Free;
end;
end.
Responder

Gostei + 0

28/06/2011

Pjrm1470

Obrigado pela iniciativa.

Para uma aplicação com poucos registro é bem eficiente a solução, mas pra grande quantidade de registros, nunca fiz um teste de desempenho. Por isso comentei essa questão na comunidade DevMedia. Ja o tenho implementado, e a momento trabalho com poucos registros, mas a classe é para controle de um game que estou elaborando. Desempenho é crucial pra mim.

Agradeço a iniciativa. Se tiver mais ideias, estou aberto a ideias.
Abraço.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar