Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String Table Resource mit langen Texten (https://www.delphipraxis.net/139665-string-table-resource-mit-langen-texten.html)

bwolf 2. Sep 2009 16:05


String Table Resource mit langen Texten
 
Hi Leute,

wie eben gefragt, wollte ich wissen, wie ich Texte programmintern ablegen kann.
Nun versuche ich dies mit Resourcen zu lösen, genauer mit einer String Table.

Ich habe mir nun mit dem XN Resource Editor eine RES-File erzeugt die die entsprechenden Texte enthält.
Ein Text hat etwa 500 Zeilen und 15000 Zeichen.

Nun habe ich Probleme diese Texte auszulesen.
Ich habe folgendes Probiert:

Delphi-Quellcode:
procedure Tdm_update.updateDatabase();
var
  a : array[0..20000] of char;
begin
  if LoadString(hInstance, 1, @a, sizeof(a)) <> 0 then
    frm_main.Memo1.Text :=strPas(a);
end

Allerdings kriege ich da nur etwa die ersten 60 Zeilen ausgegeben.
Ich habe auch versucht, statt des Char Arrays einen String bzw PChar zu verwenden, das ergibt allerdings Zeichensalat.

Danke nochmal für eure Hilfe,
gruß b

Blup 3. Sep 2009 15:06

Re: String Table Resource mit langen Texten
 
Die Stringtabelle bzw. der Resourcetyp RT_STRING ist meines Wissens in der Größe begrenzt.
Ich würde den Text als benutzerdefinierte Daten RT_RCDATA speichern.

Nicht getestet:
Delphi-Quellcode:
function LiesMeinenText: string;
begin
  with TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA) do
  begin
    try
      SetLength(Result, Size);
      Read(Result[1], Size);
    finally
      Free;
    end;
  end;
end;

himitsu 3. Sep 2009 15:32

Re: String Table Resource mit langen Texten
 
Eine StringTabelle ist eigentlich nur für kurze und meißt einzeilige Texte gedacht.

Wenn du wirklich sooo große Texte ablegen willst würde ich dir auch empfehlen diese als eigenstendige Resource abzulegen.

PS: LoadString hat einen internen Puffer, mit fester Länge, darum geht da einfach nicht so viel (obwohl mir 60 etwas kurz vorkommt, aber vielleicht liegt dein String ja relativ am Ende :gruebel: ).

bwolf 4. Sep 2009 08:58

Re: String Table Resource mit langen Texten
 
Danke für eure Antworten, werde mir das ansehen!

PS:
Kurz zu meinem Vorhaben, vlt. habt ihr dafür ja einen besseren Ansatz:
Wenn es eine neue Programmversion gibt, in der Datenbank-Änderungen notwendig sind, will ich das entsprechende SQL programmintern speichern.
Beim starten der Anwendung wird die DB-Version mit der Programmversion abgeglichen, und falls notwendig entsprechend die Scripts ausgeführt.

Grüße,
B

himitsu 4. Sep 2009 09:43

Re: String Table Resource mit langen Texten
 
Da diese Strings eh in der Binary bzw. intern in den Resourcen gespeichert sind, kannst du es doch auch an anderen Stellen dort ablegen?

z.B. als Konstante (Const) oder auch als Resource-Konstante (ResourceString),
wobei letzteres eigentlich auch theoretisch über LoadString geht, aber dort beim Laden des Programs Delphi dieses etwas anders etrstmal in eine Art Cache legt ... es ist dann also sogar etwas flotter, als wenn der String jedesmal erst noch in der Resource gesucht und extrahiert werden müßte.

Diese ResourceStrings liegen ja in Tabellen a bis zu 16 Strings vor und diese Tabellen werden als Ganzes geladen und dann erst daraus der gewünschte String rausgesucht.

die Konstanten kannst du dir ja in eine extra Unit auslagen (ähnlich wie die Unit SysConst von Delphi)

bwolf 4. Sep 2009 10:54

Re: String Table Resource mit langen Texten
 
Hi himitsu,

das nervige dabei den Text in einer Constanten zu speichern ist, das ich nach einem
Copy&Paste in die Delphi IDE den kompletten String manuell verbinden muß.
Also jede Zeile in Hochkommas setzen und und mit + verbinden.

himitsu 4. Sep 2009 11:23

Re: String Table Resource mit langen Texten
 
In einer Resource-Datei (.rc) mußt du ihn aber auch formatieren.
Du könntest jetzt eine TextDatei nehmen

oder eine XML (dort mußt du ja beim Kopieren nur auf < und > achten, es sei denn du nimmst gleich je eine CDATA-Section ... es passiert ja wohl nicht so schnell, daß mal ein ]]> in der Abfrage vorkommt )

bwolf 4. Sep 2009 12:42

Re: String Table Resource mit langen Texten
 
Hi himitsu,

Zitat:

In einer Resource-Datei (.rc) mußt du ihn aber auch formatieren.
Das stimmt wohl. Wenn ich allerdings einen Resource-Editor nehme, kann ich auch den formatierten Text einfügen.

Zitat:

Du könntest jetzt eine TextDatei nehmen. oder eine XML...
Würde theoretisch auch gehen, allerdings müßte ich ja diese Files dann dem Programm beilegen, und genau das würde ich gerne verhindern.

himitsu 4. Sep 2009 12:48

Re: String Table Resource mit langen Texten
 
Zitat:

Zitat von bwolf
Das stimmt wohl. Wenn ich allerdings einen Resource-Editor nehme, kann ich auch den formatierten Text einfügen.

OK, wenn man das so machen,
alerdings könnte man dafür ja auch einen IDE-Experten nehmen, welcher das dann passend Formatiert :angel2:

Zitat:

Zitat von bwolf
Würde theoretisch auch gehen, allerdings müßte ich ja diese Files dann dem Programm beilegen, und genau das würde ich gerne verhindern.

Hier könnte man diese Datei zwar mit in die Anwendung als Resource reinbringen
und z.B. kurz vorm Kompilieren das Resource-Script samt der XML verarbeiten lassen.

Aber dann hätten wir ja wieder eine Resource :stupid:

bwolf 8. Sep 2009 09:50

Re: String Table Resource mit langen Texten
 
Zitat:

Zitat von himitsu
alerdings könnte man dafür ja auch einen IDE-Experten nehmen, welcher das dann passend Formatiert

Kennst du (oder sonstwer) einen Expert der das erledigt?
habe bei gockel nichts gefunden, und der GExpert scheint das nicht drauf zu haben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz