![]() |
VST / Suche im VST
Hallo,
ich möchte mit Hilfe eine TEdit-Komponenete eine Suchfunktion im VST einrichten. Der VST bezieht seine Daten aus einer Datenbank, aus der ich nun einen oder mehrere Werte erhalten möchte, z.B. die Suche nach dem Namen 'Müller'. Wie kann ich es erreichen, dass der entsprechende Wert im VST den Focus erhält, der in der Edit-Komponente eingegeben wird? Gruß U. |
Re: VST / Suche im VST
Hallo,
hast Du mal versucht, die VST mit in einer Schleife durchzulaufen und die Node's mit dem Eintrag im dem Edit-Feld zu vergleichen? Und bei übereinstimmung dann den Focus auf den entsprechenden Node zu setzen?
Code:
Ich habe den Code jetz nicht getestet aber so in etwa sollte das gehen.
Node:= VST1.FocusedNode;
for i:= 0 To VST1.Header.Columns.Count-1 DO if VST1.Text[Node,i] = Edit1.Text Then Node.SetFocus |
Re: VST / Suche im VST
Ich glaube sogar, dass das VST Inkrementelle Suche von vornerein unterstützt. Also wenn man den Fokus auf dem VST hat, kann man auch einfach den Text eintippen um danach zu suchen. Dies kann man bestimmt auch irgendwie selber nutzen.
|
Re: VST / Suche im VST
Hallo,
SetFocus wird vom VST leider nicht unterstützt. Habe mal 'Showmessage('i')' -Zeile mit SetFocus habe ich weggelassen- eingefügt und bekomme eine EAccessViolation. Das gleiche, bis jetzt ungelöstes Problem, hatte ich auch schon mit einer Combobox in Verbindung mit dem VST. Die Inkrementelle Suche habe ich mit folgendem Code ausprobiert -stammt aus dem VST-Handbuch-
Delphi-Quellcode:
Hier bezeichnet der Compiler 'PropertyTexts' als undefinierten Bezeichner.
procedure TMF.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 := Text; 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; IncrementalSearch steht auf isAll. Wenn ich aber einen Node anklicke, mit F2 in den Editiermodus wechsel, und ein Wort eingebe, passiert eigentlich nichts. Gruß U. |
Re: VST / Suche im VST
Hallo Community,
ich bin ebenfalls auf der Suche nach der Suche im VirtualstringTree :roll: Szenario: Ich möchte eigentlich, in einem Editfeld einen Text eingeben, und diesen per Button im VirtualStringTree suchen lassen. Danach den Node selektieren und gut ist... Gemäss meinen gefundenen Hilfen im Netz, aktiviert sich die Suche im VST durch die Eingabe von Buchstaben innerhalb des VST, leider springt er bei mir nur auf den ersten Node und bleibt dort stehen. Mit dem Ereignis OnIcrementalSearch kann ich leider auch nichts anfangen. Hätte jemand eine Lösung parat, was ich wo definieren muss, um obiges Szenario zu verwirklichen? Merci und Gruess, Ice |
Re: VST / Suche im VST
Das heißt auch nicht SetFocus, sondern
Delphi-Quellcode:
Benutze auf der Arbeit kein VST und habe es daher nicht installiert.
VST.FocusedNode(Index);
//oder Node.Focused := True; Ist also aus den Fingern gesoge, aber so ähnlich geht das, eins von beiden war richtig. Edit: Für die Suche
Delphi-Quellcode:
...aus dem gleich Vergleich kann man auch natürlich einen, ist Substring innerhalb machen....ändern lässt sich das nach belieben....anpassen und benutzen ;)
LNodeData := VST.GetNodeData(LNode);
while assigned(LNodeData) do begin if TMeinTyp(LNodeData).Text = AVariableMitSuchtExt then begin ... Break; end; LNodeData := VST.GetNodeData(LNode); end; |
Re: VST / Suche im VST
Tyrael, deine Schleife ist eine Endlosschleife. ;)
Den VST kannst du auf zwei Arten durchsuchen. Entweder du holst dir mit .GetFirst den ersten Knoten und gehst in einer while Assigned(Node)-Schleife den Baum durch, holst dir für jeden Knoten die Daten, vergleichst den Text. Wenn er stimmt, setzt du VST.Focused[Node] := TRUE (nicht mit VST.FocusedNode!) und verlässt die Schleife. Sonst holst du dir mit .GetNext den nächsten Knoten. Die zweite ist per VST.IterateSubTree. Die ist ziemlich schnell. Dafür mußt du nur eine Callback-Funktion implementieren, die du als 2. Parameter übergibst. Der erste und letzte Param kann "nil" sein. Brauchst du in deinem Fall nicht. Der Kopf dafür sieht so aus:
Delphi-Quellcode:
Dort kannst du genauso per Node die Daten holen, vergleichen und wenn der Text stimmt, Focus auf den Knoten setzen und Abort := TRUE.
procedure ItTree_CallBack (Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
|
Re: VST / Suche im VST
Wieso ist das ne Endlosschleife?
Wenn NodeData nicht mehr definiert ist ist aus... Edit: Ach alles klar...es fehlt natürlich ein GetNext...sry wie gesagt, alles aus den Fingern gesogen ohne die Komponente hier zu haben usw. Edit2:
Delphi-Quellcode:
...so ist der richtige Weg, langsam dämmerts :mrgreen:
LNode := VST.GetFirst;
while assigned(LNode) do begin LNodeData := VST.GetNodeData(LNode); if assigned(LNode) then begin if TMeinTyp(LNodeData).Text = AVariableMitSuchtExt then begin ... Break; end; end; LNode := VST.GetNext(LNode); end; |
Re: VST / Suche im VST
Yup, deswegen. Den Typecast nach TMeinTyp brauchst du auch nicht, da du in der Regel eine Zeiger-Variable von TMeinTyp hast, die du als NodeData verwendest.
Hier noch ein Beispiel mit IterateSubTree (was ich bevorzuge, eben weil es um längen schneller ist):
Delphi-Quellcode:
interface
type TMeinTyp = record Titel: WideString; Foo: Integer; end; PMeinTyp = ^TMeinTyp; TForm1 = class (TForm) // ... private FFoundNode: PVirtualNode; procedure ItTree_CallBack (Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean); // ... public // ... end; // ... implementation // ... procedure TForm1.ItTree_CallBack (Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean); var NodeData: PMeinTyp; begin NodeData := Sender.GetNodeData (Node); if (NodeData^.Titel = TMeinTyp (Data).Titel) then begin Sender.Focused[Node] := TRUE; FFoundNode := Node; Abort := TRUE; end; end; procedure TForm1.Button1Click (Sender: TObject); var SuchDaten: PMeinTyp; begin New (SuchDaten); try SuchDaten^.Titel := Edit1.Text; FFoundNode := nil; MeinVST.IterateSubTree (nil, ItTree_CallBack, Pointer(SuchDaten)); if Assigned (FFoundNode) then ShowMessage ('Eintrag gefunden') else ShowMessage ('Eintrag nicht gefunden'); finally Dispose (SuchDaten); end; end; |
Re: VST / Suche im VST
Schaut euch doch mal das Video vom 2. Stammtisch an.
Suche mit Edit ist dort implementiert/erklärt. Ansonsten das Entwickler Magazin 02/08 besorgen. Dort ist das was im Video ist abgedruckt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz