Главная страница
    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.01 c
15-1213185737
Ega23
2008-06-11 16:02
2008.07.27
Своё cmd-окошко


15-1213205776
@!!ex
2008-06-11 21:36
2008.07.27
Помогите сделать ассерт на С++


15-1212446696
alex-drob
2008-06-03 02:44
2008.07.27
Где написать код, чтобы он выполнился после загрузки программы


15-1213379049
@!!ex
2008-06-13 21:44
2008.07.27
Подскажите IDE для C++ под Linux


15-1213250723
savyhinst
2008-06-12 10:05
2008.07.27
компонент для icq





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