Avatar billede jackass- Nybegynder
09. juni 2004 - 15:29 Der er 11 kommentarer og
1 løsning

Select filefolder

Heys.

Spørgsmål: hvordan laver jeg en knap så jeg kan selecte en hvilket som helst folder på min disk og smide i Edit1.Text?

Eksempelvis vælger man folderen grafisk, men bliver til Edit1.Text := 'C:\Mappe\Noget\Hehe';

OG!:

Når man har valgt mappen skal jeg bruge en function til at rende den igennem og finde alle subdirs og smide i en TMemo fx.

Det var 2 i 1 .. håber det lykkes :)
Avatar billede jackass- Nybegynder
09. juni 2004 - 15:40 #1
Jeg fandt ud af det med at selecte et dir ... nu mangler jeg bare det med rende den igennem og liste alle subdirs + size af disse.. eks output;

C:\Mappe\Noget\Hehe - 20.304MB
Avatar billede kammeyer Nybegynder
09. juni 2004 - 15:52 #2
Til den første kan du bruge komponenten ShellTreeView på Samples-fanen. Træk den ned på din form. Sæt dens onChange handler til følgende kode:
Edit1.Text := ShellTreeView1.Path;

Til andet delspørgsmål kan du benytte
FindFirst og FindNext og FindClose til at gennemgå din mappe:
var
sr: TSearchRec;
FilAttributter: Integer;

Filattributter := faDirectory;

if FindFirst(edit1.text, Filattributter, sr) = 0 then
begin
  repeat

    // gør hvad du vil med mapperne.

  until FindNext(sr) <> 0;
  FindClose(sr);
end;

FindFirst osv. ligger i unit SysUtils.
Avatar billede kammeyer Nybegynder
09. juni 2004 - 15:54 #3
Den tager 1 mappe af gangen - lav evt. et rekursivt kald !
Avatar billede jackass- Nybegynder
09. juni 2004 - 15:56 #4
Nå.. så er den med dirs fixed.. så mangler vi hvordan man finder dir-size af subdirs
Avatar billede borrisholt Novice
09. juni 2004 - 16:06 #5
Du kan ikke finde størelsen af en folder. Du er nødtil selv at tælle sammen.

Jens B
Avatar billede jackass- Nybegynder
09. juni 2004 - 16:57 #6
Fandt ud af det.. men hvordan rounder man en integer til 2 chars efter komma? altså så 12,1212123123123 bliver til 12,12
Avatar billede borrisholt Novice
09. juni 2004 - 18:04 #7
function JBRoundFloat(Value: Extended; const NumberOfDecimals: Byte): Extended;
var
  Factor: Extended;
begin
  Factor := IntPower(10, NumberOfDecimals);

  if Frac(Value * Factor) = 0.5 then
    Value := Value + 1 / (IntPower(10, NumberOfDecimals + 1));

  Result := StrToFloat(Format('%.*f', [CurrencyDecimals, Value]));
end;
Avatar billede nop Nybegynder
11. juni 2004 - 12:13 #8
Sådan tæller man en folder sammen, incl. sub-foldere:

uses
    sysUtils;


function getFolderSize(pn: string): cardinal;
var
    sr:    TsearchRec;
    attr:  integer;
begin
    result:=0;
    attr:=faAnyFile;
    if FindFirst(pn+'\*.*',attr,sr)=0 then begin
        repeat
            if (sr.Attr and faDirectory) = sr.Attr then begin
                if (sr.Name<>'.') and (sr.Name<>'..') then
                    result:=result+getFolderSize(pn+'\'+sr.Name);
            end else
                if (sr.Attr and attr) = sr.Attr then
                    result:=result+sr.Size;
        until FindNext(sr)<>0;
        FindClose(sr);
    end;
end; //get folder size

Jeg har ikke testet den med hidden files mv, men mon ikke faAnyFile osse er incl. hiddens og system filer. Ellers er det let at sætte på.

--nop
Avatar billede nop Nybegynder
11. juni 2004 - 12:47 #9
eksempel på brug:
x:=getFolderSize('c:\data');

borrisholt>> skal det ikke være: if Frac(Value * Factor) >= 0.5 then // >= istedet for =
og hvorfor ikke: roundTo(value,-2) fra math unit'en
--nop
Avatar billede borrisholt Novice
11. juni 2004 - 12:48 #10
PGA, forskellige afrundings regler.
Avatar billede nop Nybegynder
11. juni 2004 - 12:49 #11
hvilke?
Og det skal da være >=.
Avatar billede borrisholt Novice
11. juni 2004 - 12:51 #12
Jow
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