powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Generics Variant to Type
2 сообщений из 27, страница 2 из 2
Generics Variant to Type
    #39396670
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Пофигу. Два абсолюта и приплыли.Вернее, если после абсолютной переменной объявляется еще какая-то переменная.

Итого получилось вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
  TGenericUtils<T> = record
  strict private
    class procedure UnknownType; static;
    class procedure UnsupportedType; static;
  public
    class procedure VarToT(const AVar: Variant; out AOutVal: T); static;
  end;

class procedure TGenericUtils<T>.VarToT(const AVar: Variant; out AOutVal: T);
begin
  case PTypeInfo(TypeInfo(T))^.Kind of
    tkInteger: begin
      if VarIsUnsigned(AVar) then begin
        case SizeOf(T) of
          SizeOf(Byte): PByte(@AOutVal)^ := AVar;
          SizeOf(Word): PWord(@AOutVal)^ := AVar;
          SizeOf(Cardinal): PCardinal(@AOutVal)^ := AVar;
        else
          UnknownType;
        end;
      end else begin  // Is not unsigned
        case SizeOf(T) of
          SizeOf(ShortInt): PShortInt(@AOutVal)^ := AVar;
          SizeOf(SmallInt): PSmallInt(@AOutVal)^ := AVar;
          SizeOf(Integer): PInteger(@AOutVal)^ := AVar;
        else
          UnknownType;
        end;
      end;
    end;
    tkFloat: begin
      case SizeOf(T) of
        SizeOf(Single): PSingle(@AOutVal)^ := AVar;
        SizeOf(Double): PDouble(@AOutVal)^ := AVar;
        SizeOf(Extended): PExtended(@AOutVal)^ := AVar;
      else
        UnknownType;
      end;
    end;
    tkString: PShortString(@AOutVal)^ := ShortString(AVar);
    tkLString: PAnsiString(@AOutVal)^ := AnsiString(AVar);
    tkWString: PWideString(@AOutVal)^ := AVar;
    tkVariant: PVariant(@AOutVal)^ := AVar;
    tkInt64: begin
      if VarIsUnsigned(AVar) then
        PUInt64(@AOutVal)^ := AVar
      else
        PInt64(@AOutVal)^ := AVar;
    end;
    tkUString: PUnicodeString(@AOutVal)^ := AVar;
  else
    UnsupportedType;
  end;
end;

всем спасибо за идеи
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Generics Variant to Type
    #39889468
coolmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
var
  LVal: TValue;
begin
  ...
  LVal := TValue.FromVariant(MyVariantVariable);
  ...
...
Рейтинг: 0 / 0
2 сообщений из 27, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Generics Variant to Type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]