Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо