/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Open-/Save-dialog problem, Builder 6
Fra : Ukendt


Dato : 22-05-04 16:54

Hej

Jeg er stødt på følgende problem: når jeg med en TOpenDialog og/eller
en TSaveDialog vælger en fil på et flytbart medie (læs: USB-stik), så
kan jeg ikke stoppe mediet således, at jeg kan fjerne det fra min PC.
Og det også selv om jeg ikke gør noget ned den valgte fil. Bare det at
dialogen har et handle til det eksterne medie er nok.

Hvis jeg vælger en fil på et andet drev - eller ligefrem lukker mit
program - så kan jeg uden problemer stoppe drevet og fjerne det.

Nu har forgæves forsøgt, at "snyde" systemet, så jeg konfigurerer
dialogen til, at pege på en anden fil. Altså det der skulle svare til,
at jeg valgte en fil på et andet drev. Men jeg kan ikke få det til at
fungere. :(

Jeg har både prøvet at cleare dialogens Files liste, samt FileName og
InitialDir properties, og at indsætte andre værdier. Men ingen af
delene er tilsyneladende helt ikke nok.

Hjælp. Tak. :)

Mvh, Claus
--
I never apologize! I'm sorry, but that's just the way I am.
- Homer Simpson

 
 
Mogens Hansen (22-05-2004)
Kommentar
Fra : Mogens Hansen


Dato : 22-05-04 19:24


<Claus Nielsen> wrote:


[8<8<8<]
> Jeg har både prøvet at cleare dialogens Files liste, samt FileName og
> InitialDir properties, og at indsætte andre værdier. Men ingen af
> delene er tilsyneladende helt ikke nok.

Den "almindelige" måde at bruge f.eks. TOpenDialog på er at placere sådan et
objekt på sin form.
Det betyder at hvis TOpenDialog objektet lever lige så længe som form
objektet - hvilket vil sige lige så længe som applikationen kører hvis det
er hovedformen, eller hvis den er automatisk oprettet.

Har du prøvet at oprette dialog objektet manuelt før du bruger det, og
nedlægge det igen når du er færdig ?
Jeg ville forvente at alle resourcer som dialog har frigives når dialogen
nedægges.

C++ Standard bibliotek klassen std::auto_ptr kan være nyttig i den
forbindelse (når nu VCL objekter ikke kan oprettes på stakken). Den
nedlægger automatisk dialog objektet, når funktionen forlades - uanset
hvordan.

<C++Builder kode>
//--------------------------------------------------------------------------
-

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <memory> // std::auto_ptr
//--------------------------------------------------------------------------
-
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------
-
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------
-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::auto_ptr<TOpenDialog> OpenDialog(new TOpenDialog(this));

if(OpenDialog->Execute()) {
// do whatever
}
}
//--------------------------------------------------------------------------
-
</C++Builder kode>

Venlig hilsen

Mogens Hansen



Ukendt (23-05-2004)
Kommentar
Fra : Ukendt


Dato : 23-05-04 19:05

On Sat, 22 May 2004 20:23:39 +0200, "Mogens Hansen"
<mogens_h@dk-online.dk> wrote:

>> Jeg har både prøvet at cleare dialogens Files liste, samt FileName og
>> InitialDir properties, og at indsætte andre værdier. Men ingen af
>> delene er tilsyneladende helt ikke nok.
>
>Har du prøvet at oprette dialog objektet manuelt før du bruger det, og
>nedlægge det igen når du er færdig ?
>Jeg ville forvente at alle resourcer som dialog har frigives når dialogen
>nedægges.

Ja det skulle man tro, men det er desværre ikke tilfældet.
Et-eller-andet har stadig et aktivt handle til det drev, hvor man
valgte filen fra, således at det ikke kan stoppes/fjernes.

Og det altså også uanset at man ovehovedet ikke gør noget, med den fil
man vælger. Men man skal vælge en fil. Det er for eksempel ikke nok
kun, at markere en fil på drevet, og så annullere open-dialogen.

Men straks man vælger en fil på et andet drev, så kan man uden
problemer stoppe/fjerne drevet.

Mvh, Claus
--
I never apologize! I'm sorry, but that's just the way I am.
- Homer Simpson

Mogens Hansen (23-05-2004)
Kommentar
Fra : Mogens Hansen


Dato : 23-05-04 21:27


<Claus Nielsen> wrote:

[8<8<8<]
> Ja det skulle man tro, men det er desværre ikke tilfældet.
> Et-eller-andet har stadig et aktivt handle til det drev, hvor man
> valgte filen fra, således at det ikke kan stoppes/fjernes.

Current work directory bliver ændret, når man har valgt noget med dialogen.
Måske er det det der holder fat i drevet.

Hvis det er tilfældet kunne løsningen være at gemme current work directory
inden dialogen åbnes, og stille det tilbage når man er færdig. Igen kan et
constructor/destructor forløb hjælpe dig.

<C++Builder kode>
//--------------------------------------------------------------------------
-

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <memory> // std::auto_ptr
#include <dir.h> // getcwd, chdir
//--------------------------------------------------------------------------
-
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------
-
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------
-

namespace
{ // start of unnamed namespace

class KeepCurrentWorkDir
{
public:
KeepCurrentWorkDir()
{ ::getcwd(workDir, sizeof(workDir)); }
~KeepCurrentWorkDir()
{ ::chdir(workDir); }

private:
char workDir[MAXDIR];
};

} // end of unnamed namespace

void __fastcall TForm1::Button1Click(TObject *Sender)
{
KeepCurrentWorkDir kcwd;
std::auto_ptr<TOpenDialog> openDialog(new TOpenDialog(this));
if(openDialog->Execute()) {
// do whatever
}
}
//--------------------------------------------------------------------------
-
</C++Builder kode>

Venlig hilsen

Mogens Hansen



Ukendt (24-05-2004)
Kommentar
Fra : Ukendt


Dato : 24-05-04 18:43

On Sun, 23 May 2004 22:26:45 +0200, "Mogens Hansen"
<mogens_h@dk-online.dk> wrote:

>> Et-eller-andet har stadig et aktivt handle til det drev, hvor man
>> valgte filen fra, således at det ikke kan stoppes/fjernes.
>
>Current work directory bliver ændret, når man har valgt noget med dialogen.
>Måske er det det der holder fat i drevet.

Og det var lige præcis det der var problemet! Current directory. Det
havde jeg overhovedet ikke spekuleret på. Straks jeg ændrede current
dir, så kunne jeg jeg stoppe/fjerne det flytbare drev. Og jeg behøvede
ikke gøre noget som helst med hensyn til Open-dialogen. At ændre
current dir var nok. Tusind tak for hjælpen!

Mvh, Claus
--
I never apologize! I'm sorry, but that's just the way I am.
- Homer Simpson

Mogens Hansen (24-05-2004)
Kommentar
Fra : Mogens Hansen


Dato : 24-05-04 14:47


"Mogens Hansen" <mogens_h@dk-online.dk> wrote:

[8<8<8<]
> Current work directory bliver ændret, når man har valgt noget med
dialogen.
> Måske er det det der holder fat i drevet.

TOpenDialog har en option, der gør at current work directory ikke ændres:
ofNoChangeDir
Den kan sættes i property inspectoren, når Option foldes ud eller
programmatisk ved
openDialog->Options += TOpenOptions() << ofNoChangeDir;

Det er nemmere end at lave en klasse der sætter directory tilbare

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste