![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Kbl4AH |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
Здравствуйте.
Почему 2-я строка не работает, хотя 1-я - работает? Почему 3-я строка не работает, хотя 4-я - работает? И почему
Это сообщение отредактировал(а) Kbl4AH - 20.1.2009, 14:53 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Есть 2 понятия приведение типов и преобразование типов.
1) Например если юникодной строке присвоить анси строку, то выполниться преобразование типов. Создастся новая строка и символы будут преобразованы. Преобразование типов возможно только если есть функция преобразования (встроенная или нет). 2) Есть приведение типов. Приведение лишь говорит компилятору, что указанную область памяти нужно считать указанного типа. Например указатель можно преобразовать к LongInt, поскольку они одного размера. Но даже не смотря на это компилятор может накладывать ограничения на преобразования типов по смысловым соображениям. Делается это для того чтобы избежать ошибки при написании кода. Преобразование типов не следует использовать, кроме как в простейших случаях. Добавлено через 4 минуты и 18 секунд ShowMessage(string(O1)); - привет к краху программы, потому что типы несовместимы. Добавлено через 8 минут и 24 секунды Хотя если быть точным O1 := TObject(S); уже ошибка. Когда умрет программа это уже вопрос вероятности. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Рассмотрим код
и то что происходит на самом деле 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 также введена система преобразования типов для классов и записей. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
Мдя
Хорошо, тогда по-другому... Мне нужна весчь типа TObject, которая могла бы хранить набор символов или число... И чтобы каким-то образом из этой весчи хранимую информацию можно было получить... Как этого достичь? Это сообщение отредактировал(а) Kbl4AH - 20.1.2009, 15:54 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
написать класс, который будет в себе хранить "набор символов или число" -------------------- There are always someone smarter than you... |
|||
|
||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
||||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
object pascal совсем не изучали?
да хоть както так:
-------------------- There are always someone smarter than you... |
|||
|
||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
||||
|
||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
Что-то у меня ничего не работает((( В чем же дело?
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
ты создал только один объект. В результате (Memo1.Lines.Objects[I] as TAObject).Value это одно и то же для любого I
Или передвинь создание объекта внутрь цикла, или и правда тут можно обойтись простым приведением:
-------------------- Обижено школьников: 8 |
|||
|
||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
Дело не в этом... я даже одно и тоже значение не могу прочесть(((
|
|||
|
||||
| THandle |
|
||||||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Kbl4AH, Momo не поддерживает объекты. Посмотри тему:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=66586 В докозательство от меня попробуй вот эти два кода(в первом случае ListBox, во втором Memo): Сам класс:
ListBox:
Memo:
Memo и ListBox Должны быть заполнены естественно |
||||||
|
|||||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: 4 Всего: 15 |
Ответы в ссылке прочитал...
Так не честно Зато теперь узнал Действительно, пример с мемо выдает ошибку, а с листбоксом работает как надо. И все-таки, в данном случае можно использовать приведение типов или лучше этого не делать и использовать класс? THandle, Alexeis, MetalFan, bems, спасибо! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Это не мема виновата, это тянется от предка TStrings и есть во всех его потомках. Если что операция (Memo1.Lines.Objects[I] as TAObject).Value довольно медленная, но безопасная, в плане того что ничего ни где не затрешь. оператор as при каждом обращении будет производить проверку RTTI с тем чтобы удостовериться действительно указанный объект имеет тип TAObject, если нет, то он будет проверять всех его предков, если не найдет ни одного соответствующего предка то вернет nil и гарантированно произойдет при первом же обращении AV. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| THandle |
|
||||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Kbl4AH, твой случай(кстати зачем тут два цикла? можно и в один загнать)
Еще посмотри, может будет интересно: http://delphist.ru/privedenie-tipov/ Добавлено через 53 секунды Поэтому придумали еще и is |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |