AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree und Incremental-Search

Offene Frage von "ratloser"
Ein Thema von ratloser · begonnen am 10. Dez 2005 · letzter Beitrag vom 10. Dez 2005
Antwort Antwort
ratloser

Registriert seit: 4. Mai 2005
Ort: Linz
36 Beiträge
 
#1

VirtualStringTree und Incremental-Search

  Alt 10. Dez 2005, 20:02
Hallo an alle!

Ich bräuchte wieder mal Eure Hilfe!

Ich bin im Umgang mit VirtualStringTree nicht sehr geübt, das was ich bisher gebraucht habe, Aufbau eines Trees mit Subnodes, Füllen mit Daten, Anpassen der Optik etc. funktioniert schon recht gut, ich versteh zwar nicht alles, aber Hauptsache es funzt.

Nun wollte ich eine Suche mittels Incremental-Search einbauen, aber jetzt weiss ich nicht mehr weiter.

Delphi-Quellcode:
procedure TKalk.vstIncrementalSearch(Sender: TBaseVirtualTree;
  Node: PVirtualNode; const SearchText: WideString; var Result: Integer);
var
  S, PropText: string;
begin
  // Note: This code requires a proper Unicode/WideString comparison routine which I did not want to link here for
  // size and clarity reasons. For now strings are (implicitly) converted to ANSI to make the comparison work.
  // Search is not case sensitive.
  S := SearchText;
  if Node.Parent = Sender.RootNode then
  begin
    // root nodes
    if Node.Index = 0 then
      PropText := 'Description'
    else
      PropText := 'Origin';
  end
  else
  begin
    PropText := PropertyTexts[Node.Parent.Index, Node.Index, ptkText];
  end;

  // By using StrLIComp we can specify a maximum length to compare. This allows us to find also nodes
  // which match only partially.
  Result := StrLIComp(PChar(S), PChar(PropText), Min(Length(S), Length(PropText)))
end
Nun meine Fragen: Wenn ich das so reinstelle, und einfach mal starte, bringt er die Meldung:

Delphi-Quellcode:
[Fehler] Hauptkalkulation.pas(1990): Undefinierter Bezeichner: 'PropertyTexts'
[Fehler] Hauptkalkulation.pas(1990): Undefinierter Bezeichner: 'ptkText'
[Fehler] Hauptkalkulation.pas(1995): Undefinierter Bezeichner: 'Min'
Meine Frage nun, warum findet er PropertyTexts nicht, ist das gesondert zu definieren?
Was soll in PropText stehen?
Was soll in Node.Parent.Index stehen, was in Node.Index und was in ptkText???

Lacht nicht, aber ich bin noch Anfänger.

Danke für Eure Bemühungen.

Ratloser (kann man wahrscheinlich nicht sein)
  Mit Zitat antworten Zitat
Benutzerbild von AndreasP
AndreasP

Registriert seit: 14. Aug 2003
Ort: Halle
82 Beiträge
 
Delphi 7 Professional
 
#2

Re: VirtualStringTree und Incremental-Search

  Alt 10. Dez 2005, 22:28
mahlzeit,

da du dieses code-fragment warscheinlich aus einem fremden code hast könnte ich maximal über 'PropertyTexts' und 'ptkText' spekulieren. mit 'Min' ist warscheinlich min(); aus math.pas gemeint (gibt dir den kleinsten wert von 2 variablen wieder). ich vermute mal das du alle deine nodes rekursiv nach einem text (node-text) durchsuchen willst. dafür bietet dir vt die funktion IterateSubtree() (es wird empfohlen diese funktion zum durchsuchen zu verwenden). die verwendung ist eigentlich ganz einfach:
Delphi-Quellcode:
TBaseVirtualTree.IterateSubtree(Node: PVirtualNode; Callback: TVTGetNodeProc; Data: Pointer;
  Filter: TVirtualNodeStates = []; DoInit: Boolean = False; ChildNodesOnly: Boolean = False): PVirtualNode;
Node: Node ab der gesucht werden soll, nil geht glaube ich wenn du alle nodes durchsuchen willst
Callback: ist eine procedure die regelt wie gesucht werden soll
Data: daten nach denen gesucht werden soll
der rest ist für diesen fall uninteresannt, siehe zur not in der beiliegenden hilfedatei nach.

konkretes beispiel (aus meinem aktuellen projekt)
Delphi-Quellcode:
  TMain = class(TTntForm)
  ...
  private
  procedure HideNodes(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  ...
  end;

procedure TMain.e_filterChange(Sender: TObject);
begin
//e_filter: Editfeld mit dem zu suchenden Text
//v_CatalogRootNode: variable die ich zur besseren verwaltung in meinem projekt verwende
  Main.vst_catalog.BeginUpdate;
  Main.vst_catalog.IterateSubtree(v_CatalogRootNode, HideNodes, Pointer(e_filter.Text), [], true);
  Main.vst_catalog.EndUpdate;
end;


procedure TMain.HideNodes(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var NodeData: TNodeData;
  b: boolean;
  ws: widestring;
...
begin
  b := true;
  ws := WideString(Data);
  NodeData := Sender.GetNodeData(Node);
  begin
  {Auswertung ob "Node" der suchkriterien entspricht und "b" etsprechend setzen}
  end;
 
  //Node Anzeigen oder Verstecken
  Sender.IsVisible[Node] := b;
end;
das ganze ist natürlich leicht aus dem zusammenhang gerissen, aber das grundprinzip sollte deutlich werden. sollte es nicht das sein wonach du gesucht hast, dann sei bitte so nett und ignoriere meine beitrag einfach
Live long and prosper, Andy

Die Diskusion zum AppManager gibt es hier
Immer die aktuelle Version vom AppManger
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:29 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