Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Pcrepair ©   (2012-07-01 11:08:00) 

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

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-03 09:04:00) [1]

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


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


Palladin   (2012-07-03 01:20:00) [2]


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

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

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


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


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

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


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


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


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


AV   (2012-07-02 12:07:00) [5]

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


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

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

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


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


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

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


MBo   (2012-07-02 10:37:00) [8]

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


AV   (2012-07-02 10:33:00) [9]

а я бы  > 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;


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


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

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


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

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


Palladin   (2012-07-02 10:06:00) [11]


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

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


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

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

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


icWasya   (2012-07-02 09:02:00) [13]

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


Pcrepair   (2012-07-01 13:59:00) [14]

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

Всем спасибо


Pcrepair   (2012-07-01 13:30:00) [15]

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


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

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

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

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

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

И все.


Наверх

Титульная страница Поиск, карта сайта Написать письмо