PDA

Просмотр полной версии : [Обсуждение] Вопрос к знатокам TStringList


NebesaBag
17.05.2015, 21:11
Здравствуйте.
Допустим есть следующий код:

procedure One;
var temp:TStringList;
begin
temp:=TStringList.Create;
temp.Add('1');
temp.Add('2');
Two(temp);
temp.Free;
end;

procedure Two(test:TStringList);
begin
Memo1.Text:=test.Text;
end;


Визуально код работает корректно, т.е. в Мемо появляются 2 строки соответствующие.
Но меня всё же смущает, что стринглист во второй процедуре мне не надо было создавать, а я просто указал параметру этот тип.

Подскажите, корректен ли данный код или там есть подводные камни?
Благодарю.

Добавлено через 52 минуты
Товарищ zombiee подсказал, что код корректный и никаких подводных камней не имеет.
Если никто не против, то можно закрыть обсуждение.

VeTaL_UA
18.05.2015, 00:16
Любая переменная типа класса является указателем на область в памяти, где этот класс находится. Тоесть, по факту, вы передаёте указатель. Но всё же лучше дать компилятору понять, что вы передаёте параметр, как переменную.
procedure One;
var
temp: TStringList;
begin
temp := TStringList.Create;
temp.Add('1');
temp.Add('2');
Two(temp);
temp.Free;
end;

procedure Two(var test: TStringList);
begin
Memo1.Lines.Clear;
Memo1.Lines.AddStrings(test);
end;

NebesaBag
18.05.2015, 05:19
Если я припишу "var" в параметрах процедуры, то от любого действия над локальной переменной в процедуре Two будет "страдать" родитель.
Не так ли?

VeTaL_UA
19.05.2015, 11:34
Не так ли?
Ты передаёшь указатель, в любом случае "страдать" будет объект класса. Если ты хочешь, чтобы объект класса не тронуло, тогда надо создавать ещё один и копировать переданный в параметрах.

procedure blabla(var StringList: TStringList);
var
Temp: TStringList;
begin
Temp := TStringList.Create;
Temp.Assign(StringList);
//Do smth
Temp.Free;
end;