Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#5

Re: array of X - Suche nach Element

  Alt 26. Nov 2009, 20:24
warum das globale var QueryCache: TQueryCache; ?

die Konstruktoren kannst du dir sparen
- dynamische Array und String sind per Standard eh leer

leere Destruktoren/Funktionen sind ebenfalls sinnlos

getCached liefert einen undefinierten Wert, wenn nichts im Cache ist

if Length(entries) > 0 then in isCached bringt auch nichts, denn dieses ist praktisch in der Forschleife schon vorhanden.

Try-Except ... eine dort auftretende Exception sollte man nicht einfach unter den Tisch kehren, denn dieses würde auf eine defekte Datenstruktur hinweisen und sowas dürfte eh nie auftreten

Vergleiche mit =true macht man nicht
(es sei denn man muß GENAU auf True(1) vergleichen)

Delphi-Quellcode:
unit QCache;

interface

uses
  ..., QCacheEntry;

type
  TQueryCache = class(TObject)
  private
    entries: array of TQueryCacheEntry;
  public
    function isCached(name: string; var pos:integer): boolean;
    function getCached(pos: integer): TQueryCacheEntry;
    procedure addEntryToCache(Charinfo: TQueryCacheEntry);
    function getNumEntries: integer;
  end;

implementation

function TQueryCache.getNumEntries: integer;
begin
  Result := Length(entries);
end;

function TQueryCache.getCached(pos: integer): TQueryCacheEntry;
begin
  //if Assigned(entries[pos]) then
  // Result := entries[pos]
  //else
  // Result := nil;

  // gekürzt kommt das bei raus und nebenbei wird nun nur noch einmal gesucht :)
  Result := entries[pos];
end;

function TQueryCache.isCached(name:string; var pos:integer):boolean;
var
  i: integer;
begin
  Result := false;
  for i := 0 to Length(entries)-1 do
    if entries[i].option1 = name then
    begin
      Result := true;
      pos := i;
      break; // wenn gefunden, dann braucht man nicht weitersuchen
    end;
end;

procedure TQueryCache.addEntryToCache(Charinfo: TQueryCacheEntry);
begin
  SetLength(entries,Length(entries)+1);
  entries[High(entries)] := Charinfo;
end;

end.
Delphi-Quellcode:
unit QCacheEntry;

interface

type
  TQueryCacheEntry = class(TObject)
    option1: string;
    option2: string;
    option3: string;
    option4: string;
    option5: string;
    option6: string;
  end;

implementation

end.
Delphi-Quellcode:
procedure TForm1.testName(name:string);
var
  ...
  qpos: integer;
  Charinfo: TQueryCacheEntry;
begin
  qpos := 0;

  if Cache.isCached(name, qpos) then
  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
  ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat