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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПОчему ДЕЛФИ без спроса создает-уничтожает TString, ПОчему ДЕЛФИ без спроса создает 
V
    Опции темы
Pcrepair
Дата 1.7.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день. есть код:

Код

uses uTransformText, uGlobalVariables; (*внешние модули*)

procedure TForm1.Button1Click(Sender: TObject);
var DataIn,DataOut : TStringList;
begin
    DataIn := TStringList.Create;
    DataOut := TStringList.Create;
    DataIn.Text := Memo1.Text; (*просто ввод строк из МЕМО в ПЕРЕМ*)
       TransformText(DataIn, DataOut); (*вызов основной ПРОЦ обработки текста*)
    gRequestStrings := DataOut; (*Перенос строк запроса в ГлобПерем*)
    //ShowMessage(gRequestStrings.Text); (*вот тут строки есть*)
    Memo1.Text := DataOut.Text; (*контрольное отображение результата*)
    DataIn.Free;
    DataOut.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   //gRequestStrings := TStringList.Create; (*и без инициализации ГлобПЕрем работает*)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(gRequestStrings.Text); (*вот тут ничего нет*)
end;


1. нажимает на кнопку1, строки копируются из МЕМО1 в ПЕРЕМ, обрабатываются и возвращаются. тут все нормально. в ГлобПЕрем gRequestStrings строки есть
2. нажимаем на кнопку2. по идее в gRequestStrings должны сохранятся данные, но их там нет. кроме того почемуто нет необходимости в создании gRequestStrings при запуске программы

ВОПРОС:
Что получается? ДЕЛФИ без разрешения создает-уничтожает gRequestStrings при нажатии кнопки1?
З.Ы. только не надо о вреде ГлобПерем. это чиста учебный код, для изучения ДЕЛФИ
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Чучмек
Дата 1.7.2012, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Посмотри внимательно на строки 7,10,14


Это сообщение отредактировал(а) Чучмек - 1.7.2012, 11:18


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
DarkProg
Дата 1.7.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Да, вы однако не понимаете, что делаете....

Переменная типа TStringList это всего навсего указатель на возможный экземпляр класса, до того как ей что-то присваивается она равна nil, как только выполните SomeVar:=TStringList.Create в неё будет записан указатель на экземпляр класса, который создали и с ним можно работать.

Код

gRequestStrings := DataOut;

Это не перенос строк, это всего лишь одно значение указателя записали в другое, и после этой операции у вас обе эти переменные ссылаются на один и тот же объект. Копирование осуществляется по-другому.

Цитата(Pcrepair @  1.7.2012,  11:13 Найти цитируемый пост)
ShowMessage(gRequestStrings.Text); (*вот тут ничего нет*)

Странно что ошибки не кидает, потому что вы ранее уже уничтожили объект... ну просто видимо там что-то адекватное есть в памяти, вот и не кидает...

Вместо 
Цитата(Pcrepair @  1.7.2012,  11:13 Найти цитируемый пост)
DataIn.Free;

Напишите вот так FreeAnNil(DataIn) и тогда вы получите милую ошибку при вызове ShowMessage(собственно которая и должна быть smile)




--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
XperT
Дата 1.7.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я вам еще в предыдущей теме объяснял по поводу указателей как раз чтобы избежать подобных ситуаций. То же самое я писать еще раз не буду, если вам не интересно, то и мне тоже. Но на ошибки укажу:
Код

gRequestStrings := DataOut; (*Перенос строк запроса в ГлобПерем*)

Это не перенос строк, это присвоение указателей. После этого gRequestStrings и DataOut указывают на один и тот же объект. В конце этой функцмм вы убиваете этот объект.

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
   //gRequestStrings := TStringList.Create; (*и без инициализации ГлобПЕрем работает*)
end;

Не работает, ваш вывод основан на ложных представлениях описанных выше.

Код

ShowMessage(gRequestStrings.Text); (*вот тут ничего нет*)

Странно, что ошибку не выбивает, так как по сути gRequestStrings в этот момент указывает на "мусор" в памяти процесса.
PM MAIL   Вверх
Pcrepair
Дата 1.7.2012, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



DarkProg

вообще правильно было gRequestStrings.Text := DataOut.Text;
сразу недопонял

Всем спасибо
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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