Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST / Suche im VST (https://www.delphipraxis.net/46746-vst-suche-im-vst.html)

ucor 30. Mai 2005 20:26


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.

Albi 31. Mai 2005 08:33

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:
Node:= VST1.FocusedNode;
  for i:= 0 To VST1.Header.Columns.Count-1 DO
  if VST1.Text[Node,i] = Edit1.Text Then
     Node.SetFocus
Ich habe den Code jetz nicht getestet aber so in etwa sollte das gehen.

jim_raynor 31. Mai 2005 09:52

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.

ucor 31. Mai 2005 12:00

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:
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;
Hier bezeichnet der Compiler 'PropertyTexts' als undefinierten Bezeichner.

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.

nytaiceman 13. Feb 2008 13:08

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

Tyrael Y. 13. Feb 2008 13:25

Re: VST / Suche im VST
 
Das heißt auch nicht SetFocus, sondern

Delphi-Quellcode:
VST.FocusedNode(Index);
//oder
Node.Focused := True;
Benutze auf der Arbeit kein VST und habe es daher nicht installiert.
Ist also aus den Fingern gesoge, aber so ähnlich geht das, eins von beiden war richtig.

Edit:
Für die Suche

Delphi-Quellcode:
LNodeData := VST.GetNodeData(LNode);

while assigned(LNodeData) do
begin
  if TMeinTyp(LNodeData).Text = AVariableMitSuchtExt then
  begin
    ...
    Break;
  end;

  LNodeData := VST.GetNodeData(LNode);
end;
...aus dem gleich Vergleich kann man auch natürlich einen, ist Substring innerhalb machen....ändern lässt sich das nach belieben....anpassen und benutzen ;)

Nuclear-Ping 13. Feb 2008 14:14

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:
procedure ItTree_CallBack (Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
Dort kannst du genauso per Node die Daten holen, vergleichen und wenn der Text stimmt, Focus auf den Knoten setzen und Abort := TRUE.

Tyrael Y. 13. Feb 2008 14:44

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:
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;
...so ist der richtige Weg, langsam dämmerts :mrgreen:

Nuclear-Ping 13. Feb 2008 15:01

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;

generic 13. Feb 2008 15:05

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 04:51 Uhr.
Seite 1 von 2  1 2      

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