CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

dział ogólny

OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Bishamoth » poniedziałek, 5 kwietnia 2010, 14:02

Witam
Pytanie powinno byc bardzo proste:

Kod: Zaznacz cały
void __fastcall TForm1::OpenDialog1SelectionChange(TObject *Sender)
{
AnsiString Dir;
AnsiString File;
File=OpenDialog1->FileName;
Dir=OpenDialog1->GetNamePath();
Label1->Caption=File;
Label2->Caption=Dir;
}


Wedlug tego kodu, zaraz po odpaleniu OpenDialog i zaznaczeniu jakiegokolwiek pliku, w Label1 powinna sie pojawic nazwa zaznaczonego pliku, a w Label2 Sciezka do zaznaczonego pliku. Jest jednak inaczej; w Label1 pojawia sie cala sciezka do pliku, a w Label2 widnieje napis OpenDialog1. Czy ktos moze mi wytlumaczec, czemu to dziala w ten sposob, i jak to zrobic aby wszystko bylo na swoim miejscu?

System: Windows XP Professional SP3
Kompilator: BCB v6 Enterprise
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows XPChrome

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Cyfrowy Baron » poniedziałek, 5 kwietnia 2010, 14:52

Jest jednak inaczej; w Label1 pojawia sie cala sciezka do pliku,


OpenDialog->FileName zawsze zwraca pełną ścieżkę dostępu do pliku wraz z nazwą pliku.

GetNamePath występuje niemal we wszystkich komponentach i zawsze zwraca nazwę obiektu, nigdy nie zwraca nazwy katalogu. To co chcesz zrobić, czyli wyświetlić tylko nazwę zaznaczonego pliku oraz nazwę katalogu należy zrobić tak:

Kod: Zaznacz cały

void __fastcall TForm1
::OpenDialog1SelectionChange(TObject *Sender)
{
 
 int attrib 
= FileGetAttr(OpenDialog1->FileName);
 String nameFD = ExtractFileName(OpenDialog1->FileName);
                           
  if
(attrib & faDirectory)
  {
   if(!nameFD.IsEmpty())
   { 
    Label2
->Caption = nameFD;
    Label1->Caption = ExtractFileDrive(OpenDialog1->FileName) + "\\";
   }
   else
   
{
    Label2->Caption = ExtractFileDrive(OpenDialog1->FileName) + "\\";
    Label1->Caption = "";
   }
  }
  else
  
{
   Label2->Caption = ExtractFilePath(OpenDialog1->FileName);
   Label1->Caption = nameFD;
  }
}
 




Przypuszczam, że wiesz, iż z OpenDialog korzysta się w taki sposób:

Kod: Zaznacz cały

void __fastcall TForm1
::Button1Click(TObject *Sender)
{
 
String fileName;
 if(
OpenDialog1->Execute())
 {
   
fileName OpenDialog1->FileName;
 }
}
 




System: Windows XP Professional SP3
Kompilator: BCB v6 Enterprise


Te dane wprowadź do swojego profilu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Bishamoth
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Bishamoth » wtorek, 6 kwietnia 2010, 00:20

Dziekuje za wytlumaczenie :) Wszystko dziala.
Dane juz wpisalem do profilu.
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows XPChrome

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez moderasura » piątek, 24 czerwca 2011, 19:18

Nie wiem czy to pasuje do tego tematu ale głowy nikt nie urwie chyba ;)

Wyczytałem w artykule Barona (Umieszczanie programu w programie, czyli coś w rodzaju instalatora.) i tam jest podany na sztywno zapis do wybranego dysku i nazwa pliku.Jest jakaś mozliwość zapisywania w inny sposób? Przykład Barona
Kod: Zaznacz cały
ExtractExe(ID_APPL, "C:\\Wypakowane.exe");
jak to się zapisuje za pomocą wyżej przedstawionego kodu?
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Cyfrowy Baron » sobota, 25 czerwca 2011, 09:43

moderasura napisał(a):Jest jakaś mozliwość zapisywania w inny sposób?


Czego w inny sposób? Chodzi o ścieżkę do wypakowania pliku?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez moderasura » sobota, 25 czerwca 2011, 10:16

Chodzi mi o to by wypakować plik z zasobów do podanej ścieżki. np. mam przycisk pobieram ścieżkę do pliku exe w pole Edit1 i chciał bym wypakować tam dany plik włącznie z podfolderami itp ...Nie w tym miejscu gdzie znajduje sie program z zasobami tylko do tego wybranego przez użytkownika nie wiem czy wyraziłem sie jasno ;)
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Cyfrowy Baron » sobota, 25 czerwca 2011, 10:39

Takie pytania mnie załamują! :evil:

Funkcja ExtractExe oczekuje dwóch argumentów, pierwszy to identyfikator zasobu, a drugi to nazwa pliku pod którą zostanie zapisany wypakowywany zasób. Jeżeli podajesz tylko nazwę pliku to wypakowywany zasób zostanie zapisany w katalogu z program, jeżeli podasz pełną ścieżkę to zasób zostanie wypakowany do tej ścieżki. W przykładzie, który podałeś zasób jest wypakowywany bezpośrednio na dysk C:, gdyż taka lokalizacja została tam określona "C:\\Wypakowane.exe". Jeżeli chesz dać użytkownikowi możliwość określania lokalizacji to posłuż się komponentem TOpenDialog:

KOD cpp:     UKRYJ  
if( OpenDialog1->Execute() )
{
  ExtractExe(ID_APPL, OpenDialog1->FileName);
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez moderasura » sobota, 25 czerwca 2011, 14:41

Dzięki za wskazówkę
Można jeszcze tak zapisać z folderami i podfolderami może komuś sie przyda

Kod: Zaznacz cały
void __fastcall TForm2::Button1Click(TObject *Sender)
{
AnsiString sciezka = ExtractFilePath(OpenDialog1->FileName);

ForceDirectories(sciezka+"\\folder\\folder2");

ExtractExe(ID_APPL1, sciezka + "\\folder\\folder2\\plik.dat");

}
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: OpenDialog -bledne pobieranie sciezki oraz nazwy pliku

Nowy postprzez Cyfrowy Baron » sobota, 25 czerwca 2011, 15:23

moderasura napisał(a):Można jeszcze tak zapisać z folderami i podfolderami może komuś sie przyda


Tak jak zapisałeś nie jest dobrze. Okno OpenDialog wywołuje się funkcją Execute, a FileName nie zawiera nazwy katalogu lecz ścieżkę dostępu do pliku, więc nie można tworzyć folderu poprzez dodanie do FileName kolejnych ścieżek, gdyż np.

FileName = c:\nazwapliku.exe

gdy dodasz: sciezka+"\\folder\\folder2 otrzymasz:

c:\nazwapliku.exe\folder\folder2

Poza tym pomyliłem się w swoim ostatnim poście i do wypakowania pliku należy posłużyć się nie OpenDialog lecz SaveDialog, czyli:

KOD cpp:     UKRYJ  
if( SaveDialog1->Execute() )
{
  ExtractExe(ID_APPL, SaveDialog1->FileName);
}


Zauważ, że po wywołaniu okna SaveDialog można w nim tworzyć nowe katalogi, więc takie sztuczne definiowanie katalogu nie ma sensu, chyba że chcesz wymusić w podanej lokalizacji utworzenie kolejnych katalogów. W takiej sytuacji należy posłużyć się oknem do wybierania katalogów a nie plików:

KOD cpp:     UKRYJ  
#include "FileCtrl.hpp"


void __fastcall TForm2::Button1Click(TObject *Sender)
{
 String Dir; /* można nadać ścieżkę początkową, np: String Dir = "c:\\program files"; */

 if( SelectDirectory( Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, NULL ) )
 {
   if( ForceDirectories( Dir + "\\folder\\folder2" ) )
   {
     ExtractExt( ID_APPL1, Dir + "\\folder\\folder2\\plik.dat");
  }
  else
  {
    Application->MessageBox( ("Nie udało się utworzyć podkatalogu w katalogu '" + Dir + "'.").c_str(), "Błąd tworzenie podkatalogu", MB_OK | MB_ICONSTOP);
    return;
  }
 }  
}


Dopiero tak jest poprawnie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron