![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| W1zArD |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 29.1.2006 Репутация: 3 Всего: 3 |
или Edit1.Tag:=Integer('string') а как обратно?
к примеру edit2.text:=string(edit1.tag) ничего не дает... как приобразовывать? |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
не очень хорошая идея, имхо, хранить что либо в tag, кроме integer...
лучше использовать TSringList с "ссылками" на edit'ы в object'ах... но если все-таки хочется поизвращаться с хранением string с помощью tag, то можно в нем сохранять указатель на строку... + не забывать про счетчик ссылок. либо юзать PChar и выделять память самому... -------------------- There are always someone smarter than you... |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Имхо, единственно верное решение... -------------------- ![]() |
|||
|
||||
| W1zArD |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 29.1.2006 Репутация: 3 Всего: 3 |
StrToInt число в символ... и вообще знаю что это... ;)
ладно... буду работать с указателями... $| |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
VICTAR, а подсчетом ссылок кто будет заниматься? память выделять/освобождать?
поменяй в своем примере 'string' на допустим IntToStr(100)... и получишь мусор в button2click'е... Это сообщение отредактировал(а) MetalFan - 2.3.2007, 22:54 -------------------- There are always someone smarter than you... |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
MetalFan, а что мой код не работает?
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
VICTAR, работает. но только в частном случае. см. мой предыдущий пост.
-------------------- There are always someone smarter than you... |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
Ок, я не настаиваю.
Хотя вот так работает
Если не так, поправь меня |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
VICTAR, ну ясен пень. глобальные переменная. тогда зачем вообще изврат с tag использовать?
-------------------- There are always someone smarter than you... |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
переменная одна, а tag`ов может быть много. Повторяю еще раз, я не настаиваю на своем решении, как на безупречно правильном. Честно говоря, не вижу где(для чего) здесь нужно выделить память... MetalFan, приведи, пож-та, код. Все станет ясно |
|||
|
||||
| aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Может я не прав, никогда не использовал такое, но вот логические рассуждения:
Создается строка 'string', счетчик = 1, ссылка на строку присваивается Edit1.Tag. Строка освободится (и соответственно счетчик) тогда, когда будет удален компонент Edit1. Вот и все. Metalfan, где я не прав? -------------------- ![]() |
||||
|
|||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Если сильно захотеть то можно Например такой изврат
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| W1zArD |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 29.1.2006 Репутация: 3 Всего: 3 |
Alexeis вот это извернулся ))))
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
1) она не "создается" в том месте, где происходит присваивание. т.к. ее адрес уже будет известен на этапе компиляции. все равно, что использовать констатну. так что все ваши примеры не будут работать в случае динамического вычисления значения строки. 2) откуда ЗНАТЬ Edit1, что в его целочисленном поле TAG хранится ссылка на строку? с чего это будет удаляться строка при удалении Edit1??? бред полнейшие, imnsho. известно, что динамические строки(AnsiString) содержут свою длину в двойном слове по смещению -4 от начала строки и счетчик ссылок по смещению -8 от того же начала строки. пробуем следующий код.
но если в начале "присвоить" опять же просто 'string', то все работает. ибо этот ваш стринг нифига не "динамически" создается. Alexeis, те же яйца, только сбоку. Это сообщение отредактировал(а) MetalFan - 3.3.2007, 10:18 -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Не совсем те. В делфи 'string' означает просто строку, любую, какую конкретно, компилятор узнает на этапе присваивания. Такие константы обычно создаются в системной области констант AnsiString('string') - указывает, что строка должна быть ансистринг, а вот операция @AnsiString('string')[1], не так очевидна как кажется, при такой попытке обращения к элементам строки компилятор решает создать дубликат строки в общей памяти доступной для записи. Так что Edit2.Text, получает свою законную копию строки. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
откуда такие данные? при выполнении следующего кода получаем одинаковые значения...
и где там дубликат?? ладно, мы тут в дебри углубились. вывод из всего этого только один: чтобы в дальнейшем не возникло проблем в виде непонятно откуда взявшихся AV и утечек памяти, лучше сразу самому выделять и освобождать память, используя PChar. Это сообщение отредактировал(а) MetalFan - 3.3.2007, 13:02 -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Точно! Вот хитрый гад этот компилятор! Одну и ту же оперыцию в разных контекстах понимает по разному
Теперь точно у каждого своя копия Добавлено @ 13:27 Это будет, а на счет утечек памяти нет, компилятор слишком для этого умный. С AnsiString такое почти не реально, разве что насильно записать ему более короткую длинну, да и то не факт, что сработает, он запоминает сколько выделял памяти, а не проверяет длину строки, потому по выходу из процедуры освободит правильное количество памяти. В это и прелесть анси строк в противоположность пчарам. Анси строки уж слишком стабильные. Это сообщение отредактировал(а) Alexeis - 3.3.2007, 13:28 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Alexeis, ну правильно. copy припахал)
да только в случае с динамическиформируемой строкой словишь опять же AV. короче НЕРЕКОМЕНДУЮ использовать содержимое AnsiString отдельно от переменных типа AnsiString. ибо не один из привеленных выше способов 100% не работоспособен. з.ы. string = AsniString, если включена опция Huge Strings. так что согласись, Alexeis, твой пример - все таки "те же яйса..." ;) да, поэтому по выходу из процедуры, где использовалась локальная переменная типа string(ansistring), и на которую был "запомнен" указатель, в итоге приведет к AV при попытке обращения к уже освобожденной по окончанию процедуры содержимому строки... но если "подкрутить" refCount, то теоретически память под строку не будет освобождена... но это грозит утечками и дальнейшей несовместимостью в случае изменения логики компилятора Это сообщение отредактировал(а) MetalFan - 3.3.2007, 13:35 -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Никогда не интересовался такой жуткой методикой издевательства над языком и не хочется особенно влезать в тонкости и глюки кривых подходов к программированию, лучше почитаю, про хорошие Короче присоединяюсь к пожеланию MetalFan не использовать такие средства вообще, и использовать те средства которые были для этого придуманы. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Alexeis, :beer:
жаль нету такого смайла тут) з.ы. есть предназначенные для таких "извращенств" средства - TStringList. про который я уже упоминал. -------------------- There are always someone smarter than you... |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
W1zArD
Не понимаю, зачем хранить текст в Tag? Его же можно хранить в свойстве Text |
|||
|
||||
![]()
|
| Правила форума "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. |