[Erledigt] TStringList als Ressource in ein Programm einbetten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

[Erledigt] TStringList als Ressource in ein Programm einbetten

Beitrag von Nimral »

Hi,

ich habe ein altes Programm in der Mache, das zu Schulungs- und Testzwecken Demo-Datenbanken mit zufälligen Personendaten erzeugt. Um die Namen zu erzeugen, habe ich drei Listen als Textdatei vorliegen: die jeweils 1000 häufigsten deutschen mönnlichen und weiblichen Vornamen, und die 1000 häufigsten Familiennamen. Ich lese sie derzeit mit TStringList.ReadFromFile in den Speicher und den Rest machen dann eine Schleife und Random.

Jetzt möchte ich die 3 Dateien als Ressource ins Programm einbinden, um die drei Hilfsdateien los zu werden, die ich sonst immer mitschleppen muss.

Mit meinen derzeitigen Kenntnissen würde ich mir ein Hilfsprogramm schreiben, welches den Code zum Erzeugen der StringListen in eine include-Datei schreibt, entweder als array das ich leicht in eine StringList umwandeln kann, oder als langen String den ich mit DelimitedText zerlegen lassen kann, oder meinetwegen auch gleich den Code erzeugen der die StringList erzeugt und mit add die einzelnen Namen hinzufügt.

Aber man lernt ja gerne dazu, da gibt es doch die Möglichkeit, Ressourcen direkt ins Programm einzubinden, wie das z.B. der Form Editor mit der Formulardefinition macht.

Kann ich so einen Mechanismus für mich arbeiten lassen, und wenn ja .... wie geht das?

HG, Armin.
Zuletzt geändert von Nimral am Di 31. Aug 2021, 14:05, insgesamt 2-mal geändert.

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TStringList als Ressource in ein Programm einbetten

Beitrag von PascalDragon »

Ganz einfach:

test.txt:

Code: Alles auswählen

foobar
blubb
foo
bar
lists.rc:

Code: Alles auswählen

list1 RCDATA test.txt
tres.pp:

Code: Alles auswählen

program tres;

{$mode objfpc}{$H+}

uses
  Classes, resource;

{$R lists.rc}

var
  sl: TStringList;
  r: TResourceStream;
begin
  sl := TStringList.Create;
  try
    r := TResourceStream.Create(HINSTANCE, 'list1', PChar(RT_RCDATA));
    try
      sl.LoadFromStream(r);
    finally
      r.Free;
    end;

    Writeln('Lines: ', sl.Count);
  finally
    sl.Free;
  end;
end.
Ausgabe:

Code: Alles auswählen

PS C:\fpc\git> .\testoutput\tres.exe
Lines: 4
FPC Compiler Entwickler

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TStringList als Ressource in ein Programm einbetten

Beitrag von Nimral »

Super! Danke!

Ich war dem gerade auch auf der Spur, bin allerdings auf den Pfad geraten wie man das auch über die Lazarus GUI regeln kann. Ich war grad am Einlesen, da kam schon Deine Antwort.

https://wiki.freepascal.org/IDE_Window: ... #Resources

ich liebe dieses Forum!

HG, Armin

[Edit: getestet, funktioniert prima!]

Antworten