Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 23:29   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

и потом будет AV

можно сделать еще одну функцию по типу такой:
Код:
function text(s:TStrings):string;
begin
 Result:=s.Text;
 s.free;
end;
тогда пример изменится так:
Код:
 ShowMessage(text(list.v('hello').v('BIG').v('world')));
я бы не сказал что это удобно.
да и в данном случае куда удобнее написать:
Код:
ShowMessage('hello'#13'BIG'#13'world');//или + надо, не помню  уже
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.09.2011, 00:14   #12
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

стой, можно же создавать листы через банальное свойство text

Код:
var list:TStringList;
begin
  list:=TStringList.Create;
  list.Text:='hello'#13'BIG'#13'world';
  ShowMessage(list.Text);
ех ну и у меня и велосипед ужс.

я тут еще пару тестов провел и выяснилось что ваще нельзя в функциях возращать объекты, иначе они зависают в воздухе => утечка памяти

можно только через процедуры в качестве var посылать объект, имеющий прописанный адрес, и созданный вне процедуры.
Lesha вне форума Ответить с цитированием
Старый 12.09.2011, 00:18   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Почему нельзя? В общем случае можно, только позаботиться об удалении не забыть. Точно так же как и var в процедуре
Код:
function AAA: TStringList;
begin
  Result:=TStringList.Create;
end;

var s: TStringList;
...
s:=AAA;
...
s.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.09.2011 в 00:20.
Аватар вне форума Ответить с цитированием
Старый 12.09.2011, 00:23   #14
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

var list:TStringList;
begin
for i := 0 to 100000 do
list:=TStringList.Create;

вот интересно почему вот эта контрукция создает утечку.
тут же по сути создаем объект и сразу его помещаем в адресованный лист.
Lesha вне форума Ответить с цитированием
Старый 12.09.2011, 00:38   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
тут же по сути создаем объект и сразу его помещаем в адресованный лист.
куда помещаем?
Код:
var list:TObject;//беру глобальнее
по сути это лишь указатель на данные класса, но не сам объект.
вы создаете объект, но и уничтожить его должны вы.(аналогично и с тем что функция вернула объект, хотя тут через параметр как то более привычно)
расмотрим что будет в данном случае:
Код:
var list:TStringList;
begin 
for i := 0 to 100000 do
list:=TStringList.Create;
первая итерация: создаем объект1, присваиваем ссылку на него переменной list.
вторая итерация: создаем объект2, присваиваем ссылку на него переменной list, старая ссылка(на объект1) теряется(объект за нас никто не уничтожает).
третья итерация: создаем объект3, присваиваем ссылку на него переменной list, старая ссылка(на объект2) теряется(объект за нас никто не уничтожает).
...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.09.2011, 01:03   #16
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию



а вот такая контрукция, а основе методов из первого сообщения память не жрет

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to 100000 do
    list.v('hello').v('BIG').v('world').Free;

end;
то есть получается что переданный листок в процедуре надо просто чистить тока все в ажуре будет.

=>

все же можно без объявления переменных создать текстовый листок, оправить его в процедуру, и уже внутри процедуры уничтожить чтобы не было утечек.

Код:
procedure str_proc(s:TStringList);
begin
// вычисления 
s.free;
end;

str_proc(list.v('hello').v('BIG').v('world'));

Последний раз редактировалось Lesha; 12.09.2011 в 01:12.
Lesha вне форума Ответить с цитированием
Старый 12.09.2011, 01:14   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а вот такая контрукция, а основе методов из первого сообщения память не жрет
ибо Free.(так как же как в моем примере с вашим велосипедом)
вообще могу предложить такое:
Код:
function CreateStringList(str:array of string):TStringList;
var i:integer;
begin
 Result:=TStringList.Create;
 for i:=Low(str) to High(str) do Result.Add(str[i]);
end;
применяем:
Код:
var SL:TStringList;
begin
 SL:=CreateStringList(['Hello World!','','From Phoenix.']);
 ShowMessage(SL.Text);
 SL.Free;
end;
Цитата:
все же можно без объявления переменных создать текстовый листок, оправить его в процедуру, и уже внутри процедуры уничтожить чтобы не было утечек.
это обьект, потому создать объект передать его внутрь и уничтожить нет.
но надо думать, а нужен ли он там.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.09.2011, 01:30   #18
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

воо)) ваще респект

вот только не понятно почему когда в процедуру передаем [1,4,6,8] то это массив, а когда в коде, то массиву это "множество" уже не присвоишь ибо множество.

видимо особенности компилятора.
Lesha вне форума Ответить с цитированием
Старый 12.09.2011, 01:36   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
видимо особенности компилятора.
да.
Цитата:
вот только не понятно почему когда в процедуру передаем [1,4,6,8] то это массив
инициализация массива(кстати множеством оно тоже сможет быть, если параметры позволят)
так же при инициализации переменной так же можно(но локальные не имеют инициализации по обьявлению)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия в базе на лету BloodWizard JavaScript, Ajax 1 12.08.2010 19:34
AJAX выполнение Javascript на лету Egych JavaScript, Ajax 0 29.05.2009 23:50
Запрос mysql - создать массив на лету. iankov SQL, базы данных 0 24.01.2009 12:01
Изменение стилей окна на лету. Ivan_32 Win Api 1 29.12.2008 09:53
Создание кнопок на лету gabin Компоненты Delphi 2 11.05.2008 15:30