powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразовать Integer в свой тип
24 сообщений из 24, страница 1 из 1
Преобразовать Integer в свой тип
    #39808844
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некий свой тип
Код: 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
Преобразовать Integer в свой тип
    #39808845
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. нужно что-то, обратное функции ORD()
...
Рейтинг: 0 / 0
Преобразовать Integer в свой тип
    #39808846
Фотография 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;



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

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

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

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
Преобразовать Integer в свой тип
    #39808894
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... если так просто, то почему искаропки нет такой функции?
...
Рейтинг: 0 / 0
Преобразовать Integer в свой тип
    #39808896
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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

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



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


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

Можешь. Если задашь ID типа и таблицу - справочник типов.
...
Рейтинг: 0 / 0
Преобразовать Integer в свой тип
    #39808999
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хотите писать в функциональном стиле, то
Код: 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
Преобразовать Integer в свой тип
    #39809001
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого, круто
...
Рейтинг: 0 / 0
Преобразовать Integer в свой тип
    #39809010
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно и еще круче.

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


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