Pfad für Bilder

Für Fragen von Einsteigern und Programmieranfängern...
Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Pfad für Bilder

Beitrag von Andy Nightingale »

Hallo Leute,
ich möchte gerne das im Programmodner Image das Programm die Bilder läd und nicht das die Bilder einfach neben dem Programm liegen. Wie geht das denn? Danke im voraus.
Grüße

procedure TForm1.Button1Click(Sender: TObject);
var Zahl: Integer;
begin
Randomize;
Zahl:= Random(6) + 1;
// if Zahl = 1 then Image1.Picture.LoadFromFile('1.png');
// if Zahl = 2 then Image1.Picture.LoadFromFile('2.png');
// if Zahl = 3 then Image1.Picture.LoadFromFile('3.png');
// if Zahl = 4 then Image1.Picture.LoadFromFile('4.png');
// if Zahl = 5 then Image1.Picture.LoadFromFile('5.png');
// if Zahl = 6 then Image1.Picture.LoadFromFile('6.png');
case Zahl of
1: Image1.Picture.LoadFromFile('1.png'); Diese hier :D
2: Image1.Picture.LoadFromFile('2.png');
3: Image1.Picture.LoadFromFile('3.png');
4: Image1.Picture.LoadFromFile('4.png');
5: Image1.Picture.LoadFromFile('5.png');
6: Image1.Picture.LoadFromFile('6.png');
end;
end;

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Pfad für Bilder

Beitrag von Zvoni »

Ungetestet (Aus dem linken Ärmel zwischen Kaffee holen und am rechten Ohr kratzen)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Zahl: Integer;
begin
Randomize;
Zahl:= Random(6) + 1;
Image1.Picture.LoadFromFile(GetCurrentDir+DirectorySeparator+'Image'+DirectorySeparator+IntToStr(Zahl)+'.png');
end;
end;
Ich kann es mir nie merken, ob GetCurrentDir mit oder ohne abschliessenden DirectorySeparator kommt.

Wobei ich mit GetCurrentDir zu arbeiten "gefährlich" finde, da man bekanntlich das "Working Directory" verändern kann.

Application.Location vielleicht?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 359
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Pfad für Bilder

Beitrag von Jorg3000 »

Hi!
Ich habe GetCurrentDir() immer vermieden, weil sich meines Wissens das aktive Arbeitsverzeichnis zur Laufzeit ändern kann.
Stattdessen nutze ich seit jeher ...

Code: Alles auswählen

PgmPath := ExtractFilePath(ParamStr(0));

ImagePath := PgmPath + 'Image' + DirectorySeparator;

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Pfad für Bilder

Beitrag von fliegermichl »

Jorg3000 hat geschrieben: Mo 20. Jan 2025, 16:06

Code: Alles auswählen

PgmPath := ExtractFilePath(ParamStr(0));
Das ist exakt das, was Application.Location liefert.

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Pfad für Bilder

Beitrag von theo »

Bei mir auf Linux geht auch der relative Pfad:

Code: Alles auswählen

  Image1.Picture.LoadFromFile('test/laz.png');    

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Pfad für Bilder

Beitrag von af0815 »

so nebenbei, man sollte sich an die Vorgaben des BS halten, wenn man Dateien im System ablegt. Weil im Programmordner ablegen war noch nie eine gute Idee. Dafür gibt es eigene Bereiche, Nur so als Hinweis.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

icho2099
Beiträge: 47
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Re: Pfad für Bilder

Beitrag von icho2099 »

...und mit
path := IncludeTrailingPathDelimiter(path) ;

macht man auch nichts falsch und muss sich nicht merken ob da denn nun schon ein
Delimiter hinter dran steht oder nicht.

Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Pfad für Bilder

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Mo 20. Jan 2025, 15:40 Ungetestet (Aus dem linken Ärmel zwischen Kaffee holen und am rechten Ohr kratzen)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Zahl: Integer;
begin
Randomize;
Zahl:= Random(6) + 1;
Image1.Picture.LoadFromFile(GetCurrentDir+DirectorySeparator+'Image'+DirectorySeparator+IntToStr(Zahl)+'.png');
end;
end;
Ich kann es mir nie merken, ob GetCurrentDir mit oder ohne abschliessenden DirectorySeparator kommt.

Wobei ich mit GetCurrentDir zu arbeiten "gefährlich" finde, da man bekanntlich das "Working Directory" verändern kann.

Application.Location vielleicht?
Hallole,
ich habs nun so gemacht:
procedure TForm1.Button1Click(Sender: TObject);
var Zahl: Integer;
begin
Randomize;
Zahl:= Random(6) + 1;

Image1.Picture.LoadFromFile(Application.Location+DirectorySeparator+'Image'+DirectorySeparator+IntToStr(Zahl)+'.png');
end;

Es funktioniert....ist es so richtig? Grüße und Danke an alle

Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Pfad für Bilder

Beitrag von Andy Nightingale »

Mist zu früh gefreut....findet die Bilder nicht. Habe das Programm neu geladen und es ging nicht. :roll:

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Pfad für Bilder

Beitrag von fliegermichl »

theo hat geschrieben: Mo 20. Jan 2025, 16:26 Bei mir auf Linux geht auch der relative Pfad:

Code: Alles auswählen

  Image1.Picture.LoadFromFile('test/laz.png');    
Normalerweise stimmt das. Aber unter Windows kann man bei einem Anwendungslink ein Arbeitsverzeichnis angeben. Dieses ist dann das aktuelle Verzeichnis beim Programmstart.
Wenn das Programm mit

Code: Alles auswählen

chdir('/tmp');
dieses Arbeitsverzeichnis dann aber geändert haben sollte, dann bezieht sich der relative Pfad auf dieses.

Von dem her ist es mMn. am sinnvollsten, GetAppConfigDir oder so etwas zu verwenden.

wennerer
Beiträge: 607
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Pfad für Bilder

Beitrag von wennerer »

Hallo Andy,
ich denk Application.Location endet mit einem Seperator, somit hast du einen zuviel.

Code: Alles auswählen

Image1.Picture.LoadFromFile(Application.Location          +DirectorySeparator             + 'Image'+DirectorySeparator+IntToStr(Zahl)+'.png');
Schau mal in mein kleines Projekt das bei mir läuft.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(140.38 KiB) 40-mal heruntergeladen

Mathias
Beiträge: 6900
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pfad für Bilder

Beitrag von Mathias »

An pfad wo sich dein Programm befindet komm man am einfachsten so ran:

Code: Alles auswählen

  Caption := ExtractFilePath(ParamStr(0));
Der Rest sollte selbst lösbar sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Bullykiffer
Beiträge: 17
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

Re: Pfad für Bilder

Beitrag von Bullykiffer »

Moin...

Hier sind ja schom viele gute Hinweise gegeben worden.
Ich schätze einmal,du möchtest so etwas wie "Picture of the Day" für dein Programm programmieren?
Randomize; sollte nur einmal ausgeführt werden,persönlch rufe ich diese Funktion im TForm.Create Ereignis einmal auf,dann nie mehr wieder.

Dein System mit Integer+'.png' erscheint im ersten Moment eine gute Idee. Im 2. Moment ist die Idee dann doch nicht mehr so genial.
Die Erfahrung habe ich auch schon gesammelt.
Dumm ist es wenn es plötzlich kein PNG mehr ist,sondern ein BMP oder JPG und noch dümmer ist,wenn genau der Integer Wert fehlt,den du vielleicht per Zufall ausgewählt hast.
Und glaub mir,wenn du regelmäßig mal Dateien in den Bilderordner kopierst um mehr Bilder zu haben,wird es nervig die Dateien vorher immer per Hand umbenennen zu müssen.

Wie gesagt,da war ich schon einmal und musste feststellen das die Idee dann doch nicht so prall war.

Stattdesen habe ich es dann so gelöst,das der "Bilderordner" nach allen Dateien durchsucht wird und von diesen dann genau einer per Zufall genommen wird.
Das hat den Vorteil,das du nicht auf PNG beschränkt bist und der Dateiname keine Rolle spielt.

Code: Alles auswählen

procedure Tform1.PicOfDay;
var i: integer;
    LPfad : String;
    LStrList : TStringlist;
    LSearchRec: TSearchRec;
begin
 //Hier jetzt eine Dateiliste des Bilderordners erstellen
 LPfad :=ExtractFilePath(ParamStr(0))+'Pictures\' ; //Ordnerpfad gegebenfalls auf eigene Bedürfnisse anpassen,
 LStrList := TStringlist.Create;
 if FindFirst(LPfad + '*.*', faAnyFile, LSearchRec) = 0 then
  begin
   repeat
    if LSearchRec.Attr and faDirectory = 0 then
     begin
       LStrList.add(LSearchRec.Name);
     end;
   until FindNext(LSearchRec) <> 0;
   FindClose(LSearchRec);
  end;

 //Hier Bild des Tages anzeigen
 i:=Random(LStrList.Count-1);
 image2.Visible:=false;
 image2.Picture.Clear;
 try
  image2.Picture.LoadFromFile(LPfad+LStrList[i]);
  image2.Visible:=true;
 except
  //Hier jetzt ein "Ersatzbild" laden oder wie derzeit einfach nichts machen
  image2.Visible:=false;
 end;
 image2.visible:=true;
 LStrList.Free;
end;
Wie gesagt,ist alles trotzdem recht einfach gehalten,man könnte noch mit FileExists arbeiten,wenn man den möchte. Ist auch nur zur Veranschaulichung.
Hat zumindest bei mir damals seinen Zweck erfüllt ;)

Cya de Helge

Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Pfad für Bilder

Beitrag von Andy Nightingale »

wennerer hat geschrieben: Mo 20. Jan 2025, 20:04 Hallo Andy,
ich denk Application.Location endet mit einem Seperator, somit hast du einen zuviel.

Code: Alles auswählen

Image1.Picture.LoadFromFile(Application.Location          +DirectorySeparator             + 'Image'+DirectorySeparator+IntToStr(Zahl)+'.png');
Schau mal in mein kleines Projekt das bei mir läuft.

Viele Grüße
Bernd
Hallo Bernd,
super das läuft. Danke dir für die Mühe...echt cool. Grüße

Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Pfad für Bilder

Beitrag von Andy Nightingale »

Bullykiffer hat geschrieben: Di 21. Jan 2025, 02:20 Moin...

Hier sind ja schom viele gute Hinweise gegeben worden.
Ich schätze einmal,du möchtest so etwas wie "Picture of the Day" für dein Programm programmieren?
Randomize; sollte nur einmal ausgeführt werden,persönlch rufe ich diese Funktion im TForm.Create Ereignis einmal auf,dann nie mehr wieder.

Dein System mit Integer+'.png' erscheint im ersten Moment eine gute Idee. Im 2. Moment ist die Idee dann doch nicht mehr so genial.
Die Erfahrung habe ich auch schon gesammelt.
Dumm ist es wenn es plötzlich kein PNG mehr ist,sondern ein BMP oder JPG und noch dümmer ist,wenn genau der Integer Wert fehlt,den du vielleicht per Zufall ausgewählt hast.
Und glaub mir,wenn du regelmäßig mal Dateien in den Bilderordner kopierst um mehr Bilder zu haben,wird es nervig die Dateien vorher immer per Hand umbenennen zu müssen.

Wie gesagt,da war ich schon einmal und musste feststellen das die Idee dann doch nicht so prall war.

Stattdesen habe ich es dann so gelöst,das der "Bilderordner" nach allen Dateien durchsucht wird und von diesen dann genau einer per Zufall genommen wird.
Das hat den Vorteil,das du nicht auf PNG beschränkt bist und der Dateiname keine Rolle spielt.

Code: Alles auswählen

procedure Tform1.PicOfDay;
var i: integer;
    LPfad : String;
    LStrList : TStringlist;
    LSearchRec: TSearchRec;
begin
 //Hier jetzt eine Dateiliste des Bilderordners erstellen
 LPfad :=ExtractFilePath(ParamStr(0))+'Pictures\' ; //Ordnerpfad gegebenfalls auf eigene Bedürfnisse anpassen,
 LStrList := TStringlist.Create;
 if FindFirst(LPfad + '*.*', faAnyFile, LSearchRec) = 0 then
  begin
   repeat
    if LSearchRec.Attr and faDirectory = 0 then
     begin
       LStrList.add(LSearchRec.Name);
     end;
   until FindNext(LSearchRec) <> 0;
   FindClose(LSearchRec);
  end;

 //Hier Bild des Tages anzeigen
 i:=Random(LStrList.Count-1);
 image2.Visible:=false;
 image2.Picture.Clear;
 try
  image2.Picture.LoadFromFile(LPfad+LStrList[i]);
  image2.Visible:=true;
 except
  //Hier jetzt ein "Ersatzbild" laden oder wie derzeit einfach nichts machen
  image2.Visible:=false;
 end;
 image2.visible:=true;
 LStrList.Free;
end;
Wie gesagt,ist alles trotzdem recht einfach gehalten,man könnte noch mit FileExists arbeiten,wenn man den möchte. Ist auch nur zur Veranschaulichung.
Hat zumindest bei mir damals seinen Zweck erfüllt ;)

Cya de Helge
Moin Helge, wow das ist aber viel Code...bin noch Anfänger, aber ich werde das testen. Die Gedanken sind super.- Danke seh für die Unterstützung.

Antworten