Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразовать Integer в свой тип / 24 сообщений из 24, страница 1 из 1
01.05.2019, 15:07
    #39808844
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Есть некий свой тип
Код: pascal
1.
2.
type
  TTelegramUserType = (utUnknow = 0, utClient1, utClient2);



хочу сравнить integer и мой перечисляемый тип
Код: pascal
1.
2.
3.
4.
5.
Var
 TelegramUserType: TTelegramUserType;
begin
... 
   TelegramUserType := GetTelegramUserType();


GetTelegramUserType возвращает Integer.

По сути мой тип TTelegramUserType тоже целочисленный, т.к. utUnknow = 0, utClient1 = 1, а utClient2 = 2.
Но получаю ошибку о несовместимости типов, что вполне логично.

Можно ли как-то объявить свой тип TTelegramUserType, чтобы он был "совместим" с integer?
...
Рейтинг: 0 / 0
01.05.2019, 15:08
    #39808845
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
т.е. нужно что-то, обратное функции ORD()
...
Рейтинг: 0 / 0
01.05.2019, 15:12
    #39808846
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Т.е. сейчас приходится писать свой лисапет

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function IntToTelegramUserType(int: Integer): TTelegramUserType;
begin
  case int of
    0: TTelegramUserType.utUnknow;
    1: TTelegramUserType.utClient1;
    2: TTelegramUserType.utClient2;
  end;
end;



Т.е. нужно где-то как-то помнить, что если добавил новый тип utClient3, utClient4, то и процедуру переписать не забыть...
...
Рейтинг: 0 / 0
01.05.2019, 15:25
    #39808848
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11т.е. нужно что-то, обратное функции ORD()
Что-то, обратное функции Ord, называется приведением типов. Например, в данном случае

Код: pascal
1.
TelegramUserType := TTelegramUserType(GetTelegramUserType());
...
Рейтинг: 0 / 0
01.05.2019, 15:26
    #39808849
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Ну т.е. придется использовать свою самописную функцию?
...
Рейтинг: 0 / 0
01.05.2019, 16:05
    #39808866
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11,

А чем прямое преобразование типов не устраивает?
...
Рейтинг: 0 / 0
01.05.2019, 16:52
    #39808882
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
rgreat, ???
...
Рейтинг: 0 / 0
01.05.2019, 16:53
    #39808884
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
rgreat, ты имеешь ввиду то, как я написал?
function IntToTelegramUserType(int: Integer): TTelegramUserType;
...
..
.
?
...
Рейтинг: 0 / 0
01.05.2019, 17:14
    #39808891
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Привет.

X11
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function IntToTelegramUserType(int: Integer): TTelegramUserType;
begin
  case int of
    0: TTelegramUserType.utUnknow;
    1: TTelegramUserType.utClient1;
    2: TTelegramUserType.utClient2;
  end;
end;




Код: pascal
1.
2.
3.
4.
function IntToTelegramUserType( Value : integer ) : TTelegramUserType; register; assembler;
asm
     Nop
end;



С уважением, Polesov.
...
Рейтинг: 0 / 0
01.05.2019, 17:17
    #39808894
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
хм... если так просто, то почему искаропки нет такой функции?
...
Рейтинг: 0 / 0
01.05.2019, 17:19
    #39808896
pit_alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11,

просто значение integer приводить к своему типу
...
Рейтинг: 0 / 0
01.05.2019, 17:20
    #39808898
pit_alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Код: pascal
1.
2.
3.
4.
Var
  TelegramUserType: TTelegramUserType;
begin
  TelegramUserType := TTelegramUserType(IntVal);  
...
Рейтинг: 0 / 0
01.05.2019, 17:27
    #39808899
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
rgreatА чем прямое преобразование типов не устраивает?
Я пока в недоумении, то ли уважаемый коллега в честь праздника толсто троллит, то ли за тринадцать тысяч сообщений так и не удосужился открыть хоть какое-то руководство по используемому языку даже когда его прямо тыкают носом в нужную страницу.
...
Рейтинг: 0 / 0
01.05.2019, 17:28
    #39808900
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11хм... если так просто, то почему искаропки нет такой функции?
Потому, что компилятору надо как-то контролировать перечислимый тип (который содержится в регистре AL). А всяких типов может быть много.

Кстати, вот какой код генерится:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var
  t : TTelegramUserType;    // [EBP - 05h]
  i : integer;              // [EBP - 0Ch]
begin
  i := 0;

  t := IntToTelegramUserType( i );
{
    Mov     EAX,   [EBP - 0Ch]
    Call    IntToTelegramUserType
    Mov     [EBP - 05h],   AL
}

  t := TTelegramUserType( i );
{
    Mov     EAX,   [EBP - 0Ch]
    Mov     [EBP - 05h],   AL
}
...
Рейтинг: 0 / 0
01.05.2019, 17:34
    #39808903
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11rgreat, ???

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TTelegramUserType = (utUnknow = 0, utClient1, utClient2);

var
  x : integer;
  y : TTelegramUserType = utClient1;
begin
  x:=integer(y); // x=1
  y:=TTelegramUserType(2); // y=utClient2
end.
...
Рейтинг: 0 / 0
01.05.2019, 18:54
    #39808945
Голландец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11,

Серьёзно?
13 тысяч сообщений и спрашиваешь такую ерунду?
...
Рейтинг: 0 / 0
01.05.2019, 19:02
    #39808950
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
softwarerrgreatА чем прямое преобразование типов не устраивает?
Я пока в недоумении, то ли уважаемый коллега в честь праздника толсто троллит, то ли за тринадцать тысяч сообщений так и не удосужился открыть хоть какое-то руководство по используемому языку даже когда его прямо тыкают носом в нужную страницу.
Вотка, имхо, попалась несвежая.))
...
Рейтинг: 0 / 0
01.05.2019, 19:12
    #39808958
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
pit_alex
Код: pascal
1.
2.
3.
4.
Var
  TelegramUserType: TTelegramUserType;
begin
  TelegramUserType := TTelegramUserType(IntVal);  



отэто я стормозил


посыпаю голову пеплом
я же когда-то так делал уже в другом проекте
...
Рейтинг: 0 / 0
01.05.2019, 20:22
    #39808981
shonli95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Просто объяви в функции GetTelegramUserType тип возврата TTelegramUserType
...
Рейтинг: 0 / 0
01.05.2019, 20:35
    #39808982
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
shonli95, просто данные из базы FieldByName('').AsInteger.
Я же в базе не смогу вставить свой тип
...
Рейтинг: 0 / 0
01.05.2019, 20:44
    #39808987
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
X11,

Можешь. Если задашь ID типа и таблицу - справочник типов.
...
Рейтинг: 0 / 0
01.05.2019, 22:12
    #39808999
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Если хотите писать в функциональном стиле, то
Код: 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.
{$SCOPEDENUMS ON}

type
  TTelegramUserType = (Unknow, Client1, Client2);

  TTelegramUserTypeHelper = record helper for TTelegramUserType
  public
    class function FromInteger(const aValue: Int32): TTelegramUserType; static; inline;
  public
    function AsInt32: Int32; inline;
  end;

{ TTelegramUserTypeHelper }

function TTelegramUserTypeHelper.AsInt32: Int32;
begin
  Exit(Int32(Self));
end;

class function TTelegramUserTypeHelper.FromInteger(
  const aValue: Int32): TTelegramUserType;
begin
  Exit(TTelegramUserType(aValue));
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  var Value1 := 2;
  var Value2 := TTelegramUserType.FromInteger(Value1);
  var Value3 := Value2.AsInt32();
end;



Либо можно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TFieldHelper = class helper for TField
  public
    function AsTelegramUserType: TTelegramUserType; inline;
  end;
{ TFieldHelper }

function TFieldHelper.AsTelegramUserType: TTelegramUserType;
begin
  Exit(TTelegramUserType(AsInteger));
end;

var Value4 := FDQuery1.FieldByName('aaa').AsTelegramUserType();



Ну или если читабельность важнее десятка тактов процессора, и перечислимых типов много, а писать под каждый функцию лень, то
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 TFieldHelper = class helper for TField
  public
    function AsEnumeration<T {: enum}>: T; inline;
  end;

function TFieldHelper.AsEnumeration<T>: T;
var
  Value: TValue;
begin
  var Temp := AsInteger;

  TValue.Make(@Temp, TypeInfo(T), Value);
  Exit(Value.AsType<T>());
end;

var Value4 := FDQuery1.FieldByName('aaa').AsEnumeration<TTelegramUserType>()

...
Рейтинг: 0 / 0
01.05.2019, 22:18
    #39809001
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
Ого, круто
...
Рейтинг: 0 / 0
01.05.2019, 23:00
    #39809010
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать Integer в свой тип
А можно и еще круче.

Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
program Project10;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, RTTI;

type
  TTelegramUserType = (utUnknow = 0, utClient1, utClient2);

  TTelegramUserTypeRec = record
    Value : TTelegramUserType;
    class operator Implicit(A : TTelegramUserTypeRec) : integer;
    class operator Implicit(A : integer) : TTelegramUserTypeRec;
    class operator Implicit(A : TTelegramUserTypeRec) : TTelegramUserType;
    class operator Implicit(A : TTelegramUserType) : TTelegramUserTypeRec;
    class operator Implicit(A : TTelegramUserTypeRec) : string;
  end;

{ TTelegramUserTypeHelper }

class operator TTelegramUserTypeRec.Implicit(A: TTelegramUserTypeRec): integer;
begin
  Result:=integer(A.Value);
end;

class operator TTelegramUserTypeRec.Implicit(A: integer): TTelegramUserTypeRec;
begin
  Result.Value:=TTelegramUserType(A);
end;

class operator TTelegramUserTypeRec.Implicit(A: TTelegramUserType): TTelegramUserTypeRec;
begin
  Result.Value:=A;
end;

class operator TTelegramUserTypeRec.Implicit(A: TTelegramUserTypeRec): TTelegramUserType;
begin
  Result:=A.Value;
end;


class operator TTelegramUserTypeRec.Implicit(A: TTelegramUserTypeRec): string;
begin
  Result:=TRttiEnumerationType.GetName(A.Value);
end;

var
  int : integer = 2;
  X   : TTelegramUserTypeRec;

begin
  X:=utClient1;
  Writeln(string(X));
  X:=Int;
  Writeln(string(X));
  Int:=X;
  Writeln(int);

  Readln;
end.



Код: plaintext
1.
2.
utClient1
utClient2
2
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразовать Integer в свой тип / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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