Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.01;
Скачать: CL | DM;

Вниз

Как совместить 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
1-171
Beginer
2002-03-19 11:28
2002.04.01
Новое свойство формы


1-188
madburro
2002-03-18 23:15
2002.04.01
Print


14-316
mr_X
2002-02-13 17:24
2002.04.01
Кто подскажет, кто расскажет где можно взять файлы ресурсов, иконки всякие bmp-шки и т. п.


3-60
ak
2002-03-06 15:41
2002.04.01
Счётчик в DBGrid


1-177
Сатир
2002-03-19 18:01
2002.04.01
Получение списка установленных компонент