Конференция "Основная" » Свой тип данных с проверкой.
 
  • MacroDenS © (06.04.17 17:01) [0]
    Всем доброго времени суток.

    Можно ли, и если да, то как создать свой тип данных с проверкой (к примеру по маске).

    Какая собственно цель: автоматически обрабатывать переменную, которая должна принимать GUID в виде строки.
    Так как подобных переменных в разных классах много, то не хотелось бы для каждого класса писать обработчик.

    Может кто сталкивался с подобным? Или знает направление куда копать?
    Заранее благодарен.

    Rad XE2, windows 7
  • rrrrr © (06.04.17 17:08) [1]
    Так как подобных переменных в разных классах много, то не хотелось бы для каждого класса писать обработчик.

    в чем нужда писать для каждого?
    напиши один.
  • MacroDenS © (06.04.17 19:09) [2]
    Сделать базовый класс и наследоваться от него это понятно, но
    хотелось бы более гибкого решения. Примерно как у базовых типов.  Т.е. как если бы переменной типа integer присвоить строковое значение.
  • rrrrr © (06.04.17 19:48) [3]
    какой класс?

    стандалон функция в библиотечном модуле.
  • Macrodens © (06.04.17 20:05) [4]
    А по подробнее если не сложно?
    Видимо пора отдыхать, тупить уже начинаю
  • manaka © (06.04.17 20:34) [5]

    > то как создать свой тип данных


    А разве это возможно?
    Типы данных, имхо, все уже созданы.


    > Примерно как у базовых типов.  Т.е. как если бы переменной
    > типа integer присвоить строковое значение.


    > А по подробнее если не сложно?
    > Видимо пора отдыхать, тупить уже начинаю
  • ухты © (06.04.17 21:47) [6]
    Хелпер наверное еще можно.
    А что сделать надо? )
  • NoUser © (06.04.17 23:20) [7]
    >  Т.е. как если бы переменной типа integer присвоить строковое значение.

    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)

    type
    TMyVar = record
     private
      Id: TGUID;
     public
      procedure Init;
      class operator Implicit(a: TMyVar): String;
      class operator Implicit(s: String): TMyVar;
      class operator Equal(a, b: TMyVar): Boolean;
      class operator Explicit(s: String): TMyVar;
      class operator Explicit(a: TMyVar): String;
     end;

    { TMyVar }

    class operator TMyVar.Equal(a, b: TMyVar): Boolean;
    begin
    Result := ( a.Id = b.Id );
    end;

    class operator TMyVar.Explicit(a: TMyVar): String;
    begin
    Result := GUIDToString(a.Id);
    end;

    class operator TMyVar.Explicit(s: String): TMyVar;
    begin
    Result.Id := StringToGUID(s);
    end;

    class operator TMyVar.Implicit(s: String): TMyVar;
    begin
    Result.Id := StringToGUID(s);
    end;

    class operator TMyVar.Implicit(a: TMyVar): String;
    begin
    Result := GUIDToString(a.Id);
    end;

    procedure TMyVar.Init;
    begin
    CreateGUID(Id);
    end;

    var
    t: TMyVar;
    s: string;

    begin
     t.Init;

     s := t;

     s[low(s)+1] := '0';
     s[high(s)-1]:= '0';

     t := s;

     if ( t = TMyVar(s) )
       then Writeln(String(t));

    end.
  • Германн © (07.04.17 02:04) [8]

    > manaka ©   (06.04.17 20:34) [5]
    >
    >
    > > то как создать свой тип данных
    >
    >
    > А разве это возможно?
    > Типы данных, имхо, все уже созданы.

    Буквально по азбуке, конечно нельзя. Все типы зашиты в компилятор. Но классы то есть. И никто никому не мешает создать свой класс со свойствами чтения и записи так, что в пользовательском коде это будет не отличимо от обычной переменной.
  • macrodens © (07.04.17 07:55) [9]
    Всем премного благодарен, особенно NoUser © - это то что нужно!
 
Конференция "Основная" » Свой тип данных с проверкой.
Есть новые Нет новых   [118656   +18][b:0.001][p:0.001]