Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

ПОчему ДЕЛФИ без спроса создает-уничтожает TStringList?   Найти похожие ветки 

 
Pcrepair ©   (2012-07-01 11:08) [0]

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

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?
З.Ы. только не надо о вреде ГлобПерем. это чиста учебный код, для изучения ДЕЛФИ


 
Юрий Зотов ©   (2012-07-01 11:37) [1]

Объекты в Delphi по сути есть указатели. Поэтому операция gRequestStrings := DataOut копирует не строки, а адрес стринглиста. Сразу после нее gRequestStrings и DataOut - это один и тот же стринглист, в котором строки есть (да и чего бы им там не быть, ведь мы только что их туда записали).

Далее в программме выполненяется операция DataOut.Free. При этом объект (стринглист), на который указывали обе переменные (gRequestStrings и DataOut) уничтожается и адрес в gRequestStrings становится неверным. С этого момента попытка обратиться к уже несуществующему объекту через переменную gRequestStrings может привести к любой ошибке (чаще всего - к Access Violation).

Вообще, программа содержит непонятные и ненужные телодвижения. Зачем вся это возня с копированием туда-сюда?

TransformText(Memo1.Lines, gRequestStrings);
Memo1.Lines.Text := gRequestStrings.Text;

И все.


 
Pcrepair ©   (2012-07-01 13:30) [2]

программа учебная, для ознакомления с ДЕЛФИ
а как тогда перенести данные в глобальную переменную?


 
Pcrepair ©   (2012-07-01 13:59) [3]

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

Всем спасибо


 
icWasya ©   (2012-07-02 09:02) [4]

Наиболее правильно
gRequestStrings.Assign( DataOut ) ;


 
Омлет ©   (2012-07-02 09:41) [5]

> Юрий Зотов ©   (01.07.12 11:37) [1]
> TransformText(Memo1.Lines, gRequestStrings);
> Memo1.Lines.Text := gRequestStrings.Text;
> И все.

Не надо советовать плохого. Есть же AddStrings.


 
Palladin ©   (2012-07-02 10:06) [6]


> Омлет ©   (02.07.12 09:41) [5]

В исходном коде текст назначается, а не добавляется, разницу понимаешь между этими двумя действиями?


 
Юрий Зотов ©   (2012-07-02 10:25) [7]


> icWasya ©   (02.07.12 09:02) [4]
> Наиболее правильно
> gRequestStrings.Assign( DataOut ) ;

Почему это наиболее правильно?


> Омлет ©   (02.07.12 09:41) [5]
> Не надо советовать плохого. Есть же AddStrings.

Чем плохо использование Text? Чем AddStrings лучше?


 
AV ©   (2012-07-02 10:33) [8]

а я бы  > gRequestStrings
объявил пропертью
 private
   FNeedLog: Boolean;
   FRequestString: TStringList;
   procedure SetRequestString(const Value: TStringList);    { Private declarations }
 public     { Public declarations }
   Procedure ToLog(s: string);
   property RequestString: TStringList read FRequestString write SetRequestString;

 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.SetRequestString(const Value: TStringList);
begin
 if FRequestString = nil then
   FRequestString := TStringList.Create;
 FRequestString.Text := Value.Text;
 if FNeedLog then
   ToLog(FRequestString.Text);
end;

procedure TForm1.ToLog(s: string);
begin
 Memo1.Lines.Text := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 DataOut : TStringList;
begin
 DataOut := TStringList.Create;
   DataOut.Add("1111111111");
   DataOut.Add("2222222222");
   DataOut.Add("3333333333");
 FNeedLog := True;
 RequestString := DataOut;
 FreeAndNil(DataOut);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ShowMessage( RequestString.Text );
end;


 
MBo ©   (2012-07-02 10:37) [9]

>Чем плохо использование Text?
Лишней работой - построением, а потом парсингом длинной строки.


 
Юрий Зотов ©   (2012-07-02 10:44) [10]


> MBo ©   (02.07.12 10:37) [9]

Не в данной задаче. Исходные строки вводятся в визуальный компонент, сколько их реально может быть? Максимум несколько сотен, иначе замучаешься их просматривать (а если ввод ручной, то еще больше замучаешься их вводить). Поэтому разница практически неощутима.


 
Омлет ©   (2012-07-02 10:57) [11]

> Поэтому разница практически неощутима.

Электроэнергии больше надо.


 
AV ©   (2012-07-02 12:07) [12]

Нужно больше веспен-газа!


 
Jeer ©   (2012-07-03 00:05) [13]


> разница практически неощутима.


Разница ощутима для теоретиков и практиков в сравнении их подходов.


 
Германн ©   (2012-07-03 01:18) [14]


> Не в данной задаче. Исходные строки вводятся в визуальный
> компонент

Данный супер-мега-пупер проект не предполагает ручного ввода текста в визуальный компонент типа ТМемо. Но поскольку он имхо никогда не будет реализован, то никакой разницы в скорости нет.


 
Palladin ©   (2012-07-03 01:20) [15]


> MBo ©   (02.07.12 10:37) [9]

В данном случае никакого парсинга на стороне Делфи нет. Более того, вызовов нативных функции мемо, при использовании методов Add, Delete, Begin/EndUpdate, и пр, гораздо больше происходит, нежели при простом назначении свойства Text.

Но это уже не важно, логику процессоров (точнее многоядерности) стали оптимизировать под стринги..


 
Омлет ©   (2012-07-03 09:04) [16]

> Palladin ©   (03.07.12 01:20) [15]
> В данном случае никакого парсинга на стороне Делфи нет.
> Более того, вызовов нативных функции мемо, при использовании
> методов Add, Delete, Begin/EndUpdate, и пр, гораздо больше
> происходит, нежели при простом назначении свойства Text.


Не болтай ерундой, посмотри исходники TStrings.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.084 c
2-1339576883
Seally
2012-06-13 12:41
2013.03.22
Делфи не признает AdvStringGrid


15-1341407466
DevilDevil
2012-07-04 17:11
2013.03.22
Запустить *.bat в своей консоли


15-1344504943
brother
2012-08-09 13:35
2013.03.22
верстка div ом


2-1331452366
Alex_C
2012-03-11 11:52
2013.03.22
Работа с БД в отдельном треде.


2-1328712585
upc
2012-02-08 18:49
2013.03.22
Запретить изменять Position с помощью колесика у TrackBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский