Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Exception.CreateRes (https://www.delphipraxis.net/159660-exception-createres.html)

Rainer Wolff 7. Apr 2011 07:42

Delphi-Version: 5

Exception.CreateRes
 
Hallo,

ich bin beim herumstöbern über folgendes Quelltextfragment gestolpert:

Code:
resourcestring
  SObjectIsNil = 'The provided object is nil. Cannot continue.';
...
  if not Assigned(AObject) then
    raise EArgumentNilException.CreateRes(@SObjectIsNil);
und nun frage ich mich, was der Unterschied zwischen Exception.Create(SObjectIsNil) und Exception.CreateRes(@SObjectIsNil) denn ist?
Dass ich mit CreateRes auch einen String anhand einer Id aus einer Resource laden kann, hab ich ja aus der Onlinehilfe verstanden (wenn auch noch nicht ausprobiert). Aber die Verwendung von CreateRes wie im Beispiel ist mir unklar.

Gruß Rainer

Deep-Sea 7. Apr 2011 08:22

AW: Exception.CreateRes
 
Erstmal gar keinen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Exception.CreateRes(@SOpenFileTitle);
  Exception.Create(SOpenFileTitle);
end;
Was CreateRes macht, kann man ja einfach nachschauen:
Delphi-Quellcode:
constructor Exception.CreateRes(ResStringRec: PResStringRec);
begin
  FMessage := LoadResString(ResStringRec);
end;
Es ruft LoadResString auf. Um zu sehen was passiert, wenn man die zweite Variante nutzt, gucken wir uns den erzeugten Assembler-Code an:
Code:
Unit1.pas.29: Exception.Create(SOpenFileTitle);
00464835 8D55FC          lea edx,[ebp-$04]
00464838 A1407A4600       mov eax,[$00467a40]
0046483D E8222DFAFF      call LoadResString // Oho, schon wieder LoadResString ;)
00464842 8B4DFC          mov ecx,[ebp-$04]
00464845 B201             mov dl,$01
00464847 A1308E4000       mov eax,[$00408e30]
0046484C E84BA4FAFF      call Exception.Create
Beide nutzen also LoadResString, um den String zu laden. CreateRes ist jedoch überladen, so dass man es auch mit einer ID aufrufen kann.
Warum jetzt vornehmlich CreateRes aufgerufen wird, weiß ich aber erst mal auch nicht. Kann mir nur vorstellen, dass es in der Zukunft dort einen Unterschied geben könnte und man es deshalb schon jetzt so aufruft.

rob74 7. Apr 2011 13:32

AW: Exception.CreateRes
 
Zitat:

Zitat von Deep-Sea (Beitrag 1093569)
Was CreateRes macht, kann man ja einfach nachschauen

Zumindest wenn man eine Delphi-Version hat, wo der VCL-Quellcode enthalten ist :?
Zitat:

Zitat von Deep-Sea (Beitrag 1093569)
Beide nutzen also LoadResString, um den String zu laden. CreateRes ist jedoch überladen, so dass man es auch mit einer ID aufrufen kann. Warum jetzt vornehmlich CreateRes aufgerufen wird, weiß ich aber erst mal auch nicht.

Vielleicht um zu verdeutlichen, dass es um einen Resource-String geht und nicht um einen "stinknormalen"?

himitsu 7. Apr 2011 13:46

AW: Exception.CreateRes
 
Mir war mal so, als wenn Delphi früher (vermutlich in 4 oder 7) die ResourceString beim Programmstart alle vorgeladen hatte ('ne art Cache), also wenn man diese irgendwo direkt verwendet, wie z.B. hier
Delphi-Quellcode:
Exception.Create(SOpenFileTitle);
, als Parameter oder sonstwie.

Bei
Delphi-Quellcode:
Exception.CreateRes(@SOpenFileTitle);
schob delphi es nicht in die Cache (brachte aber natürlich aber nur etwas, beim Speicherverbrauch, wenn diese Stringressource überall nur mit @ verwendet wurde).


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