Varför inte använda TList istället??
Jag vill alltså på ett enkelt sätt kunna lägga till, sortera, och ta bort värden i arrayen
TList vill vi ha :)
Programmeringur Programmering - Övrigt
4 svar · 415 visningar · startad av svampträsk
Tjena!
Jag har en record innehållande diverse variabler, och jag vill vill använda min record i en array (t.ex. test: array[1..1000] of TMinRecord;)
Problemet är att jag inte vet på förhand hur många platser som arrayen ska innehålla.
Jag vill alltså på ett enkelt sätt kunna lägga till, sortera, och ta bort värden i arrayen. (ungefär som en TStringList)
En dynamisk array löser problemen delvis. SetLength(test, Length(test)+1) ökar längden på arrayen med ett steg, men om jag har uppfattat saken rätt så omallokerar SetLength minne för varje gång proceduren körs. Med tanke på att jag kommer loopa SetLength ett par hundra gånger så undrar jag om det kanske finns något bättre sätt att lösa det hela på.
Jag undrar också om det finns något enkelt sätt att radera en post i en array?
Några förslag på hur jag bör göra?
------------------
//N99ASP
Varför inte använda TList istället??
Jag vill alltså på ett enkelt sätt kunna lägga till, sortera, och ta bort värden i arrayen
TList vill vi ha :)
Jag har redan tittat lite på TList, men jag fattar inte riktigt hur den funkar.
Hur använder jag min record med en TList?
En TList hanterar en lista med pekare. Till skillnad från en array hanterar även TList logik för att lägga till, ta bort och sortera listan.
Du anropar Add för att lägga till element, Delete för att ta bort och sort för att sortera. Finn en hel del andra funktioner, titta i hjälpen.
De du måste tänka på, när du tar bort element från TList, är att TList inte deallokerar minnet som pekaren pekar på.
När du ex. vill kasta bort listan måste du gå igenom alla elementen och deallokerar dina records.
Tar med ett litet exempel:
Trycker man på Button1 så allokerar jag två records och lägger dom i listan.
Trycker man på Button2 så sorterar jag listan. Som parameter har jag en funktion som vet hur man sorterar MyRecord.
Trycker man på Button3 så visar jag listan i en Memo.
FormCreate allokerar en TList och FormDestroy deallokerar den.
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
type
// My record
PMyRecord = ^TMyRecord;
TMyRecord = record
x, y: Integer;
end;
// Comparison function for myrecord's
// returns < 0 if Item1 is less and Item2,
// 0 if they are equal and > 0 if Item1 is greater than Item2.
function MySort(Item1, Item2: Pointer): Integer;
begin
if (PMyRecord(Item1)^.x < PMyRecord(Item2)^.x) then
Result:= -1
else if (PMyRecord(Item1)^.x > PMyRecord(Item2)^.x) then
Result:= 1
else if (PMyRecord(Item1)^.y < PMyRecord(Item2)^.y) then
Result:= -1
else if (PMyRecord(Item1)^.y > PMyRecord(Item2)^.y) then
Result:= 1
else
Result:= 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
List:= TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
// Deallocate all records
for i:= 0 to List.Count-1 do
begin
Dispose(PMyRecord(List));
end;
// Now its ok to call free.
List.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
PMR: PMyRecord;
begin
// Add a record
New(PMR);
PMR^.x:= Random(30);
PMR^.Y:= Random(20);
List.Add(PMR);
// Add another one
New(PMR);
PMR^.x:= Random(30);
PMR^.Y:= Random(20);
List.Add(PMR);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
List.Sort(MySort);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
begin
// Clear memo
Memo1.Lines.Clear;
// Show all elements
for i:= 0 to List.Count-1 do
begin
Memo1.Lines.Add(IntToStr(PMyRecord(List).x)+':'+IntToStr(PMyRecord(List).y));
end;
end;
Lycka till