TreeView bez souboru + imagelist – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

TreeView bez souboru + imagelist – Delphi – Fórum – Programujte.comTreeView bez souboru + imagelist – Delphi – Fórum – Programujte.com

 

dyžon0
Stálý člen
12. 8. 2012   #1
-
0
-

Zdravim, ..

Mam takovej problem, chtel jsem do TreeView nacist adresare z disku,ale chtel bych ,aby se rozbalovaly jen adresare a nezobrazovali se uz soubory v nich.
Nasel jsem tenhle kod, ale ten je i se souborama, muze mi prosim nekdo pomoci ho upravit k memu ucelu, nejak si s tim nevim rady.  dekuji,  jeste bych Vas poprosil, aby tam byly i  ikonky slozek.

procedure TForm1.GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: Boolean);
var
  SearchRec: TSearchRec;
  ItemTemp: TTreeNode;
begin
  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
          Item := Tree.Items.AddChild(Item, SearchRec.Name);
        ItemTemp := Item.Parent;
        GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
        Item := ItemTemp;
      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;

procedure TForm1.Button1Click(Sender: TObject);
var
  Node: TTreeNode;
  Path: string;
  Dir: string;
begin
  Dir := 'c:\';
  Screen.Cursor := crHourGlass;
  TreeView1.Items.BeginUpdate;
  try
    TreeView1.Items.Clear;
    GetDirectories(TreeView1, Dir, nil, True);
  finally
    Screen.Cursor := crDefault;
    TreeView1.Items.EndUpdate;
  end;
end;

no a jeste bych vas chtel poprosit, jak mam udelat,aby,kdyz kliknu v tom TreeView na nejakej adresar, tak aby se vsechny .jpg  soubory zobrazily v, a ted prave nevim, jakou komponentu pouzit, melo by to byt neco, kam se nactou vsechny .jpg soubory z vybranyho adresare a zobrazi se jako miniatury.
Poklepanim na miniaturu by se potom .jpg zobrazil ve skutecne velikosti.

dekuji za odpoved.

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

Ta funkce GetDirectories má parametr IncludeFiles, který stačí předat false a budeš to mít bez souborů.

Na zobrazení souborů i jako miniatur je ListView se správně nastavenými parametry. Jen tak mimochodem, tady a pak tady je něco velmi málo pro inspiraci (no není to v Delphi :)).

Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
14. 8. 2012   #3
-
0
-

super, .. IncludeFiles vyreseny, diky,...

Jsem zrejme strasna lama, ale uz do toho cumim dlouho a porad se mi nedari propojit ten TreeView s ListView ....
nemuzu to najit ani nikde na netu, je to zrejme tak jednoduchy,ze o tom nikde nepisou ....

V prvni rade je potreba zjistit z TreeView cestu/path k oznacenymu/vybranymu adresari ...
TreeView1.Selected.Text  mi vypise jen jmeno adresare ...

ale hlavne mi nejak nejde nacist ty miniatury do ListView1   ...  nekde jsem cetl,ze bych mel pouzit ImageList, kterej naplnim souborama  .jpg z vybranyho adresare a ten propojit s ListView1.SmallImages.ImageList1

myslel jsem ze treba ImageList1.AddImage (cesta); ...  to je ale blbost

Mam Win7 a bohuzel nemam v Delphi napovedu (F1), ..  takze musim vsechno hledat na netu a vetsinou je to ve slozitejsich kodech, ktery neumim moc dobre rozlustit. Zkousim je zkopirovat a upravovat,ale spoustu parametru neznam a tak mi to moc nejde.

Pokud by nekdo vedel,kde stahnout napovedu pro Win7, a nahodi link, tak mu budu moc vdecny,  urcite bych spoustu veci vyresil sam a nemusel bych tady otravovat s prkotinama.

jinak prosim o radu jak provest to nacteni pouze .jpg souboru z vybranyho adresare do ListView.

dekuji

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

TreeView1.Selected.Text  mi vypise jen jmeno adresare

a ještě citace z odkazovaného článku:

V obou případech využijeme toho, že celá cesta je vlastně uložená v názvech jednotlivých položek stromu. Celou cestu tedy vytvoříme tak, že budeme odzadu spojovat jednotlivé názvy a prokládat je zpětnými lomítky.

Jinak řečeno, klikneš na položku stromu, která má text třeba Pokus, její rodičovská položka má text Test a její rodičovská položka je disk - třeba C:, takže to poskládáš do C:\Test\Pokus\.

Jak hledat jen jpg soubory? No v tom kódu, co si našel, je řádek: 

FindFirst(Directory + '*.*', faDirectory, SearchRec)

a stačí to změnit na: 

FindFirst(Directory + '*.jpg', faAnyFile, SearchRec)

a už hledáš všechno, co končí .jpg.

No a ten ListView musíš přepnout do režimu velkých ikon nebo tak něco a na náhledy je klíčové slovo pro hledání IExtractIcon.

Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
15. 8. 2012   #5
-
0
-

#4 liborb

Dikec, uz se trochu orientuju, ale porad mam problem s tim, jak naplnim ten ListView obrazkama.

Vysvetlim:
dejme tomu, ze v TreeView kliknu na adresar D:\fotky\narozeniny\  , kde je treba 20 fotek v .jpg,ktery bych chtel,aby se zobrazily v miniaturach v ListView. mely by tam byt vlastne miniatury a pod nima nazev fotky,ale bez toho nazvu se obejdu.

Uz jsem prosel spoustu clanku,ale nenasel jsem nic pro Delphi,co by se tomuhle problemu venovalo. Moje Anglictina neni moc silna,takze jsem hledal spis v ceskych odkazech.

prosim pokud nekdo vite, poradte ..  dekuji

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

S tím IExtractIcon jsem tě trochu mystifikoval, nevím na co jsem myslel :).

Máš adresář s obrázky. Umíš je projít, takže každý obrázek budeš umět načíst a znáš jeho jméno souboru. Obrázek načteš, zmenšíš (Stretch) na velikost, kterou si zvolíš (48x48, 96x96 apod). Stejně velké obrázky bude očekávat ImageList, do kterého budeš vkládat zmenšené obrázky. No a do ListView budeš vkládat položky jejichž text bude jméno souboru a index obrázku bude index obrázku v ImageListu.

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

diky, zatim v tom jeste tapu,ale nasel jsem nejaky odkazy,kde jsou uvedeny kody,tak to z toho zkusim nejak vycist.

az to budu mit v kupe,tak to sem pripnu.

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

Tak v tom porad tapu, ale nasel jsem navod na vytvoreni Exploreru a z toho bych to uz asi dal ,jenze autor pouziva tuto funkci:

function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;
  var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD; stdcall;

ale bohuzel pro nas LAMY jiz neuvadi, kam tu funkci zapsat a ukazka na konci stranky jiz nejde stahnout.
vzhledem k tomu, ze u ni neni zadny begin a end, myslel jsem,ze musi byt jeste nekde  pred {$R *.dfm} ...

zkousel jsem snad vsude, ....  neuspesne.

tady je odkaz na clanek

do Uses jsem ShellAPI pridal

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

tak uz jsem to asi zjistil, patri to do sekce Impementation ...

Nahlásit jako SPAM
IP: 89.102.38.–
Sniper
~ Anonymní uživatel
215 příspěvků
23. 8. 2012   #10
-
0
-

Teda celý jsem to nečet, ale to co uvádíš podle všeho nepatří nikam. Je to tam uvedený jako deklarace, abys věděl co použít jako parametry atp. Ta funkce je z WinAPI a ty ji budeš jenom volat, ne implementovat.

Nahlásit jako SPAM
IP: 90.179.201.–
dyžon0
Stálý člen
24. 8. 2012   #11
-
0
-

#10 Sniper
Aha, uz je mi to jasnejsi, ale stejne,kdyz mam tenhle kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, ImgList, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ShowBtn: TButton;
    DirEdit: TEdit;
    FileView: TListView;
    LargeFileImages: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure ShowBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SFI: TSHFileInfo;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  LargeFileImages.Handle := SHGetFileInfo
    PChar(Application.ExeName), // jelikož nám jde o handle ImageListu,
    0,                          // můžeme použít libovolný soubor - třeba
    SFI, SizeOf(SFI),           // "exáč" aplikace
    SHGFI_SYSICONINDEX + SHGFI_LARGEICON
  );
end;

procedure TForm1.ShowBtnClick(Sender: TObject);
var
  Found: Integer;
  SearchRec: TSearchRec;
begin
  // odstraníme všechny položky
  FileView.Items.Clear;
  // zahájíme hledání
  Found := FindFirst(DirEdit.Text + '\*.*', faAnyFile - faVolumeID, SearchRec);
  // opakujeme, dokud existují vyhovující soubory
  while Found = 0 do
  begin
    if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      with FileView.Items.Add do // přidíme položku
      begin
        SHGetFileInfo
          PChar(DirEdit.Text + '\' + SearchRec.Name), // cesta k souboru
          0,                                          // atributy - žádné
          SFI, SizeOf(SFI),                           // struktura TSHFileInfo
          // vlajky: chceme získat index velké ikony a jméno souboru
          SHGFI_SYSICONINDEX + SHGFI_LARGEICON + SHGFI_DISPLAYNAME
        );
        Caption := SFI.szDisplayName; // nastavíme název
        ImageIndex := SFI.iIcon;      // a index ikony
      end;
    Found := FindNext(SearchRec);
  end;
  // konec hledání
  FindClose(SearchRec);
end;

end.

tak mi to pise, ze PChar v procedure OnCreate ...  Not enough actual parameters. 

WinAPI v Uses mi to nebere vubec ..  mam Delphi7 a Win7 

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

A závorku tam máš nebo nemáš? 

SHGetFileInfo(
Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
24. 8. 2012   #13
-
0
-

#12 liborb
No samozrejme, ze nemam, ...  jsem ale hnup. ...   dikec

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

Super, konecne se dostavam do finale, ...  ale jeste porad nejsem spokojenej ..

v navodu, link viz par odkazu vys, autor radi, jak v ListView vykreslit male ikony, velke ikony, podrobnosti a seznam.
pouzil jsem velke ikony ale vysledek je :

ve windows to ale s nastavenim velke ikony vypada takto:

poradite mi jeste prosim, jak toho docilit ?? 
predpokladam, ze to bude tady ...... SHGFI_SYSICONINDEX + SHGFI_LARGEICON + SHGFI_DISPLAYNAME ,
ale neznam vsechny parametry a hlavne ten co potrebuju.

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

zkousel jsem meni v ImageListu velikost  height a width, ale nic to nedela.

Nahlásit jako SPAM
IP: 89.102.38.–
Sniper
~ Anonymní uživatel
215 příspěvků
24. 8. 2012   #16
-
0
-
Nahlásit jako SPAM
IP: 90.179.201.–
liborb
~ Redaktor
+18
Guru
24. 8. 2012   #17
-
0
-

To funguje správně, protože jediné čeho tou funkcí dosáhneš je získání ikony (velké/malé) registrované v systému k danému typu souboru. Pokud chceš náhledy obsahu souboru, tak otevřít soubor, načíst obrázek, zmenšit a uložit do ImageList. A to musíš všechno udělat sám (samozřejmě na každý ten kousek něco najdeš, co se dá použít).

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.211.–
zlz
~ Anonymní uživatel
634 příspěvků
24. 8. 2012   #18
-
0
-

#15 dyžon
A zkoušel jsi číst dokumentaci?

TListView.LargeImages obsahuje obrázky. Ty v něm máš načtené systémové ikony.
TListItem.ImageIndex určuje index obrázku ^^. Ty ho nastavuješ na index systémové ikony.

Jestli chceš zobrazovat náhledy, tak si místo ikon načti ty náhledy a nastav odpovídající index. Na získání náhledů zase můžeš použít funkce shellu, konkrétně to umí třeba IExtractImage interface, nebo funkce Delphi (TBitmap?).

Nahlásit jako SPAM
IP: 78.156.159.–
dyžon0
Stálý člen
25. 8. 2012   #19
-
0
-

a jsem zase v riti ...

nemuzu nikde najit zadnej rozumnej zapis  s iextractimage pro Delphi.

tohle vlakno ukoncim a pokracovani uz s presnejsim nazvem je tady.

dekuji vsem.

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, 12 hostů

 

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