AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exception.CreateRes

Ein Thema von Rainer Wolff · begonnen am 7. Apr 2011 · letzter Beitrag vom 7. Apr 2011
Antwort Antwort
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#1

Exception.CreateRes

  Alt 7. Apr 2011, 08:42
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Exception.CreateRes

  Alt 7. Apr 2011, 09:22
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.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
rob74

Registriert seit: 13. Sep 2006
Ort: München
22 Beiträge
 
Delphi XE Starter
 
#3

AW: Exception.CreateRes

  Alt 7. Apr 2011, 14:32
Was CreateRes macht, kann man ja einfach nachschauen
Zumindest wenn man eine Delphi-Version hat, wo der VCL-Quellcode enthalten ist
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"?

Geändert von rob74 ( 7. Apr 2011 um 14:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Exception.CreateRes

  Alt 7. Apr 2011, 14:46
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 Exception.Create(SOpenFileTitle); , als Parameter oder sonstwie.

Bei 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).
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:10 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