Определение типа строки для определенного формата - PullRequest
0 голосов
/ 06 декабря 2011

Мне было интересно, есть ли способ определить тип строки или аналогичный в Delphi 7, который предназначен для определенного формата или соответствует определенным спецификациям?Например, я хотел бы определить тип TSizeString, который принимает значения, такие как 4x6 или 9x12 или, может быть, даже 2.5x10.75.Он должен требовать x как единственный разделитель между двумя числами.Таким образом, никогда не должно быть ничего вроде x9 или 65 или 2-4 или 4-6x6-2 и даже 4 x 6.

Просто INTEGER + 'x' + INTEGER или SINGLE + 'x' + SINGLE.

Подобно тому, как работает TFilename, стандартные имена файлов могут выглядеть как C:\MyPath\MyFile.txt или \\Storage\SomeDir\SomeFile.doc

Ответы [ 3 ]

9 голосов
/ 06 декабря 2011

В новых версиях Delphi расширенные записи и перегрузка операторов очень удобны в этом случае:

type
  TSizeString = record
    x, y: single;
  public
    class operator Implicit(const S: string): TSizeString;
    class operator Implicit(const S: TSizeString): string;
  end;

implementation

class operator TSizeString.Implicit(const S: string): TSizeString;
var
  DelimPos: integer;
begin
  DelimPos := Pos('x', S);
  if (DelimPos = 0) or (not TryStrToFloat(Copy(S, 1, DelimPos-1), result.X)) or
    (not TryStrToFloat(Copy(S, DelimPos + 1), result.y)) then
    raise Exception.CreateFmt('Invalid format of size string "%s".', [S]);
end;

class operator TSizeString.Implicit(const S: TSizeString): string;
begin
  result := FloatToStr(S.x) + 'x' + FloatToStr(S.y);
end;

Теперь вы можете сделать

procedure TForm1.Button1Click(Sender: TObject);
var
  S: TSizeString;
begin
  S := '20x30';             // works
  ShowMessage(S);
  S := 'Hello World!';      // exception raised
  ShowMessage(S);
end;

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

1 голос
/ 06 декабря 2011

Специальные типы, такие как TFileName и TCaption, не являются чем-то особенным, как упомянул Андреас, но их можно использовать для регистрации конкретного редактора свойств в IDE.Это поможет вводить такие значения через инспектор объектов.

Чтобы реально применить такое значение, если ваша строка является свойством объекта, вы можете написать для него установщик.

В противном случае я должен создать класс TSize, который имеет свойства для двух целых чисел, и свойство AsString, которое объединяет его свойства в строку.

type
  TSize = class
  private
    FLeftInt, FRightInt: Integer;
    function GetString: string;
    procedure SetString(Value: string);
  public
    property LeftInt: Integer read FLeftInt write FLeftInt;
    property RightInt: Integer read FRightInt write FRightInt;
    property AsString: string read GetString write SetString;
  end;

function TSize.GetString: string;
begin
  Result := Format('%dx%d', [FLeftInt, FRightInt]);
end;

function TSize.SetString(Value: string);
begin
  // Validate and parse Value. Set LeftInt and RightInt.
end;
0 голосов
/ 06 декабря 2011

Самый простой способ - просто использовать функцию и всегда использовать ее при определении своих строк ...

function MyString(numA, numB: single) : string;
begin
    Result := FloatToStr(numA) + 'x' + FloatToStr(numB)
end;

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

...