Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
14-1110370933
saNat
2005-03-09 15:22
2005.03.27
Использование витой пары


1-1110974587
bon
2005-03-16 15:03
2005.03.27
Autocad & Delphi


3-1109661909
Чеширский_Кот
2005-03-01 10:25
2005.03.27
Data provider or other service returned an E_FAIL status


6-1101106927
leonidus
2004-11-22 10:02
2005.03.27
TWebBrowser - работа через прокси с указанием пароля


6-1106561928
Redis
2005-01-24 13:18
2005.03.27
Программно отправить MMS через GPRS модем