Avatar billede prodoc Nybegynder
26. april 2005 - 21:47 Der 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???
Avatar billede kroning Nybegynder
26. april 2005 - 22:47 #1
I din ShellListView1Click skriver du følgende:

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;
Avatar billede prodoc Nybegynder
27. april 2005 - 07:49 #2
Lyder godt kroning, Tak!
Men den siger 'List Index out of bounds (-1)'?

Du ved vel ikke hvordan man bestemmer hvilke mappe ShellListView'en skal starte ?

(Du ved vel ikke også:) Om det er muligt at gøre det sådan at alle BMP filernes ikon er fx. ./grafik/Bmp.ico ?
Avatar billede kroning Nybegynder
27. april 2005 - 08:16 #3
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.
Avatar billede prodoc Nybegynder
27. april 2005 - 08:22 #4
Du er en Gud Kroning! Her er dine velfortjente Points..!!!
Tak for hjælpen
Avatar billede kroning Nybegynder
27. april 2005 - 08:24 #5
ok, tak for det
Avatar billede prodoc Nybegynder
27. april 2005 - 08:26 #6
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?
Avatar billede kroning Nybegynder
27. april 2005 - 08:36 #7
Jo da, hvis jeg forstår dig rigtig:

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;
Avatar billede prodoc Nybegynder
27. april 2005 - 08:44 #8
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

If Hest.zip til stede then Showmessage('');
Avatar billede kroning Nybegynder
27. april 2005 - 13:29 #9
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;
Avatar billede prodoc Nybegynder
27. april 2005 - 15:53 #10
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...?
Avatar billede kroning Nybegynder
27. april 2005 - 15:58 #11
Jeg ville nok vælge OnActivate, og det burde også virke.
Avatar billede prodoc Nybegynder
27. april 2005 - 16:01 #12
Lyder godt...du ved vel ikke hvordan man går sådan at når man trykker på en mappe så kommer der også en popup op...?
Avatar billede kroning Nybegynder
27. april 2005 - 16:04 #13
Altså en 3. popup når man trykker en enkelt gang på venstre tast?
Avatar billede prodoc Nybegynder
27. april 2005 - 16:06 #14
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;
Avatar billede prodoc Nybegynder
27. april 2005 - 16:08 #15
Det er fordi at jeg vil gerne have det sådan at når man trykker på en mappe (ikonet) så skal der komme en 3. popup op... :)
Avatar billede kroning Nybegynder
27. april 2005 - 16:10 #16
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;
Avatar billede prodoc Nybegynder
27. april 2005 - 16:21 #17
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?
Avatar billede prodoc Nybegynder
27. april 2005 - 16:26 #18
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);
Avatar billede kroning Nybegynder
27. april 2005 - 16:37 #19
I OnClick for for det menu punkt du nu vælger skriver du:
ShellListView1.Root:=ShellListView1.Folders[ShellListView1.ItemIndex].PathName;

Hvis navnet på din TShellListView er ShellListView1 eller skal det self. ændres.

Ang. dit sidste spørgsmål så skal du ændre linien:
SLV:=(Sender as TShellListView);
til:
SLV:=ShellListView1;

og igen hvis din TShellListView hedder noget andet end ShellListView1 skal det self. ændres.
Avatar billede prodoc Nybegynder
27. april 2005 - 16:39 #20
Mange tak for det kronning, og tak for for hjælpen endnu en gang....
Avatar billede prodoc Nybegynder
27. april 2005 - 16:41 #21
(Troede faktisk jeg havde accepteret dine svar... ) :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester