Vyhledavani v treeview – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vyhledavani v treeview – Delphi – Fórum – Programujte.comVyhledavani v treeview – Delphi – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
dyžon0
Stálý člen
23. 9. 2012   #1
-
0
-

Zdravim vsechny..

mam TreeView naplnenej adresarema s fotkama.
mam funkci na vyhledavani:

function TVNajdiNode(Strom : TTreeView; Slovo:String): TTreeNode;
var
    Node: TTreeNode;
begin
  Result := nil;
  if ATree.Items.Count = 0 then Exit;
  Node := Strom.Items[0];
  while Node <> nil do
  begin
    if UpperCase(Node.Text) = UpperCase(Slovo) then
    begin
      Result := Node;
    end;
    Node := Node.GetNext;
  end;
end;

Vyhledavam udalosti OnClick
 

procedure TForm1.NajdiClick(Sender: TObject);
var
  nasel : TTreeNode;
begin
   nasel:=TVNajdiNode(TreeView1,Edit1.Text);
   if nasel = nil then
    ShowMessage('Not found!')
   else
    begin
      TreeView1.SetFocus;
      tnnasel.Selected := True;
    end;
end;

funguje paradne, najde to sice jen prvni adresar toho jmena
jenze ja bych potreboval, abych nemusel do Editu psat celej presnej nazev, ale kdyz mam treba adresare:
Narozeniny Robert
Narozeniny Adam
Narozeniny Anicka 3
Narozeniny Anicka 5
a podobne, aby stacilo do Editu napsat jen treba narozeniny, nebo Anicka a naslo to vsechny,co obsahuji tenhle text, v tom pripade by se musel TreeView smazat a vypsat do nej jen ty adresare, ktery se nasly,dejme tomu,ze i s nadrazenyma adresarema.

Pomuzete mi s tim nekdo prosim ??

Nahlásit jako SPAM
IP: 89.102.38.–
dyžon0
Stálý člen
23. 9. 2012   #2
-
0
-

s tim prepisovanim TreeView me napadlo upravit proceduru na vykreslovani o radek :
 

procedure GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: Boolean);
var
  SearchRec: TSearchRec;
  ItemTemp: TTreeNode;
begin

  Includefiles:=false;
  Tree.Items.BeginUpdate;
  if Directory[Length(Directory)] <> '\' then
  Directory := Directory + '\';
  if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
  begin
    repeat
      if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
      begin
        if (SearchRec.Attr and faDirectory > 0) then
// -----------------------------------------------------------------------
            If SearchRec.Name = (Form1.Edit1.Text) then
// -----------------------------------------------------------------------
            begin
          Item := Tree.Items.AddChild(Item, SearchRec.Name);
        ItemTemp := Item.Parent;
        GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
        Item := ItemTemp;
        end
      end
      else if IncludeFiles then
        if SearchRec.Name[1] <> '.' then
          Tree.Items.AddChild(Item, SearchRec.Name);
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
  Tree.Items.EndUpdate;
end;

to je dobry,ale po prvnim nalezenym zaznamu to skonci. 
jinymi slovy mam v tom TV nekolik adresaru Nova slozka, ted to najde prvni a skonci to, ty dalsi uz nevypise.

Nahlásit jako SPAM
IP: 89.102.38.–
liborb
~ Redaktor
+18
Guru
24. 9. 2012   #3
-
0
-

Když chceš hledat, jestli nějaký název obsahuje nějaký řetězec, tak nemůžeš přeci hledat přesnou shodu. Musíš použít hledání substringu, takže by to mohlo být nějak takto: 

If (AnsiContainsText(SearchRec.Name, Form1.Edit1.Text)) then

ale to už si když tak dovynajdeš sám :).

Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
24. 9. 2012   #4
-
0
-

super, to je ono, dikec

Nahlásit jako SPAM
IP: 89.102.38.–
dyžon0
Stálý člen
24. 9. 2012   #5
-
0
-

tak jsem upravil vyhledavani podle liborb, a vlozil procedurku,ktera  vsechny nalezeny adresare prepise tucnym pismem ..:

procedure SetNodeBoldState(Node: TTreeNode; Value: Boolean);
var
  TVItem: TTVItem;
begin
if not Assigned(Node) then Exit;
with TVItem do
begin
  mask := TVIF_STATE or TVIF_HANDLE;
  hItem := Node.ItemId;
  stateMask := TVIS_BOLD;
  if Value then state := TVIS_BOLD
                else state := 0;
  TreeView_SetItem(Node.Handle, TVItem);
end;
end;

ale kdyz chci hledat dalsi zaznam, tak potrebuju,aby se ty tucny adresare zmenili na normalni a zvyraznili se zase ty  z novyho hledani.
myslel jsem, ze pouziju tu samou proceduru, prejmenuju ji treba na UnSetNodeState, do promenne ulozim starej hledanej text,spustim ji pred procedurou na poTucneni a zmenim v ni TVIS_BOLD na treba TVIS_NORMAL, ...  ale ouha nejde to ..
hledal jsem teda neco o TTVItem.State a nasel jsem vsechny mozny zapisy, ale ani jeden neni na zmenu zpatky, nebo na default nastaveni ..  viz

Poradite mi prosim ... 

a jak by vypadal zapis,kdybych chtel zmenit barvu pisma ..(teda jestli to vubec jde ..)
dekuji

Nahlásit jako SPAM
IP: 89.102.38.–
Řešení
liborb
~ Redaktor
+18
Guru
26. 9. 2012   #6
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Báječné na tobě je, že někde seženeš kousek kódu, ale bohužel ho jen (promiň mi to slovo) tupě použiješ a nezkoumáš ho, neexperimentuješ s ním. A to je škoda. Jen tak mimochodem, ten odkaz do MSDN je pro mobilní wokna, dej si na to pozor, tam můžou být některé věci osekané. Pokud tvoříš na desktop, tak je samozřejmě lepší koukat na verzi pro desktop.

Item v TreeView může být některý z daných stylů nebo jejich kombinaci a nebo taky (což máš v tom svém kousku kódu) nic neboli 0. Takže TVIS_NORMAL je 0 :). Není tedy potřeba dělat UnSetNodeState, ale stačí zavolat SetNodeBoldState s Value nastaveným na False.

A k těm barvám. Základní klíčová slova jsou "TreeView NM_CUSTOMDRAW". V Delphi to bude něco jako CustomDrawItem.

Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
28. 9. 2012   #7
-
0
-

#6 liborb
Dekuju,

chapu,ze to vypada tak jak pises,ze ty kody nezkoumam, ale bohuzel to tak neni, jsem proste jen tupej. (tohle me melo napadnout)
ale musim rict,ze na spoustu veci se neptam, 1.den mi to treba nedocvakne,ale jak to resim dal, tak me napadaji ruzny veci a vyresim to sam. To se tady ale nedozvite. Na veci, ze jsem porad lama to ale nic nemeni.

takze dekuju , polepsim se.

Nahlásit jako SPAM
IP: 89.102.38.–
liborb
~ Redaktor
+18
Guru
28. 9. 2012   #8
-
0
-

Nemyslel jsem to nijak zle, ale už to tu jednou bylo, s tím hledání souborů, jestli si pamatuješ, tak mi to nedalo :). A klidně se ptej dál, maximálně se ti stane, že ti nikdo neodpoví ;).

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
dyžon0
Stálý člen
4. 10. 2012   #9
-
0
-

#8 liborb
v pohode, kritika na miste, obcas, kdyz se moc snazim mi to proste nesepne ...  :o)

Nahlásit jako SPAM
IP: 89.102.38.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

TreeView — založil marpit

C# - treeView — založil elvis

Statické TreeView — založil Chudda

TreeView.Nodes... — založil Trebor

WPF TreeView Binding — založil David Roško

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý