tags:

views:

732

answers:

4

Embaracdero documents "IsEmpty" methods for string types, which I've used successfully with C++ Builder code.

WideString s;

if (s.IsEmpty())
   ....

I tried the same from Delphi, and couldn't get it to compile:

var s: WideString;
begin
  if s.IsEmpty then
  ....

I know you can compare with an empty string, or call the Length function, but is it possible to call this IsEmpty method from Delphi?

EDIT: Just to clarify, this wasn't meant as a String vs Widestring issue.

Basically, the docs I link to above describe a Pascal syntax, as well as a C++ one, yet this doesn't seem to work. I assume this is just a flaw in the documentation.

Returns true if the System::WideString::WideString is empty.

Pascal: function IsEmpty: bool;

A: 
if Trim(s)='' then

???

SimaWB
I know there are other ways. I want to know if IsEmpty can actually be used.
Roddy
function IsEmpty(s:string):boolean; begin; result:=length(s)=0; end; Now you can use it ;-)
Ertugrul Tamer Kara
+9  A: 

String is not a class in Delphi therefore it has no methods, you have to use functions for string manipulations like Length, Copy, etc... String is a class in C++ so maybe you are confused by that.

idursun
Thanks. That's the heart of it: String types are all classes in C++, but not in Delphi. The Codegear documentation is wrong to list pascal equivalents to these methods.
Roddy
MY guess is that the Pascal equivalents in the help probably refer to Delphi.NET where Strings *are* classes... (haven't checked this myself yet)
Oliver Giesen
Yes, Delphi documentation is all messed up in these versions but at least CodeGear is trying to gather something better via updates.
idursun
+5  A: 

No. string is not WideString, even in D2009. You wouldn't want to, either; comparing with nil/empty string is much faster than a method call.

In Delphi:

var 
  s: string;
begin
  if s = '' then begin
    ShowMessage('It is empty or nil.');

...for string detects both nil and empty string (which is = nil).

Craig Stuntz
"comparing with nil" - Can you show an example?
Roddy
Okaayyyy. I get this:[DCC Error] Unit69.pas(31): E2010 Incompatible types: 'string' and 'Pointer'What am I doing wrong? (this with D2007, by the way.)
Roddy
Error in my example. Fixed. The point is that Delphi actually compares with nil under the hood (look at disassembly).
Craig Stuntz
You can compare (and NEED to compare) strings with nil in Delphi.Net. In native Delphi, it's enough to compare with EmptyStr or '' .
Fabricio Araujo
In .NET, use string.IsNullOrEmpty()
Craig Stuntz
+4  A: 

Delphi is an hybrid language. It contains basic types and classes. Only classes (and records and objects) can contain methods.

String is a basic type, although a special one. It's the only type that has a reserved word. That's why its often written with a lowercase (string) unlike other types which have a starting captial (Integer).

You can if you like:

type
  TString = class
  private
    FString: string;
  public
    constructor Create(const AValue: string);

    property &String: string read FString write FString;
    property IsEmpty: Boolean read GetIsEmpty;
    // ...
  end;
Gamecat
Peter Turner
Gamecat