Array of String cz.2

0

Ostatnio zadawałem na forum pytanie o tablice dynamiczną (array of string). Pytanie dotyczyło sortowania. Otóż mój program składa się z listboxa i memo. Itemy w listboxie jak wiecie mają swoje indexy. Aby wyświetlił mi się żądany opis musiałem zdeklarować zmienną typu integer o nazwie PIndex. Przypisałem tą zmienną PIndex:=Listbox.ItemIndex i w ten sposób, po kliknięciu na dany item, lądował w memo odpowiedni opis. Wszystko było pięknie i cacy, gdy Listbox.Sorted:=False. Kiedy zmieniłem tą wartość na true wszystkie itemy w listbox ustawiły mi się alfabetycznie a opisy do nich już nie pasowały. Nazwy zmieniły swoje położenie w listbox, a opisy pozostawały w tych samych miejscach.

Stworzyłem więc dwie procedury, które miały za zadanie "ręcznie" posortować tablicę. Kiedy użytkownik kliknął na BtnUpClick wtedy Item w listbox był przesuwany w tablicy o "piętro" wyżej wraz z przypisanym wcześniej do niego opisem. Podobnie w procedurze BtnDownClick z tym, że Item w listbox był przesuwany w tablicy o "piętro" niżej.

procedure TForm1.BtnUpClick(Sender: TObject);
var
  S : string;
  n : integer;
begin
  n := Lista.ItemIndex;
  if n <= 0 then exit;
  Lista.Items.Exchange(n,n-1);
  S := Game[n];                      //Game : array of string
  Game[n] := Game[n-1];
  Game[n-1] := S;
  PIndex := n-1;                     //Index opisu w Game
end;
procedure TForm1.BtnDownClick(Sender: TObject);
var
  S : string;
  n : integer;
begin
  n := Lista.ItemIndex;
  if n >= ilosc-1 then exit;  //Ilosc to funkcja, w której Result:=Lista.Items.Count
  Lista.Items.Exchange(n,n+1);
  S := Game[n];
  Game[n] := Game[n+1];
  Game[n+1] := S;
  PIndex := n+1;
end;

Wszystko byłoby ok, gdyby nie fakt, że nie wiem ile tych itemów w przyszłość będzie. Może być ich 100 a nawet 1000. I co, użytkownik będzie wciskał przycisk 1000 razy, żeby item ustawić na pierwszej pozycji, bo akurat tytuł zaczyna się na literę "A".
Bez sensu, prawda? Dlatego pomóżcie rozwiązać mi ten problem. Wcześniej jeszcze używałem QuickSorta, ale on tylko sortował tablicę, a mi chodzi o posortowanie tytułów w listbox tak, żeby opisy były do nich przyklejone(przypisane).

0

chłopie coś taki uparty?? Czemu nie skożystasz z gotowych rozwiązań, które już ci zostały zaproponowane? Po co nowy temat. Nie prościej tak:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    lst1: TListBox;
    mmo1: TMemo;
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure lst1Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  sl: TStringList;
  i: Integer;
  x: Integer;
begin
  Randomize;
  for i := 1 to 20 do
  begin
    sl := TStringList.Create;
    x := Random(100);
    sl.Add(IntToStr(x));
    lst1.AddItem(IntToStr(x), sl);
  end;
end;

procedure TForm1.lst1Click(Sender: TObject);
begin
  mmo1.Lines.Assign((lst1.Items.Objects[lst1.ItemIndex] as TStringList));
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  lst1.Sorted := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
begin
  for i := 0 to lst1.Items.Count - 1 do
    lst1.Items.Objects[i].Free;
end;

end.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.