Results 1 to 6 of 6

Thread: TSearchRec: Gebruik extra kolommen in de Windows verkenner en in Delphi

  1. #1

    TSearchRec: Gebruik extra kolommen in de Windows verkenner en in Delphi

    Ik wil graag in de verkenner extra kolommen gebruiken.

    Click image for larger version. 

Name:	Verkenner.jpg 
Views:	14 
Size:	59.6 KB 
ID:	7946

    Mijn vragen voor de verkenner zijn:
    Ik weet wel hoe ik extra kolommen in de verkenner kan aan-en uitzetten maar hoe kan ik die in de verkenner vullen?

    Mijn vragen voor Delphi zijn:

    Hoe kan ik in Delphi extra kolommen uitlezen?
    Hoe kan ik in Delphi (extra) kolommen vullen?
    Hoe kan ik in Delphi (extra) kolommen aan- en uitzetten tbv de verkenner
    Hoe kan ik in Delphi de volgorde van de kolommen bepalen tbv de verkenner
    Hoe kan ik in Delphi de kolommen sorteren tbv de verkenner
    Hoe kan ik in Delphi het type overzicht bepalen tbv de verkenner


    Hieronder een procedure die ik al heb:


    {---- VerkennerAanpassen ----}
    procedure VerkennerAanpassen;
    var FileTel :integer;
    EindeOk :boolean;
    FileRecord :TSearchRec;
    FPath,FNaam:string;
    FNaamStr :string;
    FNaamLabels:string;

    begin {---- VerkennerAanpassen ----}

    FileTel:=0; EindeOk:=false;
    FPath:='C:\Temp\'; Fnaam:='*.*';

    if FindFirst(FPath+Fnaam,faArchive,FileRecord)=0 then
    begin
    While not EindeOk do
    begin

    if FileRecord.Attr=faArchive then if FileTel<100then
    begin {- gevonden -}
    FileTel:=FileTel+1;

    { DIT IS NIET ZO MOEILIJK }
    FNaamStr:=Filerecord.Name;

    { MAAR HOE KRIJG IK HET UITLEZEN VOOR ELKAAR }
    FNaamLabels:=Filerecord.Labels;

    { EN HOE KAN IK ZE WEGSCHRIJVEN }
    Filerecord.Labels:='DEBIT'; {- voorbeeld --}
    wegschrijven(Filerecord); {- voorbeeld -}

    end; {- einde gevonden -}

    if FindNext(FileRecord)<>0 then EindeOk:=true;
    end;
    end;

    FindClose(FRecord);

    end; {---- VerkennerAanpassen ----}

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,492
    Er is een procedure, die alle properties uitleest. Maar geeft deze alleen maar de naam van de property en niet de gegevens.
    Delphi Code:
    1. uses   system.win.comobj;
    2.  
    3. procedure VerkennerAanpassen;
    4. var
    5.   ObjShell, ObjFolder : Variant;
    6.   FileProp : array of string;
    7.   FName : String;
    8.   I, J : Integer;
    9. begin
    10.     SetLength(FileProp, 35);
    11.     ObjShell := CreateOleObject('Shell.Application');
    12.     ObjFolder := ObjShell.NameSpace('C:\Users\john\Desktop\Downloads');
    13.  
    14.     for I := 0 to 34 do
    15.       FileProp[I] := ObjFolder.GetDetailsOf(ObjFolder.Items,I);
    16.  
    17. for I := 0 to ObjFolder.Items.Count-1 do
    18. begin
    19.   FName := ObjFolder.Items.Item(I);
    20.   memo1.lines.add('bestand : ' + FName);
    21.       for J := 0 to 34 do
    22.         memo1.lines.add('- ' +(FileProp[J]+' : '+ObjFolder.GetDetailsOf(FName,J)));
    23.     end;
    24. end; {---- VerkennerAanpassen ----}
    Delphi is great. Lazarus is more powerfull

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,492
    Nieuwe manier gevonden. Deze geeft alles, maar niet de naam van de property.
    Delphi Code:
    1. function GetExtFileInfo(sFileName: String; slResult: TStringList): String;
    2. var
    3.   Shell, OleFolder, OleFolderItem, OleDetail: OleVariant;
    4.   C, I: Integer;
    5. begin
    6.   Result := '';
    7.  
    8.   if not FileExists(sFileName) then Exit;
    9.   //init com ...
    10. //  CoInitialize(nil);
    11.   try
    12.     //link to win shell ...
    13.     Shell := CreateOleObject('Shell.Application');
    14.     //go to that folder ...
    15.     OleFolder := Shell.Namespace(ExtractFilePath(sFileName));
    16.     //locate file ...
    17.     OleFolderItem := OleFolder.ParseName(ExtractFileName(sFileName));
    18.     C := 288; // OleFolder.GetDetailsCount(OleFolderItem); or something like that
    19.     for I := -1 to C - 1 do
    20.      begin
    21.       //get file info using index ...
    22.       OleDetail := OleFolder.GetDetailsOf(OleFolderItem, I);
    23.       //convert to string and insert in Result
    24.       if OleDetail <> '' then
    25.         slResult.Add(IntToStr(I) + slResult.NameValueSeparator + OleDetail);
    26.      end;
    27.   finally
    28. //    CoUninitialize();
    29.   end;
    30. end;
    Delphi is great. Lazarus is more powerfull

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,492
    Als je dan deze code gebruikt i.c.m. met een listview, zie het er zo uit.
    Click image for larger version. 

Name:	extra info.png 
Views:	16 
Size:	23.9 KB 
ID:	7947
    Dat is gerealiseerd met dit stukje code:
    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var ts : TSearchrec;
    3.     sl : TStringList;
    4.     Item : TListItem;
    5. begin
    6.   sl := TStringlist.Create;
    7.   try
    8.     if findfirst('c:\temp\demo\*.*',faAnyFile,ts) = 0 then
    9.     repeat
    10.        Item := listview1.Items.Add;
    11.        Item.Caption := extractfilename(ts.Name);
    12.        if ts.Attr = faDirectory then
    13.          Item.SubItems.Add('Folder')
    14.        else
    15.        begin
    16.          sl.Clear;
    17.          Item.SubItems.Add('File');
    18.          GetExtFileInfo('c:\temp\demo\' + ts.Name, sl);
    19.          //memo1.Lines.Add(sl.Values['2']);
    20.          Item.SubItems.Add(sl.Values['2']);
    21.          Item.SubItems.Add(sl.Values['3']);
    22.          Item.SubItems.Add(sl.Values['4']);
    23.          Item.SubItems.Add(sl.Values['5']);
    24.          Item.SubItems.Add(sl.Values['14']);
    25.          Item.SubItems.Add(sl.Values['15']);
    26.          Item.SubItems.Add(sl.Values['19']);
    27.          Item.SubItems.Add(sl.Values['27']);
    28.          Item.SubItems.Add(sl.Values['238']);
    29.        end;
    30.     until findnext(ts) <> 0;
    31.     findclose(ts);
    32.   finally
    33.     sl.Free;
    34.   end;
    35. end;
    Maar dat is wel heel erg traag. Dat komt omdat er continue in de folder wordt gekeken en info wordt opgehaald. Maar dat is even goed nadenken en dan in één keer opbouwen.
    Delphi is great. Lazarus is more powerfull

  5. #5
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,194
    Wow! Interessant. Daar ga ik eens naar kijken.
    Ik heb me altijd afgevraagd waar al die extra file-nonsense opgeslagen wordt en hoe ik "Artiest" etc. in de verkenner kon uitzetten :-)

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,492
    Volgens mij is findfirst/findnext niet eens nodig. De olecontainer haalt al gegevens van de map op.
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •