Главная страница
    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.04 c
11-1092829854
omegaB
2004-08-18 15:50
2005.03.27
Передача файла с использованием KOLICS - KOLWSocket


1-1110268243
Viktop
2005-03-08 10:50
2005.03.27
Логотип с ProgressBar


3-1109152784
juice
2005-02-23 12:59
2005.03.27
Выборка из набора данных


14-1110398834
Суслик
2005-03-09 23:07
2005.03.27
Это не про дельфи 2005, а про дельфи 6.


4-1108103302
Jetus
2005-02-11 09:28
2005.03.27
Изменение данных о версии чужого ехе-файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский