Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизTStringList Найти похожие ветки
← →
GanibalLector © (2005-03-17 00:54) [0]Имеется,код :
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 02:27) [1]
begin
Result := TStringList.Create;
Result.Add...
...
end;
← →
Просто Джо © (2005-03-17 02:35) [2]А вообще-то подход не очень. Лучше 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:37) [3]Спать пора. Разумеется, в варианте 2 следует читать так:
Lst := TStringList.Create;
← →
VMcL © (2005-03-17 08:10) [4]>>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;
← →
Anatoly Podgoretsky © (2005-03-17 09:38) [5]Обойтись без raise
try
...
finally
Result.Free;
end;
← →
GanibalLector © (2005-03-17 09:40) [6]2 VMcL © (17.03.05 08:10) [4]
>Сколько выпили?
А ведь было...
всем СПАСИБО!
← →
VMcL © (2005-03-17 10:05) [7]>>Anatoly Podgoretsky © (17.03.05 09:38) [5]
Это с какого бодуна?
← →
Просто Джо © (2005-03-17 11:10) [8]
Кстати, у Вас
> в вар. 1 утечка памяти.
А это я продемонстрировал коварность первого варианта. Легко забыть, где создается объект и забыть его разрушить.
;)
← →
VMcL © (2005-03-17 16:51) [9]>>Просто Джо © (17.03.05 11:10) [8]
Ничего коварного в этом варианте нет, поскольку функция AddData выполняет роль конструктора объекта.
← →
Просто Джо © (2005-03-17 17:00) [10]Хм. Можно и так ее интерпретировать, конечно. Тут выбор, действительно, за программистом.
← →
Просто Джо © (2005-03-17 17:00) [11]Хм. Можно и так ее интерпретировать, конечно. Тут выбор, действительно, за программистом.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c