Det här kanske är baskunskap för en van Delphihacker, men för mig som är van vid VB's omhändertagande debugger har det blivit en irriterade sak. Fråga: Hej, tack för ditt utförliga svar! Dynamiska Arrays och String
Om jag skapar en dynamisk array med strängvariabler (i en record) måste jag deklarera dem med angivet antal tecken. String; ger nämligen märkliga programfel medan String[255]; fungerar bra. Jag förstår varför, men vet inte hur jag ska gå vidare när jag vill kunna använda längre strängar som måste vara dynamiska i längd för att inte stjäla alltför mycket minnesutrymme. AnsiString? Kan jag använda dynamiska AnsiSträngar i en dynamisk array eller måste jag ange antalet tecken för dem också?
Kan debuggern ställas in så att den tar hand om dessa saker?
Funkar det annorlunda i senare versioner? Jag kör för närvarande Delphi 5.Sv: Dynamiska Arrays och String
Hur skapar jag dynamiska vektorer, där vektorns storlek inte är förbestämt när programmet kompileras?
Svar:
Börja med att bestämma den maximala storleken, lämpligt kan vara att välja prick 64 kB (FFFFh)
då det är det största minnet som kan allokeras med GetMem. I detta exempel ska vektorn innehålla variabler av Integer-typ.
const
MaxIntArraySize = $FFFF div SizeOf(Integer);
Definiera sedan några typer;
type
PIntArray = ^TIntArray
TIntArray = array [0..MaxIntArraySize] of Integer;
Deklarera därefter en variabel av typen PIntArray och använd GetMem
för att allokera just det antal bytes som du behöver;
GetMem(Numbers, Count * SizeOf(Integer));
try
Numbers^[0] := 3655;
Numbers^[1] := 9873;
Numbers^[2] := 76;
...
...
finally
FreeMem(Numbers, Count * SizeOf(Integer));
end;
FreeMem lämnar tillbaka det allokerade minnet. Undantagshanteringen ser till att det alltid blir återlämnat. Använd gärna MaxAvail för att ta reda på om det finns tillräckligt mycket minne ledigt först.
Om du behöver allokera mer minne än 64 kB kan du använda dig av GlobalAlloc/GlobalLock och GlobalFree/GlobalUnlock i stället för GetMem och FreeMem.
Kolla även Help sök på Dynamic ArraySv: Dynamiska Arrays och String
Men...
För det första: jag använder SetLength för att skapa en dynamisk array, vilket har fungerat utmärkt (hittills). Är det fel?
För det andra: det är när jag har poster som innehåller strängar med odefinierad storlek som problemen uppstår. Jag kan förstå att de skriver över sig själva då jag modifierar strängarnas längd, men hur göra för att inte råka ut för det? Måste man köra GetMem för varje individuell post? Vid varje förändring av dess innehåll.
Hmm...