Einzelnen Beitrag anzeigen

peter001

Registriert seit: 2. Nov 2008
17 Beiträge
 
#1

array of X - Suche nach Element

  Alt 26. Nov 2009, 19:56
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.
  Mit Zitat antworten Zitat