Resourcen ermitteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
greye
Beiträge: 50
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Resourcen ermitteln

Beitrag von greye »

Hallo zusammen,

ich stehe gerade auf dem Schlauch. Nehmen wir an, ich habe ein Projekt, in das ich mehrere Bilder als Ressourcen einbette (Project Options | Resources). Jetzt weiß ich zwar, wieviele Ressourcen unter welchem Bezeichner ich da einfüge und kann die entsprechend adressieren, aber ich würde da gerne flexibler werden. Sprich: Wenn ich zwei Bilder einbette, dann sollen die zwei Bilder im Wechsel gezeigt werden, bette ich zehn ein, dann eben diese zehn.

Lange Rede, kurzer Sinn: Kann ich irgendwie eine Liste der im Kompilat enthaltenen Ressourcen bekommen? Über EnumResourceNames bin ich gestolpert, verstehe es aber nicht. Dem Namen nach ist es das, was ich will, aber ich kapiere nicht, was ich mit der Rückgabe eines LongBool anfangen soll. Kann mich da jemand erleuchten?

Btw.: Was zum Geier ist ein LongBool? Ich dachte, ein Bool ist entweder False oder True. Wieso sollte das Long sein? Wozu ist das und die anderen wie WordBool gut?

Ihr merkt, ich habe keinen Plan. Das letzte Mal "so richtig" hatte ich mit Pascal zu tun, als das Turbo Pascal hieß und unter DOS lief. Delphi habe ich mir mal angeschaut, fand das ganz nett, aber zu windowslastig. Kylix war leider eine Totgeburt, die ziemlich teuer war, dafür, daß es sich unter den damals aktuellen Linux-Distris kaum installieren, geschweige denn benutzen ließ, weil es derart vermurkst war.

Dafür habe ich jetzt einen riesigen Spaß mit FPC und Lazarus und lerne gerade unglaublich viel in kurzer Zeit, auch dank des Forums hier.

42m

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

Re: Resourcen ermitteln

Beitrag von fliegermichl »

Das ist eine API Funktion von Windows.
Diese möchte als ersten Parameter die ID des Moduls, als zweiten den Typ der Resource, als drittes die Adresse einer sogenannten Callback Procedur.
LongBool bedeutet lediglich, daß Windows da einen 32 Bit langen Booleantyp erwartet. Da steht genau wie bei Boolean tatsächlich auch nur 0 oder 1 drin.
Hier ein Beispiel zur Verwendung.
Geht davon aus, daß in dem Formular ein TMemo und ein TButton ist.
In der uses Liste muß windows enthalten sein.

Code: Alles auswählen

// Wird für jede Resource mit dem angegebenen Typ aufgerufen
function RCallBack(Instance: QWord; ResTyp, Name : PAnsiChar; bla : Int64) : longbool; StdCall;
begin
  Form1.Memo1.Lines.Add(Name);
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (not (EnumResourceNames(hInstance, RT_BITMAP, @RCallBack, 0))) then
    ShowMessage('nicht gut, Problem:  ' + SysErrorMessage(GetLastError));
end;
Übrigens, bei Google EnumResourceNames liefert direkt im ersten Ergebnis eine Doku von MS darüber.

Benutzeravatar
greye
Beiträge: 50
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Re: Resourcen ermitteln

Beitrag von greye »

fliegermichl hat geschrieben: So 16. Feb 2025, 14:46 Das ist eine API Funktion von Windows.

[…]

Übrigens, bei Google EnumResourceNames liefert direkt im ersten Ergebnis eine Doku von MS darüber.
Danke für die Antwort. Möglicherweise bin ich sogar über die MS-Doku gestolpert und habe sie verworfen. Sorry, im Moment habe ich keine Ahnung, ich habe viele Links angeklickt und kaum geschlafen …

Schön wäre, wenn es zumindest auch unter Linux funktioniert. Auch wenn diese ganze Resources-Sache von Windows zu kommen scheint, in ein Linux-Kompilat kann ich sie einbinden und da auch abrufen, also ist das nicht ganz so windowsspezifisch und es sollte doch auch irgendwie möglich sein, sich anzuschauen, welche Resources da mit in der Executable stecken.

Was ich gefunden habe ist ein Weg, das mit externen Resourcefiles zu machen, wie hier: https://forum.lazarus.freepascal.org/in ... ic=51037.0

Allerdings will ich die Dinger ja gerade nicht extern haben sondern mit ins Kompilat packen. Nicht, weil ich es müsste, sondern weil ich wissen will, ob und wenn, wie das geht. Wie geschrieben, ich übe und lerne gerade :D

42m

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

Re: Resourcen ermitteln

Beitrag von fliegermichl »

Es geht auch unter Linux.
Binde statt windows LCLType und LCLProc ein. Statt GetLastError kannst du GetLastOSError verwenden.

Benutzeravatar
greye
Beiträge: 50
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Re: Resourcen ermitteln

Beitrag von greye »

fliegermichl hat geschrieben: So 16. Feb 2025, 15:43 Es geht auch unter Linux.
Binde statt windows LCLType und LCLProc ein. Statt GetLastError kannst du GetLastOSError verwenden.
Super, vielen Dank.

Ich werde jetzt erst mal eine Stunde schlafen, dann meinen familiären Verpflichtungen nachkommen und wenn ich dann irgendwann wirklich wach bin, probiere ich es aus.

42m

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

Re: Resourcen ermitteln

Beitrag von Mathias »

Btw.: Was zum Geier ist ein LongBool? Ich dachte, ein Bool ist entweder False oder True. Wieso sollte das Long sein? Wozu ist das und die anderen wie WordBool gut?
Da täuscht du dich. Booleans gibt es recht viele. Mit denen wird man spätestens eine Bekanntmachung habe, wen man C-libs einbindet. Die können verschiedene Bitbreiten haben, wie Boolean8-Boolean64. In C läuft es hier recht chaotisch ab. Vielfach wird einfach ein Integer mit mit 0 oder 1 gebraucht. Da ist keine Garantie da, das ein "not False" ein "True" ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 609
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: Resourcen ermitteln

Beitrag von wennerer »

Hallo greye,
im Anhang eine kleine Spielerei. Eventuell kannst du es brauchen.

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

wennerer
Beiträge: 609
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: Resourcen ermitteln

Beitrag von wennerer »

Im angehängten Projekt ist noch ein weiterer Weg drin.

Viele Grüße
Bernd
Dateianhänge
Example2.zip
(163.53 KiB) 75-mal heruntergeladen

wennerer
Beiträge: 609
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: Resourcen ermitteln

Beitrag von wennerer »

Hallo,
mir ist da noch ein Beitrag von wp_xyz eingefallen.
viewtopic.php?p=126490#p126490

Damit lässt sich der Name der Resourcen auslesen. Ich habe damit mal noch ein kleines Projekt gemacht.
Ist vielleicht ganz interessant.

Viele Grüße
Bernd
Dateianhänge
ResLesen.zip
(163.93 KiB) 57-mal heruntergeladen

Benutzeravatar
greye
Beiträge: 50
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Re: Resourcen ermitteln

Beitrag von greye »

wennerer hat geschrieben: Mo 17. Feb 2025, 19:59 Damit lässt sich der Name der Resourcen auslesen. Ich habe damit mal noch ein kleines Projekt gemacht.
Ist vielleicht ganz interessant.
Vielen Dank für das Projekt, allerdings verstehe ich das noch nicht wirklich.

Wenn ich Dein Projekt nehme und eine selbsterstellte images.res verwende, dann wird das Kompilat um die Größe der .res-Datei größer, sie wird also wohl einkompiliert. Starte ich, werden mir auch die enthaltenen Bilder aufgelistet und angezeigt. Soweit so gut, aber wenn ich den Zugriff auf die .res-Datei verhindere (löschen, Kompilat verschieben), dann bekomme ich die Fehlermeldung
Unable to open file "images.res": No such file or directory.
Wenn ich den Code und das Verhalten des Programms richtig verstehe, dann werden die Resources zwar aus dem Kompilat geladen, durchgezählt und benannt werden sie aber mit Hilfe der .res-Datei. Denn wenn ich die Direktive {$R images.res} weglasse, wird das Programm wieder um die Größe der .res kleiner, listet mir trotzdem sauber die Ressourcen auf, es knallt aber beim Versuch, die Bilder anzeigen zu lassen - klar, die fehlen ja auch im Kompilat.

Das ist zwar alles ganz spannend, aber für mein Verständnis nur bedingt hilfreich. Wenn ich die Ressourcen doppelt vorhalten muss, einmal im Binary und einmal in der .res-Datei, ist das nicht wirklich zielführend. Ich will sie ja gerade in der Binary haben, damit alles an einem Platz ist und ich nur eine Datei kopieren muss. Allerdings habe ich so langsam den Eindruck, daß der Fall, daß man "unbekannte" Resources verwenden möchte, gar nicht bedacht wurde. Eigentlich auch verständlich, denn bei der Erstellung weiß man ja (hoffentlich), was man da einbaut und später ändert sich das im Kompilat nicht mehr.

Hmm, irgendwie stehe ich da immer noch auf dem Schlauch …

42m

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Resourcen ermitteln

Beitrag von Niesi »

greye hat geschrieben: So 16. Feb 2025, 14:15
...

Wenn ich zwei Bilder einbette, dann sollen die zwei Bilder im Wechsel gezeigt werden, bette ich zehn ein, dann eben diese zehn.

...

42m
Dann mach das doch.
Denn: Du musst doch sowieso jedesmal neu kompilieren, wenn Du die Anzahl der Bilder änderst ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

wennerer
Beiträge: 609
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: Resourcen ermitteln

Beitrag von wennerer »

Hallo greye,
hast du Mal über eine ImageList nachgedacht? Was spricht dagegen?
Viele Grüße
Bernd

Antworten