Hallo!
Eigentlich ein Anfängerproblem, aber ich habe scheinbar irgend einen Denkfehler.
Ich habe mir eine Art cache gebaut, Cache ist ein Objekt mit Methoden "isCached(name) -> boolean", "addToCache(CacheEntry)" und "getCached(pos) -> CacheEntry".
Als Attribut hat diese Klasse ein Array of TCacheEntry, welches im Constructor auf die Länge 0 gesetzt wird (dynamisches array).
Hier mal der Code:
Delphi-Quellcode:
unit QCache;
interface
uses
..., QCacheEntry;
type
TQueryCache =
class(TObject)
entries:
array of TQueryCacheEntry;
constructor Create;
destructor Destroy;
function isCached(
name:
string;
var pos:integer): boolean;
function getCached(pos: integer): TQueryCacheEntry;
procedure addEntryToCache(Charinfo: TQueryCacheEntry);
function getNumEntries: integer;
end;
var
QueryCache: TQueryCache;
implementation
constructor TQueryCache.Create;
begin
SetLength(entries,0);
end;
destructor TQueryCache.Destroy;
begin
//
end;
function TQueryCache.getNumEntries: integer;
begin
Result := Length(entries);
end;
function TQueryCache.getCached(pos: integer): TQueryCacheEntry;
begin
if entries[pos] <>
nil then
Result := entries[pos];
end;
function TQueryCache.isCached(
name:
string;
var pos:integer):boolean;
var
i: integer;
begin
Result := false;
pos := 0;
try
if Length(entries) > 0
then
begin
for i := 0
to Length(entries)-1
do
begin
if entries[i].option1 =
name then
begin
Result := true;
pos := i;
end;
end;
end;
except
Result := false;
end;
end;
procedure TQueryCache.addEntryToCache(Charinfo: TQueryCacheEntry);
begin
SetLength(entries,Length(entries)+1);
entries[Length(entries)-1] := Charinfo;
Charinfo.Free;
end;
end.
und hier die TQueryCacheEntry:
Delphi-Quellcode:
unit QCacheEntry;
interface
type
TQueryCacheEntry =
class(TObject)
option1:
string;
option2:
string;
option3:
string;
option4:
string;
option5:
string;
option6:
string;
constructor Create;
end;
implementation
constructor TQueryCacheEntry.Create;
begin
inherited Create;
option1:= '
';
option2:= '
';
option3:= '
';
option4:= '
';
option5:= '
';
option6:= '
';
end;
end.
Problem ist nun dieser Abschnitt, wo ich eine Funktion aufrufe:
Delphi-Quellcode:
procedure TForm1.testName(name:string);
var
...
qpos: integer;
Charinfo: TQueryCacheEntry;
begin
qpos := 0;
if Cache.isCached(name, qpos) = true then // <- Fehler kommt in dieser Zeile
begin
ListBox1.Items.Add('Found Object in cache: ' + name + ' in Position: ' + IntToStr(qpos) + ' and total cache size: ' + IntToStr(Cache.getNumEntries));
Charinfo := Cache.getCached(qpos);
end else
...
Ich bekomme also einen Namen und prüfe, ob dieser Name irgendwo im Cache auftaucht.
Als Fehler bekomme ich die Meldung "...exe raised an
exception. Error in Reading of Adress ..." Also für mich sehr nichtssagend.
Stehen bleibt er bei der oben markierten Zeile.
Problem scheint also diese Methode "isCached" zu sein, die das dynamische Array mit den Cache Einträgen durchläuft, nach einer Übereinstimmung sucht und dessen Position zurückgibt.
Delphi-Quellcode:
function TQueryCache.isCached(name:string; var pos:integer):boolean;
var
i: integer;
begin
Result := false;
pos := 0;
try
if Length(entries) > 0 then
begin
for i := 0 to Length(entries)-1 do
begin
if entries[i].option1 = name then
begin
Result := true;
pos := i;
end;
end;
end;
except
Result := false;
end;
end;
Was ist da verkehrt?
Ich danke für jede Antwort, falls ihr mehr Infos braucht, sagt bescheid.