Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1110625305
iffi
2005-03-12 14:01
2005.03.27
Окно поверх всех других!


1-1111010691
Гость
2005-03-17 01:04
2005.03.27
Как писать что-нибудь в n-ной колонки ListView?


8-1098546514
Graff
2004-10-23 19:48
2005.03.27
Математическая модель человека


1-1110364233
BALU1111
2005-03-09 13:30
2005.03.27
Создание компонент на форме


6-1106273939
Cryon
2005-01-21 05:18
2005.03.27
Ошибка idpop3 socket error 10066





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский