Помощник класса и строки в Delphi Win32 - PullRequest
1 голос
/ 11 сентября 2009

Есть ли способ реализовать текущую версию Delphi.

a) Строка (как класс) с перегрузками операторов (т. Е. +, =)

b) Помощник класса, чтобы можно было добавлять собственные строковые методы

Я понимаю, что строка является нативным типом, поэтому классные помощники не будут работать без настройка класса и т. д.

Ответы [ 3 ]

4 голосов
/ 11 сентября 2009

Да, строка является нативным типом с добавлением специальной магии компилятора.

Я не знаю, какой оператор перегрузки вы бы хотели. + и = уже работают как операторы конкатенации и равенства.

Однако я думал о том, чтобы сделать что-то подобное сам. Он может работать с типом записи с неявными конверторами и перегруженными операторами добавления и равенства (в Win32 только записи Delphi могут иметь перегрузку операторов. Это доступно только в D2006 (? 2005).)

Я подозреваю, что может быть и некоторое снижение производительности.

Синтаксис будет выглядеть примерно так:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TString = record
    private
      Value : string;
    public
      class operator Add(a, b: TString): TString;
      class operator Implicit(a: Integer): TString;
      class operator Implicit(const s: string): TString;
      class operator Implicit(ts: TString): String;
      function IndexOf(const SubStr : string) : Integer;
    end;


var
  Form1: TForm1;

implementation

class operator TString.Add(a, b : TString) : TString;
begin
  Result.Value := a.Value + b.Value;
end;

class operator TString.Implicit(a: Integer): TString;
begin
  Result.Value := IntToStr(a);
end;

class operator TString.Implicit(ts: TString): String;
begin
  Result := ts.Value;
end;

function TString.IndexOf(const SubStr : string) : Integer;
begin
  Result := Pos(SubStr, Value);
end;

class operator TString.Implicit(const s: string): TString;
begin
  Result.Value := s;
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  ts : TString;
begin
  ts := '1234';
  ShowMessage(ts);
  ShowMessage(IntToStr(Ts.IndexOf('2')));
end;

end.

По-видимому, у вас также могут быть "помощники по записи", но я никогда не пробовал сам.

1 голос
/ 11 сентября 2009

Вы можете использовать перегрузку операторов в Delphi (начиная с Delphi 2006) только для записей, не относящихся к классам, и не для встроенных собственных типов, таких как строки.

Причина в том, что в Delphi нет сборки мусора, поэтому перегрузка операторов ограничена типами значений (типами, которые не находятся в куче).

Вы можете скачать воспроизведение моей сессии "Обнуляемые типы с записями, методами и перегрузкой операторов" на странице загрузки CodeRage III Replay . Просто найдите имя сеанса.

Существует также страница для загрузки сэмплов и слайдов сессий .

Он содержит довольно много примеров, которые помогут вам начать работу, включая описание некоторых проблем в компиляторе Delphi 2006, которые были решены в Delphi 2007 и выше.

См. Также этот вопрос: Могу ли я перегрузить операторы для своих собственных классов в Delphi?

1 голос
/ 11 сентября 2009

Не лучшее ли решение для написания ваших пользовательских функций / процедур?

Например

Function StrToBase64(AString): string;
Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
Function ExtractWord(aString): string;
Function GetStrColumn(aString: string; aCol: integer): string;

И если вы хотите сгруппировать эти функции / процедуры, которые находятся в одной единице, в функциональные категории, вы можете использовать записи для этого:

TStringConversions = record
  class Function StrToBase64(AString): string;
  class Procedure StrToGridLayout(AString: string; AGrid: TDBGrid);
end;

TStringParsing = record
  class Function ExtractWord(aString): string;
  class Function GetStrColumn(aString: string; aCol: integer): string;
end;

И затем, вы можете вызывать их в коде намного чище:

myFirstWord := TStringParsing.ExtractWord('Delphi is a very good tool');

НТН

...