Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование элементов набора Set (set of), Элемент набора одного типа в другой 
V
    Опции темы
Doga
Дата 5.2.2013, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



Всем привет.

Есть классический набор 
TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble, ssTouch, ssPen);
объявленный в модуле Classes.

Есть другой набор, объявленный следующим образом:
TControlKeys = set of (ssShift, ssAlt, ssCtrl);

В предыдущих моих IDE, вплоть до Delphi 2007 включительно, проблем с преобразованием элементов 
набора одного типа в другой не было.

Код

uses
  Classes;  

//...

type
TControlKeys = set of (ssShift, ssAlt, ssCtrl);

//...

var FControlKeys:TShiftState;

//...

procedure SetControlKeys(const V : TControlKeys);
begin
 FControlKeys := [ssLeft] + TShiftState(V);
end;

function GetControlKeys : TControlKeys;
var S:TShiftState;
begin
 S := FControlKeys - [ssLeft];
 Result := TControlKeys(S);
end;


Однако, после перехода на Delphi XE, все попытки явного переобразования 
элементов одного типа в другой (TShiftState(V) ,  TControlKeys(S), ...) приводят 
лишь к сообщениям компилятора об ошибке: 
Цитата
[DCC Error] module_name.pas(17): E2089 Invalid typecast


Как же это правильно сделать в Delphi XE ?

Это сообщение отредактировал(а) Doga - 6.2.2013, 17:57
PM MAIL WWW   Вверх
gesper
Дата 6.2.2013, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



Попробуй через Integer/Variant кастануть.

TShiftState - Integer - TControlKeys
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
bems
Дата 6.2.2013, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Дело в количестве возможных элементов множества. Пока в TShiftState менее девяти возможных элементов SizeOf(TShiftState) будет равен SizeOf(TControlKeys) и приведение будет возможно. А в ХЕ туда добавлены элементы, и SizeOf(TShiftState) теперь дает 2 байта, а SizeOf(TControlKeys) все еще один


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Doga
Дата 6.2.2013, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



gesper:  К сожалению, и Integer(V) и Variant(V) вызывают ту же ошибку - E2089 Invalid typecast  :(

bems: Да, теперь понятно почему.  В С++ такое преобразование проблем не вызывает. 
Но как быть здесь? И почему тогда не работает Variant(V) ?

Это сообщение отредактировал(а) Doga - 6.2.2013, 18:34
PM MAIL WWW   Вверх
Чучмек
Дата 6.2.2013, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Попробуй так
Код

var
 ShiftState:TShiftState;
 ControlKeys:TControlKeys ;
begin
  word(ShiftState) :=byte(ControlKeys);

// и на оборот
 
 byte(ControlKeys):=word(ShiftState);



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
bems
Дата 6.2.2013, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Doga @  6.2.2013,  18:06 Найти цитируемый пост)
И почему тогда не работает Variant(V) ?

наверное потому что 
Цитата(http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/varianttypes_xml.html)
By default, Variants can hold values of any type except records, sets, static arrays, files, classes, class references, and pointers




--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 7.2.2013, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  6.2.2013,  18:05 Найти цитируемый пост)
Дело в количестве возможных элементов множества. Пока в TShiftState менее девяти возможных элементов

offtop, конечно. Но даже восемь "возможных элементов множества" не гарантирует, что это множество влезет в один байт.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Doga
Дата 7.2.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



Всем спасибо  smile .

Всё понятно. В свете вышесказанного, реализации этих функций мне кажутся теперь не совсем правильными, 
т.к. фактически зависят от версии VCL (это я ещё до XE3 не добрался...) 

Однако, как временное решение меня устраивает вариант предложенный Чучмеком:
Код

//...
FControlKeys := [ssLeft] + TShiftState(word(byte(V)));
//...
Result := TControlKeys(byte(word(S)));

За что ему отдельное THX  smile .
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.