Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Resourcestring vs. const (https://www.delphipraxis.net/140297-resourcestring-vs-const.html)

Highttower 15. Sep 2009 15:48


Resourcestring vs. const
 
Hallo zusammen,

ich bin jetzt seit Mai dabei Delphi zu lernen und dabei bin ich über diesen Code hier gestolpert. Was ich hier nicht verstehe ist die Funktion Button1.Click

Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
  retValue    : DWORD;
  ProcessList : TPIDList;
  i           : Integer;
  ProcessName : string;
  PID         : DWORD;
resourcestring // <- diese Stelle
  rsUnknown   = 'unbekannt';
begin
  // VCL causes last error to be set, even nothing has already happend :-/
  SetLastError(0);
  retValue := GetProcessList(ProcessList);
  if retValue = 0 then
  begin
    for i := 0 to length(ProcessList) - 1 do
    begin
      PID := ProcessList[i];
      if GetProcessName(ProcessList[i], ProcessName) <> 0 then
        ProcessName := rsUnknown;// <- hier
      Listbox1.Items.Add(IntToStr(PID) + ' - ' + ProcessName);
    end;
  end
  else
    ShowMessage(SysErrorMessage(retValue));
end;
Hier ist von einem sogenannten "resourcestring" die Rede, klingt extrem kompliziert und da fragt man sich was das eigendlich den macht. Allerdings wenn man dann über den Code drüber ließt findet man nur eine Anwendung von diesem Intressanten Construkt. Und genau an dieser Stelle wird es benutzt wie eine Constante. Warum also nicht einfach "const" nehmen?

Ich hab dann mal weiter gesucht und hab dann intressante Sachen gefunden wo das verwendet wird, DLLs, nonVCL Anwendungen usw. aber nirgends wird erklärt: Wozu verwendet man das? Kann man auch einfach Konstanten benutzen? Oder wird das zur Prozessinterkomunikation gebraucht?

Vielen Dank fürs Helfen,

Tobi

Namenloser 15. Sep 2009 15:56

Re: Resourcestring vs. const
 
Ressource-Strings haben den Vorteil, dass sie, wie der Name schon sagt, in Ressourcen gespeichert werden. Dadurch lassen sich die Anwendungen leichter übersetzen (dann muss im Grunde nur noch die Ressoucre ausgetauscht oder eine andere DLL eingebunden werden).

Highttower 15. Sep 2009 15:58

Re: Resourcestring vs. const
 
Also zusammengefasst kann man sagen:
Resourcestrings sind wie Const, heißen nur anders damit man sie beim lesen als solche erkennt? Und haben KEINE Besonderheiten wie zum Beispiel das sie anderes im Speicher abgelegt werden?

HeikoAdams 15. Sep 2009 16:02

Re: Resourcestring vs. const
 
Zitat:

Zitat von Highttower
Also zusammengefasst kann man sagen:
Resourcestrings sind wie Const, heißen nur anders damit man sie beim lesen als solche erkennt? Und haben KEINE Besonderheiten wie zum Beispiel das sie anderes im Speicher abgelegt werden?

Nein, ressourcestrings sind zwar String-Konstanten, sie werden aber anders gespeichert als normale Konstanten, damit man z.B. Anwendungen einfacher in andere Sprachen übersetzen kann, ohne jedesmal den kompletten Sourcecode anfassen und neu compilieren zu müssen. Im besten Fall brauch man mit Ressourcestrings nur eine einzelne Datei austauschen, um eine Anwendung z.B. von Englisch nach Französisch zu übersetzen.

Namenloser 15. Sep 2009 16:03

Re: Resourcestring vs. const
 
Zitat:

Zitat von Highttower
Also zusammengefasst kann man sagen:
Resourcestrings sind wie Const, heißen nur anders damit man sie beim lesen als solche erkennt? Und haben KEINE Besonderheiten wie zum Beispiel das sie anderes im Speicher abgelegt werden?

Das hab ich doch versucht zu erklären: Resource Strings werden in Ressourcen abgespeichert. Normale Konstanten hingegen stehen quasi "irgendwo im Programmcode".

Blup 15. Sep 2009 16:08

Re: Resourcestring vs. const
 
Sie werden im Programm genauso behandelt, allerdings muss man das Programm nicht neu kompilieren, um diese auszutauschen.
Wenn du eine andere Sprache unterstützen möchtest, genügt es eine DLL mit zu geben oder nach zu liefern, die noch einmal alle Resourcen in der jeweiligen Sprache enthält.

Bernhard Geyer 15. Sep 2009 16:14

Re: Resourcestring vs. const
 
Zitat:

Zitat von Blup
Sie werden im Programm genauso behandelt, ...

Nicht ganz. Eine Konstante wird an jede Verwendungsstelle kopiert. Gleiche Texte sind also mehrfach in der Exe vorhanden (Jedenfalls macht es D6 so).

himitsu 15. Sep 2009 16:16

Re: Resourcestring vs. const
 
Liste der Anhänge anzeigen (Anzahl: 1)
Konstanden werden quasi direkt ersetzt

Delphi-Quellcode:
// Delphi macht intern aus
const c = 'abc';
MyProc(C);

// ein
MyProc('abc');

// und aus
resourcestring c = 'abc';
MyProc(C);

MyProc(LoadString(ID)); // ID = die StringID in den Resourcen
Delphi-Referenz durchsuchenLoadString

[edit]
Zitat:

Nicht ganz. Eine Konstante wird an jede Verwendungsstelle kopiert. Gleiche Texte sind also mehrfach in der Exe vorhanden (Jedenfalls macht es D6 so).
eigentlich versucht Delphi bei "langen Strings" und wenn sie als AnsiString, WideString, PChar usw. eingesetzt werden diese nur einmal in die EXE einzubinden und trägt überall nur einen Zeiger auf den gemeinsamen String ... zumindestens ist es in neueren Delphis so (ich glaub mein D7 macht es auch so)

Blup 15. Sep 2009 16:29

Re: Resourcestring vs. const
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Blup
Sie werden im Programm genauso behandelt, ...

Nicht ganz. Eine Konstante wird an jede Verwendungsstelle kopiert. Gleiche Texte sind also mehrfach in der Exe vorhanden (Jedenfalls macht es D6 so).

Klar erzeugt der Compiler unterschiedlichen Code. Die Aussage bezieht sich auf die Benutzung der Konstanten.
Delphi-Quellcode:
const
  s = 'abcd';
var
  a, b: string;
begin
  a := s;
  b := s;
  if Pointer(a) = Pointer(b) then
    ShowMessage('Adresse ist gleich')
  else
    ShowMessage('Adresse ist ungleich');
end;
Delphi 2007 sagt: Adresse ist gleich
Ich glaube der Delphi-Compiler macht das schon immer so.

Highttower 16. Sep 2009 07:48

Re: Resourcestring vs. const
 
Zitat:

Zitat von HeikoAdams
Zitat:

Zitat von Highttower
Also zusammengefasst kann man sagen:
Resourcestrings sind wie Const, heißen nur anders damit man sie beim lesen als solche erkennt? Und haben KEINE Besonderheiten wie zum Beispiel das sie anderes im Speicher abgelegt werden?

Nein, ressourcestrings sind zwar String-Konstanten, sie werden aber anders gespeichert als normale Konstanten, damit man z.B. Anwendungen einfacher in andere Sprachen übersetzen kann, ohne jedesmal den kompletten Sourcecode anfassen und neu compilieren zu müssen. Im besten Fall brauch man mit Ressourcestrings nur eine einzelne Datei austauschen, um eine Anwendung z.B. von Englisch nach Französisch zu übersetzen.

Und wie macht man das, mit dem ändern ohne neu zu kompiliren? Die Exe mit nem Texteditor aufmachen und dann nach Resourcestrings suchen? - Vermutlich nicht.
Oder meinst du das nach dem Kompiliern, vor dem Linken? Also irgendwo in den Objektdateien, wenn es sowas bei Delphi noch gibt?

HeikoAdams 16. Sep 2009 07:51

Re: Resourcestring vs. const
 
Ich hab mich da auf die Onlinehilfe von Delphi 2K6 verlassen, in der zu resourcestrings folgendes steht:
Zitat:

Ressourcen-Strings werden als Ressource gespeichert und zu einer ausführbaren Datei oder Bibliothek gelinkt. Deshalb ist keine erneute Compilierung des Programms erforderlich, wenn ein Ressourcen-String geändert wird.

Bernhard Geyer 16. Sep 2009 08:04

Re: Resourcestring vs. const
 
Zitat:

Zitat von Blup
Klar erzeugt der Compiler unterschiedlichen Code. Die Aussage bezieht sich auf die Benutzung der Konstanten.
...
Delphi 2007 sagt: Adresse ist gleich
Ich glaube der Delphi-Compiler macht das schon immer so.

Du überprüft gerade ob die Referenzzählung von Delphi bei Strings funktioniert. Und es wäre schlecht wenn das bei D2007 nicht der Fall wäre.

Wenn da mußt du die Adresse der Konstante mit deiner Variable vergleichen bzw. folgenden Test machen

Delphi-Quellcode:
const
  cMyString = 'BlaBla %s'

...


  s1 := Format(cMyString, 'xyz');

...

  s2 := Format(cMyString, 'abc');
Und jetzt kontrollieren wie oft 'BlaBla %s' in der Exe vorhanden ist.

sirius 16. Sep 2009 08:49

Re: Resourcestring vs. const
 
Zitat:

Zitat von Highttower
Und wie macht man das, mit dem ändern ohne neu zu kompiliren? Die Exe mit nem Texteditor aufmachen und dann nach Resourcestrings suchen? - Vermutlich nicht.
Oder meinst du das nach dem Kompiliern, vor dem Linken? Also irgendwo in den Objektdateien, wenn es sowas bei Delphi noch gibt?

Es gibt Ressourceneditoren. Suche einfach mal danach.
Da man dies - wie schon gesagt - hauptsächlich dafür einsetzt eine neue Sprache seinem Programm hinzuzufügen (was , egal ob nach oder vor dem compilieren, mit Ressourcen deutlich einfacher geht), gibt es auch spezielle Programme (bspw: in Delphi ist der Translationmanager dabei) für die Übersetzungen.

himitsu 16. Sep 2009 10:07

Re: Resourcestring vs. const
 
Zitat:

Zitat von Bernhard Geyer
Du überprüft gerade ob die Referenzzählung von Delphi bei Strings funktioniert.

Wenn für jede Verwendungsstelle ein eigener String in der EXE angelegt würde, dann würden sich auch die Adressen unterscheiden :zwinker:

Phoner 16. Sep 2009 12:28

Re: Resourcestring vs. const
 
Ich habe da noch eine ganz andere frage zu:
Ich definiere 1000 Strings mittels const, referenziere die aber kein einziges mal. Ich hoffe mal, dass die niemals mit in die Exe gelinkt werden.
Bei resourcestring bin ich mir dagegen nicht so sicher - zumindest sind irgendwie alle strings aus "Consts.pas" (und andere) immer enthalten.

himitsu 16. Sep 2009 12:49

Re: Resourcestring vs. const
 
Ich hoffe mal, daß auch bei den ResourceStrings der Kompiler nur diese mit einlinkt, welche auch verwendet wird.

Was die Strings aus der Const.pas angeht, da werden die Funktionen wo diese enthalten sind oftmals verwendet und z.B. über die VCL oder Initialisations-Abschnitte vieler Delphi-Units genutzt und demnach werden die Strings irgendwo "theoretisch" und demnach auch mit eingebaut.

turboPASCAL 16. Sep 2009 13:00

Re: Resourcestring vs. const
 
Zitat:

Ich hoffe mal, daß auch bei den ResourceStrings der Kompiler nur diese mr einlinks, welche auch verwendet werden.
Jo, der baut nur das ein was man braucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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