AGB  ·  Datenschutz  ·  Impressum  







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

VST / Suche im VST

Ein Thema von ucor · begonnen am 30. Mai 2005 · letzter Beitrag vom 13. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
ucor

Registriert seit: 19. Apr 2005
18 Beiträge
 
#1

VST / Suche im VST

  Alt 30. Mai 2005, 20:26
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.
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#2

Re: VST / Suche im VST

  Alt 31. Mai 2005, 08:33
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.
Gruß

Albi
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#3

Re: VST / Suche im VST

  Alt 31. Mai 2005, 09:52
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
ucor

Registriert seit: 19. Apr 2005
18 Beiträge
 
#4

Re: VST / Suche im VST

  Alt 31. Mai 2005, 12:00
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.
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#5

Re: VST / Suche im VST

  Alt 13. Feb 2008, 13:08
Hallo Community,

ich bin ebenfalls auf der Suche nach der Suche im VirtualstringTree

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
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#6

Re: VST / Suche im VST

  Alt 13. Feb 2008, 13:25
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

Re: VST / Suche im VST

  Alt 13. Feb 2008, 14:14
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: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.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#8

Re: VST / Suche im VST

  Alt 13. Feb 2008, 14:44
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#9

Re: VST / Suche im VST

  Alt 13. Feb 2008, 15:01
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;
  Mit Zitat antworten Zitat
generic

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

Re: VST / Suche im VST

  Alt 13. Feb 2008, 15:05
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:49 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