Форум: "Основная";
Текущий архив: 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