Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.04.02;
Скачать: [xml.tar.bz2];

Вниз

TypeCast: Set Of TEnum~ -> Cardinal   Найти похожие ветки 

 
Сергей   (2015-07-29 10:21) [0]

Уточнял тут, но почему-то внезапно закрыли: http://delphimaster.net/view/2-1396021466/

> [57] А зачем ты в чужой ветке создаешь свои посты ? Создай свою ветку.

Да потому что вопрос можно сказать идентичен. Ну ок, как скажете, создаю свою ветку, точно такую же. Давайте плодить одинаковые темы. =/

В чужих классах есть read-only property, которые возвращают Set Of TEnum***.
Есть функция экспортированная из чужой DLL, принимающая одним из входящих Cardinal. Требуется передавать туда эти property.
У одного класса SizeOf(property)=4. И прекрасно работает приведение типа через Integer(AnObject.property).
У другого класса SizeOf(property)=1. У третьего SizeOf(property)=2. И тогда выдаёт "[Error] Invalid typecast".

Как мне сделать typecast?

> [53] Что-то не смог нагуглить термин "стриминг сета/множества"... Что вы имели ввиду?


 
Игорь Шевченко ©   (2015-07-29 10:26) [1]

Что-то у тебя все чужое...А Enum-то большой чужой ?


 
Сергей   (2015-07-29 12:48) [2]

Конечно чужой. Просто как пример возьмём - "TForm.Anchors". Его SizeOf() равен 1. Я могу влезть в описание типа TAnchors и добавить "z_last=31"? Вообще теоретически-то могу, но это будет очень неправильно.
Примерно такая же ситуация у меня. Поменять описание множества я не могу. Менять заголовок функции в DLL тоже. Надо приводить то что есть к Cardinal или к Integer.
Хочется обойтись без костылей, и как-то красиво учинить TypeCast, без доп.функций, доп.переменных, Case"ов и прочего.

> Rouse_ ©   (25.07.15 17:57) [51]
> Как вариант, можно делать стриминг сета и передавать его, тогда обойдещь проблему с размерностью


Не понял термина, нагуглить по этим словам не смог. Поясните пожалуйста, что вы имели ввиду?


 
кгшзх ©   (2015-07-29 12:54) [3]

биты которые раньше лежали в сете (в 32 байтах) - перетащить в кардинал (32 бита)


 
Сергей   (2015-07-29 13:53) [4]

ох... 32 байта - это максимальная вместимость сета. Взятый для примера "TForm.Anchors" лежит в одном байте. И компилятор отказывается кастовать 1 байт сета в 4 байта Cardinal.
При том что 4 байта сет (например "TOpenDialog.Options") спокойно кастуются и в Cardinal и в Integer.


 
sniknik ©   (2015-07-29 14:32) [5]

> И компилятор отказывается кастовать 1 байт сета в 4 байта Cardinal.
не преобразованием единым... главное самому не влезть в "не свои" байты, там продолжение переменных/код/что угодно

procedure TForm1.Button1Click(Sender: TObject);
var
 a: TAnchors;
 i: Cardinal absolute a;
begin
 a:= Form1.Anchors;

 Memo1.Text:= IntToStr(SizeOf(a)) + " " + IntToStr(SizeOf(i)) + " - " + IntToStr(i);
end;


 
кгшзх ©   (2015-07-29 14:55) [6]

ох... 32 байта - это максимальная вместимость сета.

не пойму, ты наркоман штоли?
твой сет с последним членом 31 имеет мощность 32
твой енум, если вывести всем его элементам ord(),  покажет 0..32
в сете (в любом) эти элементы будут отображаться на непрерывный кусок битов, и битов этих будет ровно 32.
и все эти биты влезают в кардинал.

что тебе и надо проделать.


 
Игорь Шевченко ©   (2015-07-29 15:24) [7]


> Надо приводить то что есть к Cardinal или к Integer.


http://stackoverflow.com/questions/9553510/how-to-save-load-set-of-types


 
кгшзх ©   (2015-07-29 15:39) [8]

а так как множество растет снизу вверх, то можно тупо нацелить PCardinal на адрес сета.

на примере множества длиной 8

type
TMyEnum = (me0,me1,me2,me3,me4,me5,me6,me7);
PMySet  = ^TMySet;
TMySet = set of TMyEnum;

procedure TForm1.Button1Click(Sender: TObject);
var ms : TMySet; pms : PMySet; me : TMyEnum; pb : PByte; b : byte;
begin
for me := Low(TMyEnum) to High(TMyEnum) do
 Include(ms,me);
//исключаем одного
Exclude(ms,me5);

pb := @ms;
ShowMessage(IntToStr(pb^));

//Копируем
b := pb^;
//Приводим
pms := @b;

//Проверяем
if not (me5 in pms^) then
 ShowMessage("ку ку!");
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
3-1313067737
amamed_3071
2011-08-11 17:02
2017.04.02
Upgate SQL 2005 Expression to SQL 2005 Enterprice


2-1438758605
lewka
2015-08-05 10:10
2017.04.02
Полная загрузка страницы в Twebbrowser


2-1438328592
Pavelnk
2015-07-31 10:43
2017.04.02
Перекинуть edit в буфер


2-1438182677
Pavelnk
2015-07-29 18:11
2017.04.02
Нажать Enter


15-1459700405
K-1000
2016-04-03 19:20
2017.04.02
Queue. Объясните, чего ему ещё надо?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский