![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStringList [D5, Win95/98, WinXP]
GanibalLector © (2005-03-17 00:54:00)Имеется,код :
function Get(i:integer):TStringList;
var QQ:TStringList;
ii:integer;
begin
QQ:=TStringList.Create;
for ii:=0 to i do
QQ.Add('Hello,Word');
Result:=QQ;
QQ.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Cols[1]:= Get(5);
end;
Естественно,ничего не работает.Пытаюсь сделать так :
type Q = TStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
Q:=TStringList.Create;// не может он так :(
end;
function Get(i:integer):Q;
begin
...
end;
Опять ничего не работает.
Вопрос,как бы это правильно сделать?Т.е. есть некоторая ф-ция на ее выходе TStringList. Мне нужно этот результат куда-то засунуть,например в еще одну ф-цию во входной параметр.
Просто Джо (2005-03-17 17:00:00) [1]Хм. Можно и так ее интерпретировать, конечно. Тут выбор, действительно, за программистом.
Просто Джо (2005-03-17 17:00:00) [2]Хм. Можно и так ее интерпретировать, конечно. Тут выбор, действительно, за программистом.
VMcL (2005-03-17 16:51:00) [3]>> Просто Джо © (17.03.05 11:10) [8]
Ничего коварного в этом варианте нет, поскольку функция AddData выполняет роль конструктора объекта.
Просто Джо (2005-03-17 11:10:00) [4]
Кстати, у Вас
> в вар. 1 утечка памяти.
А это я продемонстрировал коварность первого варианта. Легко забыть, где создается объект и забыть его разрушить.
;)
VMcL (2005-03-17 10:05:00) [5]>> Anatoly Podgoretsky © (17.03.05 09:38) [5]
Это с какого бодуна?
GanibalLector (2005-03-17 09:40:00) [6]2 VMcL © (17.03.05 08:10) [4]
>Сколько выпили?
А ведь было...
всем СПАСИБО!
Anatoly Podgoretsky (2005-03-17 09:38:00) [7]Обойтись без raise
try
...
finally
Result.Free;
end;
VMcL (2005-03-17 08:10:00) [8]>> GanibalLector © (17.03.05 00:54)
function Get(i:integer):TStringList;
var QQ:TStringList;
ii:integer;
begin
QQ:=TStringList.Create;
for ii:=0 to i do
QQ.Add('Hello,Word');
Result:=QQ;
QQ.Free;
end;
Сколько выпили?
:o)
>> Просто Джо © (17.03.05 02:35) [2]
А вообще-то подход не очень. Лучше StringList сделать параметром и в функцию передавать ссылку на уже созданный объект.
Подход нормальный. Главное написАть ровно. Кстати, у Вас в вар. 1 утечка памяти.
procedure Test;
var
Lst: TStrings;
begin
Lst := AddData;
try
// do smth.
finally
Lst.Free;
end;
end;
Итак, типичное решение:
function Get(const N: Integer): TStringList; // или ": TStrings"
var
I: Integer;
begin
Result := TStringList.Create;
try
// Инициализируем созданный список, например:
for I := 0 to N - 1 do
Result.Add(IntToStr(I));
except
Result.Free;
raise;
end;
end;
Просто Джо (2005-03-17 02:37:00) [9]Спать пора. Разумеется, в варианте 2 следует читать так:
Lst := TStringList.Create;
Просто Джо (2005-03-17 02:35:00) [10]А вообще-то подход не очень. Лучше StringList сделать параметром и в функцию передавать ссылку на уже созданный объект. Почему - долго объяснять, почитайте лучше хорошую книгу. Если вкратце, то объект следует разрушать там, где он был создан. Иллюстрирую:
Вар. 1.
function AddData: TStrings;
begin
Result := TStringList.Create;
Result.Add ('-');
end;
procedure Test;
var
Lst: TStrings;
begin
Lst := AddData;
end;
------------------------------
Вар. 2.
procedure AddData (Lst: TStrings);
begin
Lst.Add('-');
end;
procedure Test;
var
Lst: TStringList;
begin
Lst := TStringList;
try
AddData (Lst);
finally
Lst.Free
end;
end;
Так вот, в большинстве случаев следует придерживать Вар.2, и нужны веские основания, чтобы от него отказаться.
Просто Джо (2005-03-17 02:27:00) [11]
begin
Result := TStringList.Create;
Result.Add...
...
end;