Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

ПОчему ДЕЛФИ без спроса создает-уничтожает 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.06 c
2-1330408314
AV
2012-02-28 09:51
2013.03.22
Владение критической секцией


15-1342693823
.dmitry
2012-07-19 14:30
2013.03.22
Произошел сбой программе инициализации библиотеки динамической ко


2-1328619572
Сергей
2012-02-07 16:59
2013.03.22
Как подключиться к Oracle?


15-1329597005
Юрий
2012-02-19 00:30
2013.03.22
С днем рождения ! 19 февраля 2012 воскресенье


15-1344682568
Jimmy
2012-08-11 14:56
2013.03.22
Chessmaster 9000