Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 лекцию читать




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




Наверх





Память: 0.74 MB
Время: 0.022 c
3-33              solsoft               2002-03-06 13:43  2002.04.01  
Нет доступа к Access через BDE


1-210             AlexMey               2002-03-20 12:40  2002.04.01  
Как определить координаты курсора?


1-128             oomneeq               2002-03-21 12:26  2002.04.01  
Как управлять включением TD32 Debug Info


1-94              qqshka                2002-03-21 12:36  2002.04.01  
Аргументы командной строки


3-27              staratel              2002-03-05 08:52  2002.04.01  
базы данных (DBGrid)