![]() |
Delphi-Version: 5
Exception.CreateRes
Hallo,
ich bin beim herumstöbern über folgendes Quelltextfragment gestolpert:
Code:
und nun frage ich mich, was der Unterschied zwischen Exception.Create(SObjectIsNil) und Exception.CreateRes(@SObjectIsNil) denn ist?
resourcestring
SObjectIsNil = 'The provided object is nil. Cannot continue.'; ... if not Assigned(AObject) then raise EArgumentNilException.CreateRes(@SObjectIsNil); 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 |
AW: Exception.CreateRes
Erstmal gar keinen:
Delphi-Quellcode:
Was CreateRes macht, kann man ja einfach nachschauen:
procedure TForm1.Button1Click(Sender: TObject);
begin Exception.CreateRes(@SOpenFileTitle); Exception.Create(SOpenFileTitle); end;
Delphi-Quellcode:
Es ruft LoadResString auf. Um zu sehen was passiert, wenn man die zweite Variante nutzt, gucken wir uns den erzeugten Assembler-Code an:
constructor Exception.CreateRes(ResStringRec: PResStringRec);
begin FMessage := LoadResString(ResStringRec); end;
Code:
Beide nutzen also LoadResString, um den String zu laden. CreateRes ist jedoch überladen, so dass man es auch mit einer ID aufrufen kann.
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 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. |
AW: Exception.CreateRes
Zitat:
Zitat:
|
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:
, als Parameter oder sonstwie.
Exception.Create(SOpenFileTitle);
Bei
Delphi-Quellcode:
schob delphi es nicht in die Cache (brachte aber natürlich aber nur etwas, beim Speicherverbrauch, wenn diese Stringressource überall nur mit @ verwendet wurde).
Exception.CreateRes(@SOpenFileTitle);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz