Gibt es irgendeinen Vorteil in der Verwendung Ressourcenstring-anstelle einer const-string?
Würden Sie mir sagen, wenn es irgendeinen Vorteil (weniger sotorage Raum, die Geschwindigkeit zu erhöhen, etc.) in der Verwendung:
resourcestring
MsgErrInvalidInputRange = 'Invalid Message Here!';
statt
const
MsgErrInvalidInputRange : String = 'Invalid Message Here!';
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere erwähnt haben, Ressourcenstring-Saiten werden in einer separaten Ressource in der exe-Datei, und als solche haben Vorteile, wenn Sie brauchen, um gerecht für mehrere Sprachen in der Benutzeroberfläche Ihrer app.
Wie einige erwähnt haben, wie gut, const strings enthalten sind, die im data-Abschnitt Ihrer app.
Bis D2007
In Delphi-Versionen bis D2007, const strings gespeichert wurden als Ansi-Zeichenfolgen, die ein einzelnes byte pro Zeichen, während die Ressourcen-strings gespeichert werden, die in UTF-16: die windows-Standard-Codierung (wenn auch vielleicht nicht für Win9x). IIRC D2007 und früheren Versionen nicht unterstützt UTF-8-codiert-unit-Dateien. Also alle Zeichenfolgen codiert in deinen Quellen hätte unterstützt werden der ANSI-code-Seiten, und als solche wahrscheinlich gar nicht über die Unicode Basic Multilingual Plane. Das bedeutet, dass nur die UCS-2, Teil von UTF-16 verwendet werden würde und alle Zeichenfolgen gespeichert werden können in zwei bytes pro Zeichen.
Kurz: bis zu D2007 const strings nehmen Sie ein einzelnes byte pro Zeichen -, Ressourcen-strings, zwei bytes pro Zeichen.
D2009 und bis
Delphi unicode-fähig in der version D2009. Seitdem sind die Dinge ein wenig anders. Ressourcenstring-strings sind immer noch gespeichert als UTF-16. Keine andere option hier, wie Sie "verwaltet" von Windows.
Consts strings sind jedoch eine ganz andere Geschichte. Seit D2009 Delphi speichert mehrere Versionen von jedem const string in der exe-Datei. Jede version in einer anderen Kodierung. Const gespeichert werden können als Ansi-strings, UTF-8-strings und UTF-16-Zeichenfolgen.
Welche dieser Codierungen gespeichert werden, hängt von der Verwendung des const. Standardmäßig wird UTf-16 verwendet wird, denn das ist die Standard-internen Delphi-Codierung. Weisen Sie die gleichen const zu einem "normalen" (UTF-16) Zeichenfolge als auch eine AnsiString-variable, und die const gespeichert wird in der exe-Datei beide UTF-16 und Ansi-kodiert...
De-duping
Durch die Blicke von ihm (Experimentieren mit D5 und D2009), Delphi "de-dupes" const-strings, in der Erwägung, dass es dies nicht tut, für Ressourcenstring-strings.
Die const-option wird schneller sein als resourcestring, weil die später wird die Windows-API aufrufen, um die Ressource text.
Sie können es beschleunigen, indem Sie einige caching-Mechanismus. Dies ist, was wir tun, in unserer Erweiterten Delphi-RTL.
Und es ist eine gute Idee, laden Sie zunächst die resourcestring in eine Zeichenfolge, wenn Sie ' ll haben Zugriff auf viele Male, um einen Ressourcenstring-Inhalte.
Der wichtigste Punkt der Ressourcenstring ist es, die Internationalisierung (i18n) des Programms.
Haben Sie die Übersetzungs-Manager mit einigen Editionen von der Delphi-IDE. Aber es stützt sich auf eine externe DLL.
Können Sie die gettext-system, kommt aus der Linux-Welt, von http://dxgettext.po.dk die sich auf externe .po-Dateien.
Wir haben unsere eigenen i18n-Mechanismus in unserem Rahmen, die übersetzt und speichert die resourcestring text, und stützt sich auf externe .txt-Dateien (Sie können die Nutzung von UTF-8 oder Unicode-text-Dateien, die von Delphi 6 auf XE). Die caching-machen Sie es ganz so schnell wie die const-Nutzung. Sehen http://synopse.info/fossil/finfo?name=SQLite3/SQLite3i18n.pas
Gibt es andere open-source-oder kommerziellen Lösungen um.
Über Speichergröße, resourcestring sind, werden als UC2-Puffer. So resourcestring wird mehr Speicher verwendet als Zeichenfolge bis zu Delphi 2009. Seit Delphi 2009, alle string unicodestring d.h. UCS2, so dass Sie nicht haben, viel mehr Speicherkapazität. In allen Fällen, - Speicher-Größe von text ist nicht die größere Größe-parameter für eine Anwendung (bitmaps, und die code-Größe haben eine viel größere Auswirkungen auf die endgültige exe-Datei).
Ressourcen-strings gespeichert sind, als STRINGTABLE Einträge in der exe-Ressource, consts sind, werden als Teil der festen Daten-segment. Da Sie Teil der Ressource-Abschnitt kannst du Sie extrahieren und die DFMs, übersetzen Sie Sie und speichern Sie in einer Ressource-Modul (data-only-DLL). Bei einer Delphi-app startet, sieht es für die DLL und verwenden die strings aus, statt des mitgelieferten, in der EXE-Datei zu laden, übersetzungen.
Embarcadero docwiki behandelt die Verwendung des Translation Manager, aber viele andere Delphi-übersetzungs-tools verwenden, Ressourcen-strings zu.
Mit resourcestring, setzt der compiler diese Zeichenfolgen als einer stringtable-Ressource in der ausführbaren Datei, so dass jemand (sagen Ihre übersetzer-team) zu Bearbeiten, die Sie mit einem Ressourcen-editor ohne zu kompilieren Sie die Anwendung neu, oder haben Zugriff auf den Quellcode.
Es gibt auch eine Dritte Optionen, ist:
const
MsgErrInvalidInputRange = 'Ungültige Nachricht Hier!';
Letzteres sein soll, die mehr Leistung bietet, weil sagen, dass der compiler nicht reserviert Speicherplatz im Daten-segment, es könnte die Zeichenfolge in das code-segment. Denken Sie auch daran, dass das, was coould getan werden typisierte Konstanten hängt von der $WRITEABLECONST Richtlinie, obwohl ich nicht weiß, was der compiler genau, Wann es an oder aus ist.
asm S db 'foo'
und einige trick-to-pass-OFFSET S um den äußeren Umfang. Wenn ich mich Recht erinnere, beschreibbar typisierte Konstanten und Variablen initialisiert sind völlig gleichwertig.