Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранилище... Tag, или Edit1.Tag:=Integer('string') 
:(
    Опции темы
W1zArD
Дата 2.3.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 29.1.2006

Репутация: 3
Всего: 3



или Edit1.Tag:=Integer('string') а как обратно?
к примеру edit2.text:=string(edit1.tag) ничего не дает...
как приобразовывать?
PM   Вверх
MetalFan
Дата 2.3.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



не очень хорошая идея, имхо, хранить что либо в tag, кроме integer...
лучше использовать TSringList с "ссылками" на edit'ы в object'ах...
но если все-таки хочется поизвращаться с хранением string с помощью tag, 
то можно в нем сохранять указатель на строку... + не забывать про счетчик ссылок.
либо юзать PChar и выделять память самому...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 2.3.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

либо юзать PChar и выделять память самому... 


Имхо, единственно верное решение...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
W1zArD
Дата 2.3.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 29.1.2006

Репутация: 3
Всего: 3



StrToInt число в символ... и вообще знаю что это... ;)
ладно... буду работать с указателями... $|
PM   Вверх
VICTAR
Дата 2.3.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Tag:=Integer(PCHAR('string'));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text:=PCHAR(Edit1.Tag);
end;

PM MAIL   Вверх
MetalFan
Дата 2.3.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 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...
PM MAIL   Вверх
VICTAR
Дата 2.3.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



MetalFan, а что мой код не работает? smile 
PM MAIL   Вверх
MetalFan
Дата 2.3.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



VICTAR, работает. но только в частном случае. см. мой предыдущий пост.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
VICTAR
Дата 2.3.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Ок, я не настаиваю.
Хотя вот так работает
Код

var s: string;

procedure TForm1.Button1Click(Sender: TObject);
begin
s:=IntToStr(100);
Edit1.Tag:=Integer(PCHAR(s));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text:=PCHAR(Edit1.Tag);
end;


Если не так, поправь меня
PM MAIL   Вверх
MetalFan
Дата 2.3.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



VICTAR, ну ясен пень. глобальные переменная. тогда зачем вообще изврат с tag использовать?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
VICTAR
Дата 2.3.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(MetalFan @  2.3.2007,  23:17 Найти цитируемый пост)
тогда зачем вообще изврат с tag использовать?

переменная одна, а tag`ов может быть много. 
Повторяю еще раз, я не настаиваю на своем решении, как на безупречно правильном. Честно говоря, не вижу где(для чего) здесь нужно выделить память...  
MetalFan, приведи, пож-та, код. Все станет ясно  smile 
PM MAIL   Вверх
aktuba
Дата 2.3.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Tag:=Integer(PCHAR('string'));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text:=PCHAR(Edit1.Tag);
end;


Может я не прав, никогда не использовал такое, но вот логические рассуждения:

Код

Edit1.Tag:=Integer(PCHAR('string'));


Создается строка 'string', счетчик = 1, ссылка на строку присваивается Edit1.Tag.

Строка освободится (и соответственно счетчик) тогда, когда будет удален компонент Edit1.

Вот и все. Metalfan, где я не прав?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexeis
Дата 3.3.2007, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(W1zArD @  2.3.2007,  21:12 Найти цитируемый пост)
или Edit1.Tag:=Integer('string') а как обратно?
к примеру edit2.text:=string(edit1.tag) ничего не дает...
как приобразовывать? 

Если сильно захотеть то можно smile
Например такой изврат
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Tag  := Integer(@AnsiString('string')[1]);
  Edit2.Text := AnsiString(pointer(Edit1.Tag));
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W1zArD
Дата 3.3.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 29.1.2006

Репутация: 3
Всего: 3



Alexeis вот это извернулся ))))
PM   Вверх
MetalFan
Дата 3.3.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(aktuba @  2.3.2007,  23:49 Найти цитируемый пост)
Создается строка 'string', счетчик = 1, ссылка на строку присваивается Edit1.Tag.

Строка освободится (и соответственно счетчик) тогда, когда будет удален компонент Edit1.

Вот и все. Metalfan, где я не прав?

1) она не "создается" в том месте, где происходит присваивание. т.к. ее адрес уже будет известен на этапе компиляции. все равно, что использовать констатну. так что все ваши примеры не будут работать в случае динамического вычисления значения строки.
2) откуда ЗНАТЬ Edit1, что в его целочисленном поле TAG хранится ссылка на строку? с чего это будет удаляться строка при удалении Edit1??? бред полнейшие, imnsho.

известно, что динамические строки(AnsiString) содержут свою длину в двойном слове по смещению -4 от начала строки и счетчик ссылок по смещению -8 от того же начала строки.
пробуем следующий код.
Код

procedure TForm1.btn1Click(Sender: TObject);
var
  lStr: string;
  lSize: integer;
  lRefCount: Integer;
begin
  lStr := IntToStr(10) + '__1'; //здесь ДИНАМИЧЕСКИ вычисляемое значение.
  btn1.Tag := integer(PChar(lStr));
  lSize := Integer(Pointer(btn1.Tag-4)^);
  lRefCount := Integer(Pointer(btn1.Tag-8)^);
  ShowMessage( Format('Size:%d,RefCount:%d',[lSize, lRefCount]) ); //здесь мы видим, что счетчик ссылок равен 1... но после end он обращается в 0...
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  lStr: PChar;
  lSize: integer;
  lRefCount: Integer;
begin
  lSize := Integer(Pointer(btn1.Tag-4)^); //здесь мы также можем "схватить" AV, ибо память уже освобождена...
  lRefCount := Integer(Pointer(btn1.Tag-8)^); //получаем 0 в RefCount... ЧТД
  ShowMessage( Format('Size:%d,RefCount:%d',[lSize, lRefCount]) );
  ShowMessage(PChar(btn1.tag)); //здесь в лучшем случае получаем мусор, в худшем - AV
end;

но если в начале "присвоить" опять же просто 'string', то все работает. ибо этот ваш стринг нифига не "динамически" создается.
Alexeis, те же яйца, только сбоку.

Это сообщение отредактировал(а) MetalFan - 3.3.2007, 10:18


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.