| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Приведение типов |
| Автор: Kbl4AH 20.1.2009, 14:48 | ||||
Здравствуйте.
Почему 2-я строка не работает, хотя 1-я - работает? Почему 3-я строка не работает, хотя 4-я - работает? И почему
|
| Автор: Alexeis 20.1.2009, 15:13 |
| Есть 2 понятия приведение типов и преобразование типов. 1) Например если юникодной строке присвоить анси строку, то выполниться преобразование типов. Создастся новая строка и символы будут преобразованы. Преобразование типов возможно только если есть функция преобразования (встроенная или нет). 2) Есть приведение типов. Приведение лишь говорит компилятору, что указанную область памяти нужно считать указанного типа. Например указатель можно преобразовать к LongInt, поскольку они одного размера. Но даже не смотря на это компилятор может накладывать ограничения на преобразования типов по смысловым соображениям. Делается это для того чтобы избежать ошибки при написании кода. Преобразование типов не следует использовать, кроме как в простейших случаях. Добавлено через 4 минуты и 18 секунд ShowMessage(string(O1)); - привет к краху программы, потому что типы несовместимы. Добавлено через 8 минут и 24 секунды Хотя если быть точным O1 := TObject(S); уже ошибка. Когда умрет программа это уже вопрос вероятности. |
| Автор: Alexeis 20.1.2009, 15:40 | ||||||
Рассмотрим код
и то что происходит на самом деле 1) я часть присвоение строк.
Команды lea eax,[ebp-$0c] и mov edx,[ebp-$08] передают аргументы в функцию WStrFromLStr, после чего происходит ее вызов call @WStrFromLStr В данном случае функция преобразования строк WStrFromLStr системная Второй пример
Загрузили значение адреса указателя в регистр eax mov eax,[ebp-$10], затем mov [ebp-$14],eax, записали эту величину в переменную типа LongInt. Это пример преобразования приведения типов одного размера. Внешне оба примера неотличимы, но чтобы знать что реально происходит нужно владеть языком. Во всех ваших примерах нет ни одного правильного преобразования, поскольку их просто не существует. В С++ преобразование типа также неотличимо от вызова конструктора. В Delphi начиная с версии 2007 также введена система преобразования типов для классов и записей. |
| Автор: Kbl4AH 20.1.2009, 15:51 |
| Мдя Хорошо, тогда по-другому... Мне нужна весчь типа TObject, которая могла бы хранить набор символов или число... И чтобы каким-то образом из этой весчи хранимую информацию можно было получить... Как этого достичь? |
| Автор: MetalFan 20.1.2009, 16:02 |
написать класс, который будет в себе хранить "набор символов или число" |
| Автор: Kbl4AH 20.1.2009, 16:14 | ||
А можно |
| Автор: MetalFan 20.1.2009, 16:33 | ||
| object pascal совсем не изучали? да хоть както так:
|
| Автор: Kbl4AH 20.1.2009, 16:40 |
Вы заставляете меня краснеть |
| Автор: Kbl4AH 20.1.2009, 20:19 | ||
Что-то у меня ничего не работает((( В чем же дело?
|
| Автор: bems 21.1.2009, 19:42 | ||
| ты создал только один объект. В результате (Memo1.Lines.Objects[I] as TAObject).Value это одно и то же для любого I Или передвинь создание объекта внутрь цикла, или и правда тут можно обойтись простым приведением:
|
| Автор: Kbl4AH 21.1.2009, 23:05 |
| Дело не в этом... я даже одно и тоже значение не могу прочесть((( |
| Автор: THandle 22.1.2009, 00:03 | ||||||
| Kbl4AH, Momo не поддерживает объекты. Посмотри тему: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=66586 В докозательство от меня попробуй вот эти два кода(в первом случае ListBox, во втором Memo): Сам класс:
ListBox:
Memo:
Memo и ListBox Должны быть заполнены естественно |
| Автор: Kbl4AH 22.1.2009, 10:06 |
| Ответы в ссылке прочитал... Так не честно Зато теперь узнал Действительно, пример с мемо выдает ошибку, а с листбоксом работает как надо. И все-таки, в данном случае можно использовать приведение типов или лучше этого не делать и использовать класс? THandle, Alexeis, MetalFan, bems, спасибо! |
| Автор: Alexeis 22.1.2009, 10:33 |
Это не мема виновата, это тянется от предка TStrings и есть во всех его потомках. Если что операция (Memo1.Lines.Objects[I] as TAObject).Value довольно медленная, но безопасная, в плане того что ничего ни где не затрешь. оператор as при каждом обращении будет производить проверку RTTI с тем чтобы удостовериться действительно указанный объект имеет тип TAObject, если нет, то он будет проверять всех его предков, если не найдет ни одного соответствующего предка то вернет nil и гарантированно произойдет при первом же обращении AV. |
| Автор: THandle 22.1.2009, 18:03 | ||||
Kbl4AH, твой случай(кстати зачем тут два цикла? можно и в один загнать)
Еще посмотри, может будет интересно: http://delphist.ru/privedenie-tipov/ Добавлено через 53 секунды Поэтому придумали еще и is |