Avatar billede ruma1974 Nybegynder
03. februar 2004 - 17:54 Der er 3 kommentarer og
1 løsning

Den hurtigst metode til at slette et entry i en array?

Hej,

Er der en hurtig funktion til at slette et entry i en array så at der ikke er nogle tomme entries i array'et efter sletningen?



mvh,

Rune
Avatar billede borrisholt Novice
04. februar 2004 - 12:33 #1
Lad være med at bruge Arrays brug en Tliste.

Ellers er du nød til at kopiere resten af dit array (Til højre for den tomme plads) en tak til venstre.

Jens B
Avatar billede hrc Mester
07. februar 2004 - 13:43 #2
Som den gode borrisholt siger så er løsningen at skippe arrays TList. For at se om jeg kan tiltuske mig nogle points ... så vedlægger jeg her et par eksempler:

TMyList1 er en nedarving af TClassList (forventer objekter, hvor TList forventer pointere => når listen frigives, så frigives eventuelle objekter på listen automatisk). Fordelen er, at det ikke fylder meget at lave sin egen variant. Ulempen er, at du får alle de properties og metoder som TClassList har, med. Det er ikke altid hensigtsmæssigt.

TMyList2 er et eks. på indirekt nedarving og jeg offentliggør kun tre metoder: Add, Delete og Count. Ulempen er, at det fylder mere i implementeringsdelen.

unit ULists;

interface

uses
  SysUtils, Classes, ContNrs;

type
  TMyData = class
  private
    fName : string;
    fAdr : string;
  public
    constructor Create(const aName, aAdr : string);
    property Name : string read fName;
    property Adr : string read fAdr;
  end;

  TMyList1 = class(TClassList) // direct inheritance!
  private
    function GetMyData(aIndex: integer): TMyData;
  public
    property Items[aIndex : integer] : TMyData read GetMyData; default;
    function Add(aMyData : TMyData) : integer;
  end;

  TMyList2 = class // indirect inheritance!
  private
    fList : TClassList;
    function GetMyData(aIndex: integer): TMyData;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Delete(aIndex : integer);
    function Count : integer;
    function Add(aMyData : TMyData) : integer;
    property Items[aIndex : integer] : TMyData read GetMyData; default;
  end;

implementation

{ MyData }

constructor TMyData.Create(const aName, aAdr: string);
begin
  inherited Create;
  fName := aName;
  fAdr := aAdr;
end;

{ TMyList1 }

function TMyList1.Add(aMyData: TMyData): integer;
begin
  result := inherited Add(TClass(aMyData));
end;

function TMyList1.GetMyData(aIndex: integer): TMyData;
begin
  result := TMyData(inherited Items[aIndex]);
end;

{ TMyList2 }

function TMyList2.Add(aMyData: TMyData): integer;
begin
  result := fList.Add(TClass(aMyData));
end;

function TMyList2.Count: integer;
begin
  result := fList.Count;
end;

constructor TMyList2.Create;
begin
  inherited Create;
  fList := TClassList.Create;
end;

procedure TMyList2.Delete(aIndex: integer);
begin
  fList.Delete(aIndex);
end;

destructor TMyList2.Destroy;
begin
  try
    fList.Free;
  finally
    inherited;
  end; // try
end;

function TMyList2.GetMyData(aIndex: integer): TMyData;
begin
  result := TMyData(fList.Items[aIndex]);
end;

end.
Avatar billede ruma1974 Nybegynder
08. februar 2004 - 11:40 #3
Mange tak for eksemplerne,

Rune
Avatar billede hrc Mester
17. februar 2004 - 16:05 #4
Ææhh. Rettelse!!!

Efter en tur inde i VCL-sourcen er jeg blevet opmærksom på, at TClassList IKKE rydder op efter sig. Ovenstående eksempel, hvor jeg kalder fList.Free i destructoren, vil efterlade en stak løse objekter.

I midlertid skulle man kunne erstatte den med TObjectList i stedet. Her kan man med en optionel parameter angive om listen skal håndtere hukommelsen eller om det klares eksternt.

Beklager
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester