Wczytywanie do Listboxa tylko ścieżki od wysokości programu

0

Cześć.
Mam mały problem gdyż plików mi przybywa i robi się to troszkę niebezpieczne przy przeniesieniu folderu gdyż mam do Listboxa dodawane ścieżki bezwzględne, z Listboxa zapisuje później plik konfiguracyjny.

Potrzebuje tak zrobić by dodawać do Listboxa tylko ścieżkę od wysokości programu w głąb,
Czyli np.:
\Picture\1.jpg
\Picture\2.jpg
\Picture\3.jpg
Ja już w tym folderze Pcture umieszczę oczywiście pliki.
Jest to w jakiś sposób w prostu sposób możliwe ?
Moja procedura wczytania:

 procedure TForm2.Button5Click(Sender: TObject);
 var
  i : integer;
begin
 if OpenPictureDialog1.Execute then
 begin
   for I := 0 to OpenPictureDialog1.Files.Count - 1 do
   begin
    ListBoxJPEG.Items.Add(OpenPictureDialog1.Files[i]);
   end;
end;
end;
0

Ścieżkę programu możesz pobrać wykorzystując funkcję: ExtractFilePath w ten sposób:

ExtractFilePath(Application.ExeName)

Następnie możesz użyć funkcji Delete aby usunąć ze stringa do którego przypiszesz: OpenPictureDialog1.Files[i] i załatwione

Może Ci się również przydać funkcja Pos lub Copy

2

@woolfik: nie ma po co wynajdywać koła od nowa - ExtractRelativePath

0

Pomożecie jeszcze troszkę. Proszę

ListBoxJPEG.Items.Add(ExtractRelativePath(OpenPictureDialog1.Files[i]));
 There is no overloaded version of 'ExtractRelativePath' that can be called with these arguments
0

Dlaczego zgadujesz jak się wykorzystuje tę funkcję, zamiast poczytać w dokumentacji?

0

Dlaczego bo jestem samoukiem i tu bez własnej pracy nic nie pomoże żaden kurs.
No ale dobra ale ort! poślady i mam. Ale tu już proszę bez krytyki :)

ListBoxJPEG.Items.Add(ExtractRelativePath(OpenPictureDialog1.Files[i], GetCurrentDir +'\'+ ExtractFileName(OpenPictureDialog1.Files[i])  ));

Jeśli jest tak

GetCurrentDir +'\'+ ExtractFileName..... nazwa pliku.jpg ( nie ma ścieżki picture\nazwa pliku.jpg
GetCurrentDir + ExtractFileName..... (..\picturenzawa pliku.jpg) zrozumiałe bo nie ma '\' ale tych dwóch kropek na początku nie może być)
+'Picture\'+ ExtractFileName..... działa tylko że ja nie chce tu foldera określać bo pliki mogą być też w podwolderze czyli picture\themes\nazwa pliku.jpg

Pomożecie to rozwikłać ?

0
ExtractRelativePath(extractfilepath(paramstr(0)),OpenPictureDialog1.Files[i])

@Patryk27: to jest to samo , wewnętrznie application.exename wygląda jak poniżej :

function TApplication.GetExeName: string;
begin
  Result := ParamStr(0);
end;
1

@grzegorz_so: prosty przykład, który bredzi pod WinXP - utwórz aplikację, która na ekranie wyświetli ParamStr(0) i zapisz ją np. bezpośrednio na C:\; Odpal ją bezpośrednio z dysku - zobaczysz prawidłową ścieżkę bezwzględną; Odpal teraz z dodatkowego paska adresu na pasku zadań - zobaczysz ścieżkę pulpitu, a dokładniej taką ścieżkę, jakby program znajdował się na pulpicie :]

Nie zawsze tak się dzieje, więc na pewno od czegoś to zależy; Jednak już wiele razy spotkałem się taką sytuacją, że odpalenie programu z tego dodatkowego paska powodowało, że ParamStr(0) zwracał zupełnie inną ścieżkę, więc jestem ostrożny;

Dlatego też używanie ParamStr(0) lub wrappera Application.ExeName jest ryzykowne; Dla instalowanych aplikacji jest bezpieczne rozwiązanie - do rejestru, np. do klucza:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My App Name

dodaje się wartość InstallLocation, w której to zapisuje się pełną, bezwzględną ścieżkę katalogu instalacji programu; Program przy rozruchu pobiera ciąg ścieżki z rejestru i przechowuje ją sobie do własnego użytku, aby zawsze móc odwoływać się do plików na podstawie ścieżek absolutnych; Dzięki temu nie ma mowy o tym, aby zaistniała pomyłka;

Aplikacje portable lub po prostu gołe pliki wykonywalne (jak np. emulatory do starych gier) najczęściej nie ingerują w rejestr i bazują na ParamStr(0), bo innej możliwości nie mają (albo ja takiej jeszcze nie poznałem);

Ale to tak na marginesie, coby nieco rozjaśnić temat.

0

Tak to działa super.

ListBoxJPEG.Items.Add(ExtractRelativePath(extractfilepath(paramstr(0)),OpenPictureDialog1.Files[i]));

Nie wiem tylko dlaczego klikając w programie na index listboxa chcąc w TImage wyświetlić obrazek wywala komunikat ze nie znalazł określonej ścieżki a nie znalazł dlatego bo w komunikacie podaje nadpisaną ścieżkę Picture Themes
C:Folder1\Folder2\Program\Picure\Themes\Picture\Themes\01.jpg

procedure TForm2.ListBoxJPEGClick(Sender: TObject);
  Image1.Picture.LoadFromFile(ListBoxJPEG.Items[ListBoxJPEG.ItemIndex]);

a i poszło w diabły malowanie Listboxa:
Ma tylko Być numerowany indeks i nazwa pliku z rozszerzeniem.

procedure TForm2.ListBoxJPEGDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
  Data: String;
begin
  self.ListBoxJPEG.canvas.FillRect(Rect);
  Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
  Data := inttostr(index + 1) + ' : ' + extractfilename(self.ListBoxJPEG.Items[index]);
  DrawText(self.ListBoxJPEG.canvas.Handle, Data, Length(Data), Rect, Flags);
end;

Da się coś jeszcze z tym wszystkim zrobić bo nie wiem gdzie tu są błedy

0

Pierwsze rozwiązane działa :)

Image1.Picture.LoadFromFile(extractfilename(ListBoxJPEG.Items[ListBoxJPEG.ItemIndex]));

Jeszcze tylko to nieszczęsne malowanie poniżej

procedure TForm2.ListBoxJPEGDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
  Data: String;
begin
  self.ListBoxJPEG.canvas.FillRect(Rect);
  Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
  Data := inttostr(index + 1) + ' : ' + extractfilename(self.ListBoxJPEG.Items[index]);
  DrawText(self.ListBoxJPEG.canvas.Handle, Data, Length(Data), Rect, Flags);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0