Søge efter mapper i ListBox i Borland C/C++builder

Tags:    c++ grafik

Jeg prøver at lave en listbox der undersøger en given mappe "skuffe" for at se om der er
evt. undermapper.

disse undermappers navne skal så vises i listboxen.

findes der en færdig metode til det?
eller er der en der kan skrive hvordan det skulle gøres?



/* Life is to short to Windows

Linux Rocks*/



9 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Altså hvis du <b>vil</b> have det i en dirlistbox, så kan du parse den comma text streng nogenlunde sådan her. Det er ikke så pænt, men du kan jo altid sidde og rode med at gøre det dynamisk osv hvis det er noget du skal bruge til noget.

Fold kodeboks ind/udKode 


Jeg ville nok hellere smide hele mit Lines array over i et string grid istedet, der kan du også nemmere styre hvad der skal ske når der klikkes i en celle (tænker her på næste problem, det med at klikke på pfå vist det spray der hører til mappen.)

Anyways, du kan bruge følgende kode til at hive biblioteksnavnene ud af den komma streng.




Jeg prøver at lave en listbox der undersøger en given mappe "skuffe" for at se om der er
evt. undermapper.

disse undermappers navne skal så vises i listboxen.

findes der en færdig metode til det?
eller er der en der kan skrive hvordan det skulle gøres?



/* Life is to short to Windows

Linux Rocks*/


Der er noget der hedder en "Directory list box" inde under win 3.1 i borland c++ builder.

Du kan så f.eks. bruge en drivecombobox til at liste din drev og sætte directorylistboxens drive til at være lig din drev kombo.

noget alla det her:
DirectoryListBox->Drive = DriveComboBox->Drive;

Det vil så vise alle mapper for det valgte drev.

[Redigeret d. 19/08-03 17:32:27 af Agge Kempff]



Jeg prøver at lave en listbox der undersøger en given mappe "skuffe" for at se om der er
evt. undermapper.

disse undermappers navne skal så vises i listboxen.

findes der en færdig metode til det?
eller er der en der kan skrive hvordan det skulle gøres?



/* Life is to short to Windows

Linux Rocks*/

Der er noget der hedder en "Directory list box" inde under win 3.1 i borland c++ builder.

Du kan så f.eks. bruge en drivecombobox til at liste din drev og sætte directorylistboxens drive til at være lig din drev kombo.

noget alla det her:
DirectoryListBox->Drive = DriveComboBox->Drive;

Det vil så vise alle mapper for det valgte drev.

[Redigeret d. 19/08-03 17:32:27 af Agge Kempff]






Det er noget i den stil jeg skal bruge, men alligevel ikke helt.
jeg kan se at i directorylistbox kan jeg bladre rundt i de forskellige mapper og det er ikke det jeg ønsker.



det jeg vil lave ser nogenlunde sådan her ud.

ListBox. | Knap1 | Image1
dir1 | "view" |
dir2 | _____ |
dir3 | Knap2 |
osv.. | "LOAD" |

hvor jeg har min mappe "skuffe" hvis indhold bliver vist i den venstre listbox.
dvs at KUN navnene på mapperne bliver vist men IKKE strukturen.
nå brugeren så markere en mappe i listboxen kan han trykke "view" eller "Load"
hver af disse mapper vil indeholde et bmp billede og en dll fil. og meningen er så at hvis folk trykker "view" skal den gå ned i den valgte mappe og vise bmp filen i "Image1"
vælger man istedet "Load" skal den gå ned i den valgte mappe og kopiere dll filen til en forudbestemt mappe.

nogen ider til det?







[Redigeret d. 20/08-03 11:14:54 af carsten andersen]

[Redigeret d. 20/08-03 11:17:17 af carsten andersen]

[Redigeret d. 20/08-03 11:19:25 af carsten andersen]

[Redigeret d. 20/08-03 11:21:44 af carsten andersen]

[Redigeret d. 20/08-03 11:22:30 af carsten andersen]



Det jeg lige har kunne finde frem til er dette:

enum TFileAttr { ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal };

typedef Set<TFileAttr, ftReadOnly, ftNormal> TFileType;

__property TFileType FileType = {read=FFileType, write=SetFileType, default=64};

Så skal du få sat TFileAttr til ftDirectory, så skulle din listbox kun vise directories.
Du kan jo prøve at lege lidt med det. Problemet er at listboxen per default ikke viser directories, så det skal du ind og ændre. Det tror jeg gøres som beskrevet ovenover.

Men præcis hvordan du gør det, det ved jeg desværre ikke.





Det jeg lige har kunne finde frem til er dette:

enum TFileAttr { ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal };

typedef Set<TFileAttr, ftReadOnly, ftNormal> TFileType;

__property TFileType FileType = {read=FFileType, write=SetFileType, default=64};

Så skal du få sat TFileAttr til ftDirectory, så skulle din listbox kun vise directories.
Du kan jo prøve at lege lidt med det. Problemet er at listboxen per default ikke viser directories, så det skal du ind og ændre. Det tror jeg gøres som beskrevet ovenover.

Men præcis hvordan du gør det, det ved jeg desværre ikke.




det ligner noget af det rigtige...meeen..

det jeg tænkte på var om det ikke istedet ville være nemmere at lave en form for søge rutine i den mappe "skuffe" og hive navnene up på de subdirs der er..

altså så listboxen viser de navne i eks en ansistring?
ingen grund til at listboxen ved det er dirs.. den skal jo ikke gøre noget med dem andet end at vise deres navn..
så ville jeg kunne bruge noget som
listbox1->files->add(mitarray[]) ; ?
derefter kunne jeg behandle dem med
listbox1->files->selected bla bla

jeg er ikke så skrap at jeg fatter helt de andre du foreslog :)



Fattede heller ikke helt så meget af det selv. :)

Men det andet du snakker om, kan gøres rimeligt nemt (men måske ikke så pænt) ved at du laver en directorylistbox, som du bare ikke viser. Sætter den til det bibliotek med dine "skuffer" og så trækker du listen ud adskilt med kommaer mellem bibliotekerne.
Den kan du bare trække bibliotekernes navne ud af.

{
DirectoryListBox1->Directory = "C:\\\\Program Files";
Label1->Caption = DirectoryListBox1->Items->CommaText;
}


Måske det kan virke?


[Redigeret d. 22/08-03 18:04:38 af Agge Kempff]



Fattede heller ikke helt så meget af det selv. :)

Men det andet du snakker om, kan gøres rimeligt nemt (men måske ikke så pænt) ved at du laver en directorylistbox, som du bare ikke viser. Sætter den til det bibliotek med dine "skuffer" og så trækker du listen ud adskilt med kommaer mellem bibliotekerne.
Den kan du bare trække bibliotekernes navne ud af.

{
DirectoryListBox1->Directory = "C:\\\\Program Files";
Label1->Caption = DirectoryListBox1->Items->CommaText;
}


Måske det kan virke?


ja umiddelbar virker det, dog med en lille undtagelse.

min kode ser sådan her ud

DListBox1->Directory = "E:\\\\Programering\\\\SprayChange\\\\Sprays";
ListBox1->Items->Add(DListBox1->Items->CommaText) ;

men mit output ser sådan ud

E:\\,Programering,SprayChange,Sprays,Santa,Scdemo

jeg ønsker jo ikke at få vist stien til mappen sprays
og jeg vil gerne have de to subdirs Santa og Scdemo på hver sin linje så
brugeren kan vælge dem.

nu er syntax ikke min stærke side men i psudokode kunne man da ikke
lave noget lignende dette.

int I ;
char MyArray[20][20] = DListBox1->Items ;
ListBox1->Items->Add(MyArray[I][DListBox1->Items]);
og noget I++





Altså hvis du vil have det i en dirlistbox, så kan du parse den comma text streng nogenlunde sådan her. Det er ikke så pænt, men du kan jo altid sidde og rode med at gøre det dynamisk osv hvis det er noget du skal bruge til noget.

Fold kodeboks ind/udKode 


Jeg ville nok hellere smide hele mit Lines array over i et string grid istedet, der kan du også nemmere styre hvad der skal ske når der klikkes i en celle (tænker her på næste problem, det med at klikke på pfå vist det spray der hører til mappen.)

Anyways, du kan bruge følgende kode til at hive biblioteksnavnene ud af den komma streng.



jeg får et par fejl når jeg kompiler.
min kode er
{
ListBox1->Clear();
//Setting directory and retreiving data into variable
DListBox1->Directory = "E:\\\\Programering\\\\SprayChange\\\\Sprays";
String Directory = DListBox1->Items->CommaText;
char *Directories = Directory.c_str();

//Parsing data into Line and adding it to listbox

int Chars = StrLen(Directories), CurrentLine=0;
String Lines[100];
char CurrentChar = ' ';

for(int i=0; i<Chars;i++)
{
CurrentChar = *Directories;
if(CurrentChar == ',')
{if(CurrentLine < 100)
CurrentLine++;
}
else
Lines[CurrentLine] = Lines[CurrentLine] + CurrentChar;
}
for(int l=2; l<=CurrentLine; l++)
ListBox1->Items->Add(Lines[l]);
}

fik en fejl i CurrentChar = Directories;
can not convert char* to char
rettede det til
CurrentChar = *Directories; og undgik fejlen.

men det undre mig at min listbox er tom??
den henter 1 linje i den men det er en blank linje
du kan se hvordan jeg ønsker det færdige program på
http://harlem.dk under c/c++ :)
jeg ved godt jeg er træls til at spørge, men synes denne opgave bliver mere og mer langhåret :)




Det skal være "CurrentChar = Directories(BRACKET START)i(BRACKET END);

array klammerne blev tolket som italic tag. :)

Altså du traversere gennem dit array i for-løkken.

Sad lige og kiggede på dit screenshot, hvor jeg kan se, at man selv skal vælge sit hl bibliotek, hvorfor min afslutning (den var heller ikke særlig pæn)
for(int l=2; l<=CurrentLine; l++)
Listbox->Items->Add(Lines[l]);

så skal ændres. Jeg satte int l=2 for ikke at adde de 2 første linier c: og Program files

Der ska du nok lige ind og finpudse løkken, så den discarder drev osv.

Du kunne jo køre indtil du når Half-life biblioteket og så først begynde at adde til lines, derefter.
Derudover vil du se at når løkken først kører så forskyder den hvert item der bliver "addet" med 1 blanktegn. Ved ikke hvorfor men det ser ihvertfald ikke pænt ud. Plus at du stadig kan klikke på en linie og så skifter den til default bibliotek.. Tror du skal overveje et string grid. :)



[Redigeret d. 23/08-03 16:15:10 af Agge Kempff]

[Redigeret d. 23/08-03 16:16:39 af Agge Kempff]



t