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

Вниз

Оператор 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.007 c
15-1213178784
Омлет
2008-06-11 14:06
2008.07.27
Программа для работы с гениалогическим древом


15-1213363130
ply
2008-06-13 17:18
2008.07.27
установить компонент TRotateImage


15-1212823588
lead-in
2008-06-07 11:26
2008.07.27
в Wind`е знаки вопроса


2-1214560127
Муслик
2008-06-27 13:48
2008.07.27
Записи в таблице


2-1214313276
implementation
2008-06-24 17:14
2008.07.27
Двойной клик по фиксированной ячейке в TStringGrid.





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