Witam wszystkich, piszę, ponieważ mam ogrmny problem z bardzo prostą rzeczą, jaką jest dynamiczna tablica.
Stworzyłem tą tablicę, by przechowywać indeksy pozycji komponentu TListBox. Gdy przesuwam jakąś pozycję w TListBox, równolegle przesywać należy w tej tablicy. Jednak steasznie dziwne rzeczy pojawiają się w talicy, gdy wykonuję tą czynność.
Tablica jest zawarta w obiekcie, który jest tworzony w konstruktorze formy głównej, oraz usuwana w destruktorze tej formy.
W ww klasie są dwie metody do przesuwania o jedną pozycję w górę lub w dół. Oto kod klasy:
unit IndexTabClass;
interface
type
TIndexTab = class(TObject)
private
FIndex: array of Integer;
public
constructor Create;
Destructor Destroy; override;
procedure Add(Value: Integer);
procedure Delete(Index: Integer);
procedure MoveUp(Index: Integer);
procedure MoveDown(Index: Integer);
end;
implementation
uses
MainFrm;
constructor TIndexTab.Create;
begin
inherited Create;
SetLength(FIndex, 0);
end;
destructor TIndexTab.Destroy;
begin
SetLength(FIndex, 0);
inherited Destroy;
end;
procedure TIndexTab.Add(Value: Integer);
begin
SetLength(FIndex, Length(FIndex) + 1);
FIndex[High(FIndex)] := Value;
end;
procedure TIndexTab.Delete(Index: Integer);
var
I: Integer;
begin
if Length(FIndex) > 0 then
if Length(FIndex) = 1 then
SetLength(FIndex, 0)
else
if (Index > -1) and (Index < Length(FIndex)) then
if Index = Low(FIndex) then
begin
for I := 1 to High(FIndex) do
FIndex[I - 1] := FIndex[I];
SetLength(FIndex, High(FIndex));
end
else
if Index = High(FIndex) then
SetLength(FIndex, High(FIndex))
else
begin
for I := Index + 1 to High(FIndex) do
FIndex[I - 1] := FIndex[I];
SetLength(FIndex, High(FIndex));
end;
end;
procedure TIndexTab.MoveUp(Index: Integer);
var
iTemp: Integer;
begin
iTemp := Index - 1;
FIndex[Index - 1] := FIndex[Index];
FIndex[Index] := iTemp;
end;
procedure TIndexTab.MoveDown(Index: Integer);
var
iTemp: Integer;
begin
iTemp := Index;
FIndex[Index] := FIndex[Index + 1];
FIndex[Index + 1] := iTemp;
end;
end.
Zwróćcie uwagę na metody MoveUp i MoveDown, bo tylko z nimi mam kłopot:
procedure TIndexTab.MoveUp(Index: Integer);
var
iTemp: Integer;
begin
iTemp := Index - 1;
FIndex[Index - 1] := FIndex[Index];
FIndex[Index] := iTemp;
end;
procedure TIndexTab.MoveDown(Index: Integer);
var
iTemp: Integer;
begin
iTemp := Index;
FIndex[Index] := FIndex[Index + 1];
FIndex[Index + 1] := iTemp;
end;
Dodawanie i usuwanie poszczególnych pozycji działa bez zarzutu.
Przypuśćmy, że wypełniam tablicę elementami od 0 do 9. Jeżeli przesuwam w dół lub w górę kilka razy, to gdy wyświetlam zawartość tablicy istnieje kilka pozycji w tablicy o takich samych wartościach, np. kilka razy występuje 1.
Wie ktoś co jest w tym kodzie źle? A może ma ktoś pomysł, jak zrobić to na swój sposób?
Zależy mi na pomocy przy oprogramowaniu tylko tych dwóch metod, resztę wiem jak mam zrobić. Testowałem ten kod wielokrotnie i naprawdę nie wiem, w jaki sposób napisać te dwie metody tak, by wszystko bezbłędnie działało.
Tablica ma być dynamiczna, posiadać indeksy typu Integer, zawierać dwie metody do przesuwania pozycji o jeden w górę lub w dół. Nie musi być zabezpieczeń takich jak np. czy można przesunąć czy nie, bo metody te będą podpięte do PopupMenu i jeżeli nie będzie można przesunąć, to odpowiednia pozycja będzie zablokowana. Chodzi mi tylko o kod zamieniający dwie pozycje. Jeżeli ktoś nie zrozumiał tematu problemu, prościej mówiąc potrzebuję odpowiednika metody Exchange z TListBox.
Dziękuję serdecznie za zainteresowanie.
Pozdrawiam.