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

Вниз

Как совместить ShortString с множеством?   Найти похожие ветки 

 
MaXie   (2002-03-22 11:20) [0]

Почему не проходит следующий код?

type
TEcf = (TEdit, TMaskEdit);
TECFSet = set of TEcf;
var
ECFSet : TECFSet;
begin
ECFSet := [TEdit, TMaskEdit];
with Edit6 do
begin
if ClassName in ECFSet then
begin
Enabled := True;
Color := clWindow;
Font.Color := clWindowText
end
end;
...

Функция ClassName возвращает имя класса элемента Edit6. Тип результата, возвращаемого функцией, ShortString. При прогоне выдается ошибка о несовместимости типов. Как граммотно скорректировать код, чтобы можно было проверять относится ли тот либо иной элемент к определенной категории?


 
Alx2   (2002-03-22 11:32) [1]

Так TEcf - перечислимый тип, а не ShortString
Сделать можно так
Var
ECFSet : TStringList;
begin
ECFSet := TStringList.create;
try

With ECFSet do
begin
Sorted := true;
Add("TEdit");
Add("TMaskEdit");
end;
with Edit6 do
begin
if ECFSet.IndexOf(ClassName)>-1 then
begin
........
end;
finally
ECFSet.Free;
end;
end;


 
Digitman   (2002-03-22 11:48) [2]

только так :

if Edit6 is TEdit then...
...
else if Edit6 is TMaskEdit then
...


 
Alx2   (2002-03-22 11:55) [3]

Почему только так?


 
Юрий Зотов   (2002-03-22 12:06) [4]

Попробуйте просто заменить ClassName на ClassType и больше ничего не менять (разве что может потребоваться приведение ссылки к Integer).


 
MaXie   (2002-03-22 12:15) [5]

>Alex2 - отдельное спасибо! Всякий раз выручаешь!


 
Digitman   (2002-03-22 12:16) [6]

>Alx2
Да потому что изначально неразумно для сей задачи использовать строковые ф-ции и преобразования. Вся необходимая инф-ция в о классах в целочисленном виде уже имеется в RTTI. Сегодня у автора "мн-во" из только двух "классов", а завтра захочет добавить туда еще сотню-другую


 
Alx2   (2002-03-22 12:25) [7]

>Digitman © (22.03.02 12:16)
Во-первых, я всегда отталкиваюсь от приведенного автором кода и вношу, по возможности, минимальную правку.
Во-вторых к "сотне-другой" классов указанный подход в стиле "только так" приведет к сотне-другой if ... else - работа для машинистки.
В-третьих. Так как она хранится в целочисленном виде в RTTI разумнее использовать для сотни-другой сортированный массив с элементами, полученными из ClassType и искать нужное в нем.
В-четвертых. Не люблю безкомпромиссности.


 
Alx2   (2002-03-22 12:27) [8]

В пятых. Слово "безкомпромиссности" читайте как "бескомпромиссности" :))


 
Digitman   (2002-03-22 12:39) [9]

>Alx2
Да на здоровье) .. Ты высказал свое, а я свое мнение)


 
PVOzerski   (2002-03-22 12:40) [10]

Ребята, а вы в одно обстоятельство в приведённом коде въехали?
После того, как человек объявил,
TEcf = (TEdit, TMaskEdit);
он фактически переопределил TEdit, TMaskEdit, дав этим
словам другой смысл. BTW, он мог бы написать и
TEcf = (writeln, readln);
и формально это действие было бы правомочно, только смысл
writeln и readln поменялся бы. Естественно, сравнивать "новые"
TEdit и TMaskEdit с таковыми от VCL невозможно (открою "страшную тайну": TEdit и TMaskEdit после объявления типа TEcf стали просто 0 и 1, а количество занимаемых ими байтов зависит от значения {$Z}, но даже если оно 4, никакого отношения к соответствующим class of tEdit здесь нет).

Можно сотворить такое:
type
tEditClass=class of tEdit;
tEcf=(tEditID,tMaskEditID);
const
EcfID:array[tECF]of tEditClass=(tEdit,tMaskEdit);

и дальше маяться, сравнивая элементы массива с интересующим объектом через is, потом проверять вхождение подходящего индекса
массива в множество... Но, IMHO, этот огород городить не надо:
сочетание or и is безо всяких новых типов и множеств решит все проблемы!


 
Alx2   (2002-03-22 12:57) [11]

>MaXie © (22.03.02 11:20)
А код все-таки перепиши как посоветовал Digitman. Для конкретной задачи это оптимально (но не в общем случае :) ).


 
Digitman   (2002-03-22 13:10) [12]

>PVOzerski
Ну, почему же) "Въехали" ...только проще ж код другой привести было, чем об азах OP лекцию читать



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
1-99
Ivan_A
2002-03-21 03:11
2002.04.01
Как получить доступ к модулю данных из DLL?


14-286
AriokH
2002-02-17 22:00
2002.04.01
Просто вопрос


1-110
Aleksandr
2002-03-19 12:38
2002.04.01
Базовый вопрос: корректно ли в дестракторе нилить указатель на объект?


3-8
Андре
2002-03-04 12:10
2002.04.01
BLOB


4-350
MrAngel
2002-01-28 16:58
2002.04.01
Shell Creating - вечная проблема. Часть вторая.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский