AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Virtual String Tree Objekte dynamisch nachladen
Thema durchsuchen
Ansicht
Themen-Optionen

Virtual String Tree Objekte dynamisch nachladen

Ein Thema von etom291272 · begonnen am 5. Jun 2005 · letzter Beitrag vom 7. Jun 2005
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Virtual String Tree Objekte dynamisch nachladen

  Alt 6. Jun 2005, 14:54
Was die Frage nach den 'woher sollen die nodes wissen, welche ID sie nachladen sollen' anbelangt, hatte ich Dir einen Tip gegeben.
Wenn Du einen Block lädst, weisst Du ja die ID des UNTERSTEN Records (ID_low). Beim Laden des nächten Blocks lädst Du einfach die nachsten X Records, deren ID > ID_low. Danach setzt Du ID_low wieder auf die unterste Record.ID usw.

Damit kann man natürlich nicht sofort das 650.000 Dokument aus der Mitte laden. Aber das braucht man auch nicht.
Natürlich kann man dann keine Sortierung mehr machen. Stell Dir vor, deine Anwendung ist im Netz und 100 Leute schauen sich das an und auf einmal drücken alle auf die Spaltenüberschrift zum Sortieren: Alle Clients saugen nun alle 100000 Dokumente... gulp.

Nicht umsonst sind beim QuantumGrid diese Features im 'Gridmode' (also wenn dynamisch nachgeladen wird) ausgeschaltet.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#12

Re: Virtual String Tree Objekte dynamisch nachladen

  Alt 6. Jun 2005, 16:39
@alzaimar

sorry da hätte ich auch selbst drauf kommen können

danke für eure tips mir ist auch noch eine idee gekommen. ich könnte beim letzten node ganz unten
einen dummy node mit einem child einfügen mit der Bezeichnung "weitere Dokumente ..." wenn dieser
Knoten erweitert wird im onexpand diesen Knoten löschen den nächsten Block laden und wieder diesen
dummy node einfügen. Bei jedem sortiervorgang wird der dummynode ebenfalls gelöscht und neu ganz unten erstellt. (so habe ich die Anzahl der Doks immer noch unter kontrolle die geladen werden damit mir niemand dieses system abschiesst)

@generic

Hört sich interessant an dein projekt Hast du eine ocr funktionalität integriert wenn ja würden mich nähere infos dazu interessieren. Hab zur Zeit aus Kostengründen noch kein ocr für direkte suche im dokument eingebaut (bewegen sich alle so ab 4000€)

  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Virtual String Tree Objekte dynamisch nachladen

  Alt 6. Jun 2005, 17:50
Versuch doch mal die profane, billige, Kassenpatientenlistbox. Die hat eine Property 'Style'. Da gibst Du 'lbVirtual' ein. Alles, was Du jetzt noch brauchst, ist die 'Count' Property auf deine 650000000 zu setzen. Dann schreibst Du das OnData Event: Das gibt Dir einen Index und erwartet im Gegenzug einen String... HA!
Delphi-Quellcode:
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer; var Data: String);
begin
  If Not Loaded (Index) Then LoadBlockContaining (Index);
  Data := CachedData (Index);
end;
Die Funktion Loaded (aIndex : Integer) : Boolean prüft, ob der Datensatz #aIndex schon geladen wurde. Bei der Idee mit den Blöcken kann man sich ja merken, wieviele Blöcke schon geladen wurden. Dann reduztiert sich die Funktion auf:
Delphi-Quellcode:
Function Loaded (aIndex : Integer) : Boolean;
Begin
  Result := (aIndex <= NoOfRecsLoaded);
End;
Die Prozedur zum Laden eines Datenblocks sähe ungefähr so aus:
Delphi-Quellcode:
Procedure LoadBlockContaining (aIndex : Integer);
Var
  RecsLoaded : Integer;

Begin
  While NoOfRecsLoaded < aIndex Do Begin
    GetBlock (fLastID, RecsLoaded);
    fLastID := RecordBlock [RecordBlock.count].ID;
    NoOfRecsLoaded := NoOfRecsLoaded + RecsLoaded;
    End;
End;
GetBlock liest also einen Block von 1000 Records, deren ID > fLastID ist, und hängt ihn an deinen Cache an.

Damit deine SW garantiert nicht abschmiert, könntest Du noch dafür sorgen, das in deinem Cache nur die 10000 zuletzt angefassten Records sind. Da bietet sich eine LRU-Liste ("Least recently used" Verkettete Liste) an. Immer wenn auf einen Record zugegriffen wird, kommt der Record an den ANFANG der Liste. Wenn Du dann deinen Cache verkleinern musst, schmeisst Du die Records vom ENDE der Liste raus (denn die sind ja lange nicht angefasst worden).

Wenn du das machst, 'verkomplizieren' sich die o.g. Routinen dezent, aber nicht wirklich tragisch.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#14

Re: Virtual String Tree Objekte dynamisch nachladen

  Alt 6. Jun 2005, 21:31
Zitat von etom291272:
@alzaimar
Hört sich interessant an dein projekt Hast du eine ocr funktionalität integriert wenn ja würden mich nähere infos dazu interessieren. Hab zur Zeit aus Kostengründen noch kein ocr für direkte suche im dokument eingebaut (bewegen sich alle so ab 4000€)
nicht ganz es gibt eine opensource c lösung.
mein dms braucht aber keine ocr im sinne von texterkennung. ich habe am meisten mit faxen zu tun welche nur 75 dpi haben und da nix leserliches mehr raus kommt. finereader engine hatte zumindest nur eine trefferrate von ca. 5%. deshalb ich nur eine erkennung von 2 dimensionalen strichcodes (wie im beispiel zu sehen).

ansonsten ist mein tipp finereader engine - die ist aber teuer - laesst sich aber leicht von delphi nutzen.
hat imho auch die beste erkennungsrate.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Virtual String Tree Objekte dynamisch nachladen

  Alt 7. Jun 2005, 16:25
Nachtrag: eine ListView kennt auch einen 'Virtual Mode'. Nur heisst der OwnerData := True.
Dann noch die Items.Count Property auf die Anzahl der Dokumente setzen und das OnOwnerData überschreiben.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz