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

Вниз

Как работать с неизвестным типом данных?   Найти похожие ветки 

 
jiurasic ©   (2004-04-24 18:18) [0]

Есть компонент, у которого одно из свойств может принимать фиксированные значения.Эти значения не согласуются ни с одним из типов данных дельфи. Как мне посмотреть равно ли данное значение чему-либо.

Cв-во имеет вид:

type TCellBorderStyle = (cbsNone,cbsThin,cbsMedium,cbsDashed,cbsDotted,cbsThick,
                        cbsDouble,cbsHair,cbsMediumDashed,cbsDashDot,cbsMediumDashDot,
                        cbsDashDotDot,cbsMediumDashDotDot,cbsSlantedDashDot);

Вот мне к примеру необходиму узнать имеет ли оно значение "cbsThin"
Это должно выглядеть примерно:
If CellBorderStyle="cbsThin" then ...

Как это реализовать?


 
Игорь Шевченко ©   (2004-04-24 18:22) [1]


> if CellBorderStyle="cbsThin"


var
 CellBorderStyle: TCellBorderStyle;
...
 if CellBorderStyle = cbsThin then
   ...


 
jiurasic ©   (2004-04-24 18:37) [2]

Так не получается т.к. Delphi не знает что такое : TCellBorderStyle, так что таким образом переменную обьявить не удается


 
DVM ©   (2004-04-24 18:39) [3]


> Так не получается т.к. Delphi не знает что такое : TCellBorderStyle

Объявите этот тип и все всё будут знать.


 
jiurasic ©   (2004-04-24 18:47) [4]

Пробовал следующем образом:

private
   function ColToText(Col: integer): string;
 public
   { Public declarations }
 end;

type TCellBorderStyle = (cbsNone,cbsThin,cbsMedium,cbsDashed,cbsDotted,cbsThick,
                       cbsDouble,cbsHair,cbsMediumDashed,cbsDashDot,cbsMediumDashDot,
                       cbsDashDotDot,cbsMediumDashDotDot,cbsSlantedDashDot);


var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

.....

aaa:TCellBorderStyle;

Begin
If ......BorderLeftStyle =aaa then

Delphi выдает ошибку:э
Main.pas(103): Incompatible types: "CellFormats.TCellBorderStyle" and "Main.TCellBorderStyle"

Видимо я что-то делаю не так. Что?


 
Nikolay M. ©   (2004-04-24 18:53) [5]

Тип TCellBorderStyle объявлен два раза: в модуле Main и CellFormats. Подозреваю, что первое объявление - лишнее.


 
jiurasic ©   (2004-04-24 19:01) [6]

нет, дело не вэтом


 
Nikolay M. ©   (2004-04-24 19:30) [7]


> нет, дело не вэтом

Откуда уверенность?


 
DVM ©   (2004-04-24 21:27) [8]

Дело в параноидальности Делфи местами. Иногда компилятор считает разными абсолютно одинаковые типы. Выкрутиться можно.
TCellBorderStyle вынести наружу из того класса, где он сейчас находится.


 
Jack128 ©   (2004-04-24 22:03) [9]


> Дело в параноидальности Делфи местами. Иногда компилятор
> считает разными абсолютно одинаковые типы.
Пример, пожалуйста.


> jiurasic ©  
uses Windows, ..., CellFormats;


 
Юрий Зотов ©   (2004-04-24 23:10) [10]

> DVM © (24.04.04 21:27) [8]
> Дело в параноидальности Делфи местами

Подобные утверждения звучали на этом форуме очень много раз. Но потом почему-то выяснялось, что дело вовсе не в Delphi, а в ее незнании.

Что касается сабжа, то это именно тот случай.

> jiurasic ©   (24.04.04 19:01) [6]
> нет, дело не в этом

Как раз в этом все дело и есть.


 
evvcom ©   (2004-04-24 23:48) [11]


> TCellBorderStyle вынести наружу из того класса, где он сейчас
> находится.


Вообще-то типы внутри класса не объявляются.


 
DVM ©   (2004-04-25 00:01) [12]


> Вообще-то типы внутри класса не объявляются.

Сорри, я выразился некрасиво. Имелось ввиду вынести описание этого типа из того модуля в котором тот класс в отдельный модуль.


> Jack128 ©   (24.04.04 22:03) [9]
>
> > Дело в параноидальности Делфи местами. Иногда компилятор
>
> > считает разными абсолютно одинаковые типы.
> Пример, пожалуйста.

Пример:
var
 a:^integer;
 b:^integer;
....
a:=b; // несовместимость по типу. Странно ведь да. В C++ такого нет. Вот что я назвал параноидальностью - строгую (излишне?) типизацию.


 
DrPass ©   (2004-04-25 00:08) [13]


> Вот что я назвал параноидальностью - строгую (излишне?)
> типизацию.

Это не излишне строгая типизация, а всего лишь приучение к хорошему стилю программирования :)
Что касается сабжа, проблема решается всего лишь явным приведением типов


 
evvcom ©   (2004-04-25 00:10) [14]

^integer и ^integer действительно считаются разными типами, но это не паранойя Дельфи. По-твоему, что компилятору только и делать, что сравнивать, а на что похож новый, только что объявленный тип?

Стандартно в Дельфи объявлен тип
type
 PInteger = ^Integer;

Поэтому не надо изобретать велосипед и попросту объявляй a и b переменными типа PInteger.


 
Германн ©   (2004-04-25 02:19) [15]

По-моему (продолжаем телепировать), более всего прав Jack128 ©   (24.04.04 22:03) [9]
Всего лишь нужно в uses указать тот модуль, в котором описан сей тип!


 
Юрий Зотов ©   (2004-04-25 07:52) [16]

> DrPass ©   (25.04.04 00:08) [13]

> Вот что я назвал параноидальностью - строгую (излишне?)
> типизацию.

А я бы назвал это огромным достоинством. Если я хочу сделать типы A и B совместимыми, то никто не мешает мне объявить для них общий тип. А вот как быть, если я хочу сделать их как раз несовместимыми? В Паскале это делается запросто. Запросто можно работать и с несовместимыми типами, приведя их к общему в явном виде.

Строгая типизация - это не ограничение Ваших возможностей (их никто и не ограничивает), а страховка Вас же от ошибок. Молиться надо, что она есть. И это Вам скажет любой, кто не поспал недельку-другую в поисках неизвестно откуда взявшейся ошибки, вызванной неаккуратной работой с данными разных типов при их автоматическом приведении.



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
3-1079424841
Inkotex
2004-03-16 11:14
2004.04.11
Bookmark


4-1079505816
rimd
2004-03-17 09:43
2004.04.11
GetKeyboardLayoutName()


14-1082303574
Шишкин Илья
2004-04-18 19:52
2004.04.11
Проблемы с процессором


3-1079414994
truntaev
2004-03-16 08:29
2004.04.11
Как закрыть паролем базу в Interbase?


1-1082660847
Боян Георгиев
2004-04-22 23:07
2004.04.11
Курсор