Главная страница
    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.036 c
3-1109324020
malefik
2005-02-25 12:33
2005.03.27
Параметры в fibdataset...


14-1110291057
Knight
2005-03-08 17:10
2005.03.27
Aura Fate of the Ages


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


1-1110102377
malamba
2005-03-06 12:46
2005.03.27
переход по узлам в TreeView - какие-то заморочки


1-1110540052
Володя
2005-03-11 14:20
2005.03.27
ProcessTerminate





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