Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Seite 1 von 2  1 2      

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