Главная страница
    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.009 c
1-160
Yuri Btr
2002-03-22 13:05
2002.04.01
Clipboard


3-21
PeteDM
2002-03-05 16:54
2002.04.01
Interbase


1-95
Nick_Torshin
2002-03-21 13:06
2002.04.01
Передача string из Delphi в VC++


1-223
MaXie
2002-03-20 12:50
2002.04.01
Массив объектов.


3-22
Dimonka
2002-03-06 10:39
2002.04.01
Ошибка в запросе!





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