Форум: "Начинающим";
Текущий архив: 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.077 c