Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: ListBox mit verknüpften StringLists sortieren

  Alt 23. Dez 2011, 23:01
Zu Übungszwecken können wir ja mal ein array nehmen. Du kannst das weiter anpassen, ich hab die Variablen des Records jetzt einfach mal X usw. genannt. Die sortierten Einträge dann einfach in die Listbox eintragen. Wenn du nach anderen Werten sortieren willst, einfach eine weietre Sort Methode hinzufügen.

Delphi-Quellcode:
unit uArrayBeispielUnit;

interface

type
  TItem = record
    X,
    X1, X11, X12,
    X2, X21, X22: string;
  end;
  TItemList = class(TObject)
  private
    FItems: array of TItem;
    FCount: integer;
    procedure SetCount(NewCount: integer);
    function GetItem(Index: integer): TItem;
    procedure SetItem(Index: integer; const Item: TItem);
  public
    procedure AddItem(const Item: TItem);
    procedure DelItem(Index: integer);
    procedure InsItem(Index: integer; const Item: TItem);
    procedure Clear;
    function IndexOf(Value: string): integer;
    procedure Exchange(Index1, Index2: integer);
    procedure Sort;
    property Items[Index: integer]: TItem Read GetItem Write SetItem; default;
    property Count: integer Read FCount;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

constructor TItemList.Create;
begin
  inherited Create;
  FCount:= 0;
end;

destructor TItemList.Destroy;
begin
  Clear;
  inherited Destroy;
end;

procedure TItemList.SetCount(NewCount: integer);
begin
  FCount:= NewCount;
  SetLength(FItems, FCount);
end;

procedure TItemList.Clear;
begin
  while FCount > 0 do DelItem(FCount-1);
end;

function TItemList.GetItem(Index: integer): TItem;
begin
  Result:= FItems[Index];
end;

procedure TItemList.SetItem(Index: integer; const Item: TItem);
begin
  Items[Index]:= Item;
end;

procedure TItemList.AddItem (const Item: TItem);
begin
  SetCount(FCount+1);
  FItems[FCount-1]:= Item;
end;

procedure TItemList.InsItem(Index: integer; const Item: TItem);
var
  I: integer;
begin
  SetCount(FCount+1);
  for I:= FCount-1 downto Index+1 do
    FItems[I]:= FItems[I-1];
  SetItem(Index, Item);
end;

procedure TItemList.DelItem(Index: integer);
var
  I: integer;
begin
  for I:= Index to FCount-2 do
    FItems[I]:= FItems[I+1];
  SetCount(FCount-1);
end;

function TItemList.IndexOf(Value: string): integer;
var
  I: integer;
begin
  Result:= -1;
  for I:= 0 to FCount-1 do
    if FItems[I].X = Value then
    begin
      Result:= I;
      Break;
    end;
end;

procedure TItemList.Exchange(Index1, Index2: integer);
var
  T: TItem;
begin
  T:= FItems[Index1];
  FItems[Index1]:= FItems[Index2];
  FItems[Index2]:= T;
end;

procedure TItemList.Sort;
var
  I, J: integer;
begin
  for I:= 0 to FCount-2 do
    for J:= I+1 to FCount-1 do
      if FItems[I].X > FItems[J].X then Exchange(I, J);
end;

end.
Delphi-Quellcode:
unit BeiepielUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uArrayBeispielUnit;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FItemList: TItemList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FItemList:= TItemList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FItemList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Item: TItem;
  I: integer;
begin
  FItemList.Clear;
  for I:= 1 to 3 do
  begin
    Item.X:= 'X.'+IntToStr(3-I);
    Item.X1:= 'X1.'+IntToStr(3-I);
    Item.X2:= 'X2.'+IntToStr(3-I);
    Item.X11:= 'X11.'+IntToStr(3-I);
    Item.X12:= 'X12.'+IntToStr(3-I);
    Item.X21:= 'X21.'+IntToStr(3-I);
    Item.X22:= 'X22.'+IntToStr(3-I);
    FItemList.AddItem(Item);
  end;
  for I:= 0 to FItemList.Count-1 do
    ShowMessage(FItemList[I].X);
  FItemList.Sort;
  for I:= 0 to FItemList.Count-1 do
    ShowMessage(FItemList[I].X);
end;

end.
  Mit Zitat antworten Zitat