26. april 2005 - 21:47Der er
20 kommentarer og 1 løsning
Åbne bestemt drev (Edit1.Text) og vis filer med ikoner i appet?
Hej allesammen, Jeg har et program som har en masse funktioner, bla at vise en mappes indhold med store ikoner (TShellListView eller TListView) mener jeg.... Hvilken mappe den skal åbnes er den der står i en Edit1.text (fx. F:\)....
Når den så viser mappen kan man så gøre det sådan at den finder ud af hvilke filer der er exe og bmp og så Åbne enten TpopupMenu1 eller TpopupMenu2 ved click propertien???
procedure TForm1.ShellListView1Click(Sender: TObject); var FileExt : string; begin FileExt:=ExtractFileExt((Sender as TShellListView).Folders[(Sender as TShellListView).ItemIndex].PathName); FileExt:=AnsiUpperCase(FileExt); if FileExt='.EXE' then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileExt='.BMP' then PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end;
Jeg gætter på at fejlen (-1) kommer når du klikker ved siden af en fil, det burde dette løse:
procedure TForm1.ShellListView1Click(Sender: TObject); var FileExt : string; begin if (Sender as TShellListView).ItemIndex=-1 then exit; // ingen fil/mappe er valgt FileExt:=ExtractFileExt((Sender as TShellListView).Folders[(Sender as TShellListView).ItemIndex].PathName); FileExt:=AnsiUpperCase(FileExt); if FileExt='.EXE' then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileExt='.BMP' then PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end;
----------------
For at starte/gå til en bestemt mappe sætter du blot Root propertyen i object inspectoren eller sætter Root at runtime således:
ShellListView1.Root:='c:\Programmer'; // går til Programmer mappen på C drevet
------------------------
Til dit sidste spørgsmål, det ved jeg faktisk ikke, jeg gætter på at det kam man ikke med mindre man ændre ikonet for hele windows.
Hov forresten lige en sidste hvis det er i orden, Kan man gøre det sådan at hvis det er en FIleExt som ikke er nævnt fx. TXT, at den så har en ShowMessage('Den går ikke mester');?
Og lige den allersidste:) Kan ShellListView'en ikke når den "enter" en mappe gøre at hvis der er en fil med navnet Hest.zip (hele navnet ikke kun File Ext) så kommer der en anden Showmessage?
procedure TForm1.ShellListView1Click(Sender: TObject); var FileExt,FileName : string; begin if (Sender as TShellListView).ItemIndex=-1 then exit; // ingen fil/mappe er valgt FileName:=ExtractFileName((Sender as TShellListView).Folders[(Sender as TShellListView).ItemIndex].PathName); FileName:=AnsiUpperCase(FileName); FileExt:=ExtractFileExt(FileName); if FileExt='.EXE' then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileExt='.BMP' then PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileName='HEST.ZIP' then ShowMessage('Heste filen') else ShowMessage('Den går ikke mester'); end;
Undskyld Kroning, :) men det med Hest.zip, er det muligt at gøre det sådan at når man den går ind i mappen fx. ved button click så finder den ud af at der findes en fil der hedder Hest.zip.... noget a la
Jeg kan ikke finde nogen event eller andet der fortæller når der skiftes mappe, men jeg går ud fra at det sker når du dobbelt klikker på en mappe og så kan du bruge ShellListViewens dobbelt klik event, således:
procedure TForm1.ShellListView1Click(Sender: TObject); var FileExt,FileName : string; SLV : TShellListView; begin SLV:=(Sender as TShellListView); if SLV.ItemIndex=-1 then exit; // ingen fil/mappe er valgt
FileName:=ExtractFileName(SLV.Folders[SLV.ItemIndex].PathName); FileName:=AnsiUpperCase(FileName); FileExt:=ExtractFileExt(FileName); if FileExt='.EXE' then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileExt='.BMP' then PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if not SLV.Folders[SLV.ItemIndex].IsFolder then ShowMessage('Den går ikke mester'); end;
procedure TForm1.ShellListView1DblClick(Sender: TObject); var i : integer; SLV : TShellListView; begin SLV:=(Sender as TShellListView); for i:=0 to SLV.Items.Count-1 do if AnsiUpperCase(ExtractFileName(SLV.Folders[i].PathName))='HEST.ZIP' then begin Showmessage('Hest.zip fundet i denne mappe'); break; end; end;
Du tror ikke at jeg eventuelt bare kan sætte: var i : integer; SLV : TShellListView; begin SLV:=(Sender as TShellListView); for i:=0 to SLV.Items.Count-1 do if AnsiUpperCase(ExtractFileName(SLV.Folders[i].PathName))='HEST.ZIP' then begin Showmessage('Hest.zip fundet i denne mappe'); break; end; end;
Ind under Create proceduren, for jeg havde tænkt mig at Hest.ZIP skulle være i Root Biblioteket...? For så starter den da sammen med programmet, eller eventuelt ved show proceduren eller lign...?
Forresten hvis der er nogen der senere vil drage nytte af dette, så er der her en lille een hvis man ved hjælp af en TButton vil gå een tilbage i Mappe strukturen (Dvs. fra C:\Hængekøje til C:\):
procedure TForm1.Button1Click(Sender: TObject); begin ShellListView1.SetFocus; keybd_event(VK_BACK,0,0,0); end;
Hvis du ændre ShellListView1Click således burde det virke:
procedure TForm1.ShellListView1Click(Sender: TObject); var FileExt,FileName : string; SLV : TShellListView; begin SLV:=(Sender as TShellListView); if SLV.ItemIndex=-1 then exit; // ingen fil/mappe er valgt
FileName:=ExtractFileName(SLV.Folders[SLV.ItemIndex].PathName); FileName:=AnsiUpperCase(FileName); FileExt:=ExtractFileExt(FileName); if FileExt='.EXE' then PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if FileExt='.BMP' then PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else if not SLV.Folders[SLV.ItemIndex].IsFolder then ShowMessage('Den går ikke mester') else if SLV.Folders[SLV.ItemIndex].IsFolder then PopupMenu3.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end;
Så er den der...! Nu lover jeg (tror jeg) at det er den sidste!!! Hvis jeg via popup3 vil gå ind i den mappe man trykker på hvad skal jeg så skrive? For jeg prøvede at lave en knap med en timer så den automatisk efter 50 ms trykkede VK_RETURN... da mappen allerede var markeret men det virkede ikke, du har vel ikke en ide?
Den har lidt problemer med det med at finde Hest.zip, den skriver at det er en invalid class typecast, og stopper her: SLV:=(Sender as TShellListView);
(Troede faktisk jeg havde accepteret dine svar... ) :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.