Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Вниз

Оператор Is   Найти похожие ветки 

 
TStas ©   (2008-06-29 23:19) [0]

Жизнь сложилась так, что потребовалось хранить в вариантах указатели на объекты. Естественно, что хотелось бы перед использованием проверять, а туда ли, куда нужно, они указывают. Раньше я во-первых, никогда не пользовался просто вариантом, только OLEVariant"ом, а, во-вторых, как-то не задумывался, как же работает оператор Is.
Вот, решил провести простой эксперимент.  Есть окно, на окне SpinEdit и кнопочка. В OnCreate окна написано SpinEdit1.Value := Integer(TstringList.Create); Ну, то есть, создаю список строк, привожу его к целому числу и вписываю в эдит.
А вот дальше. Есть кнопка. Вот ейный обработчик
procedure TForm1.Button1Click(Sender: TObject);
var
 x: TObject;
begin
 x := TObject(SpinEdit1.Value);
 if x is TStringList then ShowMessage("x is TStringList = True") else ShowMessage("x is TStringList = False");
end;
Сейчас получается, что при щелчке на кнопку, если не изменялось значение в СпинЕдите, то выдается Тру, а если изменялось, то возникает ошибка.
Раньше я пробовал писать x: TStringList; Тогда всегда было "Да". Даже если я изменял значения, вписанные в СпинЕдит.
Как же всё-таки Is работает? Ведь, судя по всему, где-то есть класс, и проверяется указатель на него?


 
Игорь Шевченко ©   (2008-06-30 00:32) [1]

Казалось бы причем тут варианты ?


> Раньше я пробовал писать x: TStringList; Тогда всегда было
> "Да"


Потому что компилятор в этом случае генерировал только проверку на nil.
А когда ты объявляешь как TObject, то компилятор генерирует код вызова оператора Is.


 
Palladin ©   (2008-06-30 08:40) [2]


> Сейчас получается, что при щелчке на кнопку, если не изменялось
> значение в СпинЕдите, то выдается Тру, а если изменялось,
>  то возникает ошибка.

не "если не изменялось", а если там 0, что является по совместительству значением Nil

Is - оперирует данными класса объекта


 
ЮЮ ©   (2008-06-30 09:31) [3]

> если не изменялось значение в СпинЕдите, то выдается Тру,
> а если изменялось, то возникает ошибка.


Если изменишь SpinEdit1.Value, то получишь невалидный адрес, который ни в коем случае нельзя приводить к TObject


> Раньше я пробовал писать x: TStringList; Тогда всегда было
> "Да".


Не верю! TSpinEdit от TStringList-а в этом смысле ничем не отличаются.

И, кстати, не одного варианта в эксперименте над вариантами.


 
Игорь Шевченко ©   (2008-06-30 09:36) [4]


> Не верю!


проверь


 
Сергей М. ©   (2008-06-30 10:14) [5]


> потребовалось хранить в вариантах указатели на объекты


Так а зачем же тогда эти эксперименты с приведением указателя к типу Integer ?
Варианты ведь имеют для этой цели вполне подходящий тип - Pointer ..


 
Плохиш ©   (2008-06-30 10:47) [6]


> TStas ©   (29.06.08 23:19)  


> SpinEdit1.Value := Integer(TstringList.Create); Ну, то есть,
>  создаю список строк, привожу его к целому числу и вписываю
> в эдит.
> А вот дальше. Есть кнопка. Вот ейный обработчик
> procedure TForm1.Button1Click(Sender: TObject);
> var
>  x: TObject;
> begin
>  x := TObject(SpinEdit1.Value);
>  if x is TStringList then ShowMessage("x is TStringList
> = True") else ShowMessage("x is TStringList = False");
> end;
> Сейчас получается, что при щелчке на кнопку, если не изменялось
> значение в СпинЕдите, то выдается Тру, а если изменялось,
>  то возникает ошибка.


Что-то мне подсказывает, что это вполне логично...


 
ЮЮ ©   (2008-06-30 11:08) [7]

> [4] Игорь Шевченко ©   (30.06.08 09:36)
> > Не верю!
> проверь


Проверил :) TObject(<битый указатель>) is TStringList тоже даеё ошибку.


 
Игорь Шевченко ©   (2008-06-30 11:18) [8]


> Проверил :) TObject(<битый указатель>) is TStringList тоже
> даеё ошибку.


var x: TStringList;
begin
 x := TStringList(SpinEdit1.Value);
 if x is TstringList then
   ...

вот это проверь


 
ЮЮ ©   (2008-06-30 11:44) [9]

> вот это проверь


Понятно. Так даже не додумался :) Ибо, если ожидается объект одного класса, то и сам is использовать бы не стал, а проверял ьы на 0 (nil).


 
Игорь Шевченко ©   (2008-06-30 12:36) [10]


> Ибо, если ожидается объект одного класса, то и сам is использовать
> бы не стал, а проверял ьы на 0 (nil).


вот компилятор аналогично считает  :)


 
TStas ©   (2008-06-30 23:38) [11]

Да, приведение битого указателя даёт не Фолс, а именно исключение.
Прямое присвоение x(: Variant) := TStringList даёт ошибку. Проблема решена без использования вариантов.
Задача возникла очень просто: была программа, появилась идея к ней кое-что приделать. Так строка превратилась в список строк и появилась идея заменить строку вначале вариантом (успешно сделано), а вариант - списком строк. (Не вышло).


 
Palladin ©   (2008-06-30 23:51) [12]


>приведение битого указателя даёт не Фолс, а именно исключение

какая свежая мысль...


>Задача возникла очень просто: была программа, появилась идея к ней кое-что приделать.

и всем сразу стало понятно при чем здесь варианты...

особенно ясно это стало когда строка размножилась



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

Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
2-1214411405
Trange
2008-06-25 20:30
2008.07.27
Картинка в TMenuItem


2-1214061434
TForumHelp
2008-06-21 19:17
2008.07.27
POST запрос


2-1214593880
DmitriyG.
2008-06-27 23:11
2008.07.27
Проблема вызова COM из dll


15-1213271856
SKIPtr
2008-06-12 15:57
2008.07.27
подключение сети между виртуальными компьюторами


15-1213086652
Alexander
2008-06-10 12:30
2008.07.27
DBGrid с поддержкой Unicode





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