Форум: "Начинающим";
Текущий архив: 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 на адрес сета.
на примере множества длиной 8type
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.002 c