Ressourcen Datei *.RES aufbauen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Winni
Beiträge: 980
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Ressourcen Datei *.RES aufbauen

Beitrag von Winni »

Hi!

Bei Lazarus gibt es inzwischen auch den einfachen Weg für Ressourcen:

Projekteinstellungen --> Ressourcen --> Hinzufügen

Der Rest geht automatisch.
Außer ntürlich dem Laden von Ressourcen.

Winni

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Ressourcen Datei *.RES aufbauen

Beitrag von wp_xyz »

Es geht hier um Packages, und im Package-Editor steht dieser Weg nicht zur Verfügung.

Benutzeravatar
kupferstecher
Beiträge: 319
Registriert: Do 17. Nov 2016, 11:52

Re: Ressourcen Datei *.RES aufbauen

Beitrag von kupferstecher »

@TE: Hast du mal die .lrs-Variante probiert?

Folgendes funktioniert bei mir, habst grad auch in einer Komponente getestet.

Code: Alles auswählen

//TPicture
fPicture.LoadFromLazarusResource('TollesBild'); //TollesBild.png
//TImage
Image1.Picture.LoadFromLazarusResource('TollesBild'); //TollesBild.png

INITIALIZATION
   {$I bildle.lrs}

Benutzeravatar
Winni
Beiträge: 980
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Ressourcen Datei *.RES aufbauen

Beitrag von Winni »

Hi!

lrs Ressourcen waren immer unproblematischer als res

Sie gelten allerdings seit diversen Versionen als überholt.
Funktionieren aber imer noch einwandfrei.

Winni

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

Re: Ressourcen Datei *.RES aufbauen

Beitrag von af0815 »

Winni hat geschrieben:
Mo 15. Nov 2021, 08:56
Sie gelten allerdings seit diversen Versionen als überholt.
Als überholt oder definitiv als 'deprecated' gesetzt ? Weil solange lrs nicht definitiv abgekündigt ist, gibt es ja keinen Grund die nicht zu verwenden.
Genaugenommen läuft ja das lrs darauf hinaus, das Daten in Quelltext verwandelt werden und dieser Quelltext dann in dem Programm eingebunden wird - wie halt bei include üblich. Deswegen kann man sich die lrs ja als Quelltest ansehen und darinnen ist nicht mal soviel 'Magic' wie manche vermuten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 980
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Ressourcen Datei *.RES aufbauen

Beitrag von Winni »

Hi!

Nicht deprecated.

Das Geheimnis der lrs Dateien ist einfach:

Ein bischen Overhead.
Dann die Byte-Werte als char, entweder als druckbares Zeichen oder als z.B. #157
Maximale Zeilen-Länge ist 80 - also Editor-freundlich.
Als Ganzes ist das ein String verbunden durch + Zeichen.
Fertig.
Simpel und robust.

Winni

Benutzeravatar
Winni
Beiträge: 980
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Ressourcen Datei *.RES aufbauen

Beitrag von Winni »

Hi!

Warning: As mentioned above, using "normal"/Windows resources. Lazarus has also switched to this format since ver. 1.4

Von hier:

https://wiki.freepascal.org/Lazarus_Resources

Winni

Lorca
Beiträge: 71
Registriert: Di 3. Nov 2020, 12:25

Re: Ressourcen Datei *.RES aufbauen

Beitrag von Lorca »

Hallo zusammen,

endlich. gez funzt datt :lol:

Ganz herzlichen Dank an euch alle.
@wp_xyz: Du warst mir wirklich eine sehr große Hilfe. Dank Deiner Info mit LCLType .... werde ich mich nun verstärkt in diesen Units umschauen.

@wennerer: Danke Dein Beispiel hat bei mir zum Erfolg geführt. Jetzt werden auch in der Methode CREATE die Icons ohne einen RAISE korrekt geladen. Was ich nicht wusste war das LAZRES nicht nur *.RES Dateien erstellt. Ja ich weiß, "wer lesen kann ist klar im Vorteil" :). Ich war derart auf *.RES fixiert, das ich den Hinweis im Lazres Dokument zu *.LRS Dateien überhaupt nicht war genommen habe.

Ihr seit echt ein tolles Team.

Nochmals ganz herzlichen Dank für eure "Senioren Betreuung" 8) und für euren tollen Einsatz
Lorca

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

Re: Ressourcen Datei *.RES aufbauen

Beitrag von af0815 »

Wenn ich mir das hier https://www.freepascal.org/docs-html/pr ... 28500013.1 ansehe, wird da dezitiert von Programm oder Bibliothek gesprochen, nicht von Komponenten. Dann wäre es logisch, warum es Probleme gibt. Steht auch im Link von Winni, nur der Link von mir ist der offizielle 'Free Pascal Programmers Guide'.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Ressourcen Datei *.RES aufbauen

Beitrag von wp_xyz »

Was sind das denn für Probleme mit .res-Dateien? Ich sehe hier nur den unspezifizierten Hinweis von Lorca (13.11.) wegen der Resource-nicht-gefunden Meldung. Aber das kann viele Ursachen haben. Daraus den Schluss zu ziehen, .lrs wäre vorzuziehen, erscheint mir unbegründet: Die ganze IDE arbeitet mit .res, und auch ich habe in meinen eigenen Komponenten nur (?) res-Resourcen. Ich gebe zu, dass .res umständiglicher zu handhaben sind wegen dieser blöden RT_XXXX-Klassifizierung. Aber generell sollte man mit res umgehen können, wenn man irgendwann ein Projekt/eine Komponente von Delphi portiert, oder vor allem wenn man seine Komponenten sowohl für Lazarus als auch für Delphi verfügbar machen will.

wennerer
Beiträge: 335
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: Ressourcen Datei *.RES aufbauen

Beitrag von wennerer »

Hallo,
ich bin zwar nicht der ursprüngliche Fragesteller jedoch hat mich der Post von wp_xyz:
Aber generell sollte man mit res umgehen können, ....
neugierig gemacht. Ich habe deshalb meine Mini-Komponente auf .res umgestellt und hatte zunächst die gleichen Probleme wie Lorca. Nachdem ich mir aus dem Lazarus-Verzeichnis eine .res Datei geklaut hatte ging es auf einmal. Also musste mein Fehler beim Erzeugen der .res Datei passieren. Nach einigem lesen im Wiki sah ich dann einen Unterschied in der "Batch-Datei" bzw "Bash".
Beim Erzeugen einer .lrs sah meine "Bash" so aus:

Code: Alles auswählen

#!/bin/bash
lazres /home/bernd/Sprachen/Lazarus/64_bit/Meine_Komponenten/ResTest/images.lrs menu_environment_options_200.png menu_exit_200.png menu_new_search_200.png menu_project_inspector_200.png
und für die .res musste ich hinter den Dateinamen noch =Img1 usw. anfügen damit es geht:

Code: Alles auswählen

#!/bin/bash
lazres /home/bernd/Sprachen/Lazarus/64_bit/Meine_Komponenten/ResTest_res/images.res menu_environment_options_200.png=Img1 menu_exit_200.png=Img2 menu_new_search_200.png=Img3 menu_project_inspector_200.png=Img4
Hier nun noch meine Frage an die Profis: Es scheint zwar jetzt zu funktionieren aber war das jetzt wirklich der ganze Trick oder übersehe ich da noch was?

Hier kurz der angepasste Quellcode der Mini-Komponente:

Code: Alles auswählen

unit ResTest2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Controls, Graphics;

type

  { TResTest2 }

  TResTest2 = class(TCustomControl)
  private
    png: array [0..3] of TPortableNetworkGraphic;
  protected

  public
   constructor Create(AOwner: TComponent); override;
   destructor  Destroy; override;
   procedure   Paint; override;
  published

  end;

procedure Register;

implementation

{$R images.res}

procedure Register;
begin
  {$I restest2_icon.lrs}
  RegisterComponents('Standard',[TResTest2]);
end;


{ TResTest2 }

constructor TResTest2.Create(AOwner: TComponent);
var lv : integer;
begin
  inherited Create(AOwner);
  width := 128;
  height:= 32;
  for lv:=0 to 3 do
  png[lv]  := TPortableNetworkGraphic.Create;
        //.lrs    
   (* 
  png[0].LoadFromLazarusResource('menu_environment_options_200');
  png[1].LoadFromLazarusResource('menu_exit_200');
  png[2].LoadFromLazarusResource('menu_new_search_200');
  png[3].LoadFromLazarusResource('menu_project_inspector_200');
          *)
          //.res
  png[0].LoadFromResourceName(HINSTANCE, 'Img1');
  png[1].LoadFromResourceName(HINSTANCE, 'Img2');
  png[2].LoadFromResourceName(HINSTANCE, 'Img3');
  png[3].LoadFromResourceName(HINSTANCE, 'Img4');

end;

destructor TResTest2.Destroy;
var lv : integer;
begin
  inherited Destroy;
  for lv:=0 to 3 do png[lv].Free;
end;

procedure TResTest2.Paint;
var lv : integer;
begin
  inherited Paint;
  canvas.FillRect(0,0,width,height);
  for lv:=0 to 3 do canvas.Draw(0+(lv*32),0,png[lv]);
end;

end.
Viele Grüße
Bernd

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Ressourcen Datei *.RES aufbauen

Beitrag von wp_xyz »

Da musste ich einige Zeit suchen, denn ich konnte nicht glauben dass die Umbenennung erforderlich ist, weil bei der IDE res-Dateien auch ohne Umbenennung funktionieren, oder etwa auch im einfacher aufgebauten Industrial-Package, in dem in der Komponente TAdvLED genau dasselbe gemacht wird wie in deiner Komponente.

Das Hauptproblem war meiner Meinung nach, dass es diese Resourcen innerhalb der IDE tatsächlich schon einmal gibt. Denn du hast Bilder genommen, die unter denselben Namen in den Resourcen der IDE intern verwendet werden. Ich habe dann an die Dateinamen hinten ein "_a" angehängt, die res-Datei neu erzeugt, das Package sauber neu kompiliert und damit funktioniert dein Package auch mit res-Resourcen (sowohl bei Linux als auch Windows).

Während der Fehlersuche ist mir noch aufgefallen, dass wenn man vorher mit einer lrs-Datei gearbeitet hat und dann auf .res umstellen willst, die Gefahr besteht, dass man vergisst, das {$I datei.lrs} aus dem Quelltext zu entfernen. Bin nicht sicher, ob das auch zu einem "dupliate resource error" führt, aber jedenfalls hat man dann das Bild unnötigerweise zweimal im Package.

Weiterhin ist mir aufgefallen, dass dein weiter oben gepostetes Package die Zeile {$I images.lrs} zweimal enthält, einmal im Initialization-Abschnitt und einmal in der Register-Prozedur. Zweimal ist auf jeden Fall falsch (macht das denn keine Probleme?), und in der Register-Prozedur habe ich diese Direktiven noch nie gesehen, immer nur im Initialization-Abschnitt der Unit.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 961
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Ressourcen Datei *.RES aufbauen

Beitrag von fliegermichl »

wp_xyz hat geschrieben:
Di 16. Nov 2021, 00:32
... in der Register-Prozedur habe ich diese Direktiven noch nie gesehen, immer nur im Initialization-Abschnitt der Unit.
Das macht mMn. auch keinen Sinn, weil die Registerprozedur doch nur bei der Installation des Packages verwendet wird. Der Initialization Teil der Unit aber bei jedem Laden der Unit läuft.

wennerer
Beiträge: 335
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: Ressourcen Datei *.RES aufbauen

Beitrag von wennerer »

Hallo,
irgendwie wusste ich gleich das dies nicht die Lösung sein konnte.
@wp_xyz: jetzt wo du es mir erklärt hast wird mir das natürlich klar. Wenn ich eine Komponente mit Resource installiere wird sie ja ein Teil von Lazarus und dann darf der Name halt nicht zweimal vorkommen.
Das mit der.lrs in der Registerprocedure in meinem Post war ein Versehen. Ich hab da etliches getestet und vergessen das wieder raus zu löschen. Ich habe den Anhang im Post erneuert. Soll ja nicht
so stehen bleiben. Jedenfalls vielen Dank für deine Erklärungen und das Beispiel das du weiter oben reingestellt hast. Ich glaube jetzt komme ich klar.
@fliegermichl: Das die Registerprozedur nur bei der Installation durchläuft wusste ich auch nicht, obwohl ich auch da mit etwas nachdenken selber hätte drauf kommen können. Aber manchmal probiert man halt ohne zu denken. Auch dir ein Danke für dein Interesse!

Viele Grüße
Bernd

Antworten