|
| 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
| |
|
|