Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Может ли ф-ция возвращать объекты?   Найти похожие ветки 

 
Tahion   (2003-04-14 07:32) [0]

Вот код:

procedure TForm1.Button1Click(Sender: TObject);
function functi(k: integer): TIcon;
var
Im: TIcon;
begin
Result:=nil;
Im:=TIcon.Create();
if (k div 2)=0 then
Im.LoadFromFile("D:\1.ico")
else
Im.LoadFromFile("D:\3.ico");
Result:=Im;
Im.Free;
end;

var
i: Longint;
begin
for i:=1 to 100000 do
begin
Image1.Picture.Icon:=functi(i);
Image1.Refresh;
Image1.Repaint;
end;
end;


На строке Image1.Picture.Icon:=functi(i); появл сообщение "Ошибка доступа..."
Если убрать Im.Free; то эта ошибка не появляется, появл. ошибка - "Системе не хватает ресурсов". И не удивительно, ведь с каждым новым обходом цикла создается новый TIcon.

Вопрос: Можно ли заставить ф-цию. вернуть TIcon так, чтоб не було никаких ошибок?


 
Radionov Alexey ©   (2003-04-14 08:20) [1]

>Tahion (14.04.03 07:32)
100000 объектов - не жирно ли?

А если так?

for i:=1 to 100000 do
begin
Image1.Picture.Icon:=functi(i);
Image1.Refresh;
Image1.Repaint;
Image1.Picture.Icon.Free;
end;


 
Digitman ©   (2003-04-14 08:23) [2]

procedure TForm1.Button1Click(Sender: TObject);
var
Im: TIcon;

function functi(k: integer): TIcon;
begin
Result:=Im;
with Result do
if (k div 2)=0 then
LoadFromFile("D:\1.ico")
else
LoadFromFile("D:\3.ico");
end;

var
i: Longint;
begin
Im:=TIcon.Create();
try
for i:=1 to 100000 do
with Image1 do begin
Picture.Icon:=functi(i);
Refresh;
Repaint;
end;
finally
Im.Free;
end;
end;


 
evvcom ©   (2003-04-14 08:35) [3]

Функция может возвращать объект, и без проблем. Ваше Im.Free; убивает наповал только что созданный объект, поэтому Access Violation здесь абсолютно на месте.
А при создании 100000 иконок совершенно уместно Out of resources. Зачем Вам молодой человек 100 тыс. одинаковых иконок? Надо 2 - значит создайте только 2, а в цикле Image1.Picture.Icon присваивайте или первую, или вторую.


 
malkolinge ©   (2003-04-14 12:21) [4]

Что-то вроде списка организовать надо. Интересный способ решения TbitBtn.


 
Tahion   (2003-04-15 07:30) [5]

To Digitman
В таком случае вообще проще не использовать процедуру, а просто пихать выполняемые действия прямо в цикл.

To evvcom

> Функция может возвращать объект, и без проблем. Ваше Im.Free;
> убивает наповал только что созданный объект, поэтому Access
> Violation здесь абсолютно на месте.
> А при создании 100000 иконок совершенно уместно Out of resources.
> Зачем Вам молодой человек 100 тыс. одинаковых иконок?


100000 как раз и взято было для того, чтоб убидится, что объекты не убиваются автоматом. Вариантов иконок может быть гораздо больше двух.


> Надо
> 2 - значит создайте только 2, а в цикле Image1.Picture.Icon
> присваивайте или первую, или вторую.

Данный кусок кода не имеет практической ценности. Он был написан для того, чтоб показать, что есть проблема при создании объекта в теле ф-ции. В программе может быть и 3000 вариантов [теоритически]. Тогда что мне в var-e описывать все 3000 объектов? А если сколько будет вариантов решает сам пользователь, сколько тогда надо создавать иконок?


To malkolinge
Можно подробнее (в каком свойстве, событии искать...)?

----------------------------------------------------------------
Вопрос остается в силе.


Можно ли как-то убить обьект, созданный в ф-ции, которая уже завершила свое выполнение?


 
ЮЮ ©   (2003-04-15 07:54) [6]

Не терять его в месте вызова функции и убивать, если больше не нужен. В чём проблема то?


 
Babay ©   (2003-04-15 08:16) [7]

Вот Ваш код но немного переделанный
у меня все отработало до конца.

Тока конечно функциональность данного кода неясна :=)# .....

procedure TForm1.Button1Click(Sender: TObject);
function functi(k: integer): TIcon;
var
Im: TIcon;
begin
Result:=nil;
Im:=TIcon.Create();
if (k div 2)=0 then
Im.LoadFromFile("D:\1.ico")
else
Im.LoadFromFile("D:\3.ico");
Result:=Im;
im:=Nil;
end;

var
i: Longint;
ic:TIcon;
begin
for i:=1 to 100000 do
begin
ic:=functi(i);
Image1.Picture.Icon:=ic
Image1.Refresh;
Image1.Repaint;
ic.free;
ic:=Nil;
end;
end;


 
Digitman ©   (2003-04-15 08:22) [8]


> Tahion


Каков вопрос - таков и ответ


 
evvcom ©   (2003-04-15 08:49) [9]

100000 как раз и взято было для того, чтоб убидится, что объекты не убиваются автоматом.

Конечно, не убиваются в данном представлении кода. А кто и где их должен убить? Если бы создавали компонент с Owner TForm, то при убитии формы, форма бы убила своих "деток", а здесь - некому.

Он был написан для того, чтоб показать, что есть проблема при создании объекта в теле ф-ции.

Если Вы молодой человек зайдете в квартиру на 15 этаже и у Вас не получится выйти через окно, то это будет означать, что есть проблемы выхода из этой квартиры?

В программе может быть и 3000 вариантов [теоритически]. Тогда что мне в var-e описывать все 3000 объектов?

А что такое динамические массивы Вы знаете?

А если сколько будет вариантов решает сам пользователь, сколько тогда надо создавать иконок?

Любую проблему можно обойти. Посмотрите хотя бы вариант, предложенный Babay.


 
Babay ©   (2003-04-15 09:21) [10]

А вообще более точно можно описать задачу?
может тогда и решение найдется......


 
Tahion   (2003-04-15 22:33) [11]

А поддерживает ли Делфи переменные-сыылки, вроде того, как это сделано в РНР?
Чтоб можно было написать что-то вроде
...
Result:=ℑ //&Im возвращает ссылку на блок памяти, которую занимает Im, а не значение Im
//Im.Free; - это не надо
end;

var
i: Longint;
begin
for i:=1 to 100000 do
begin
try
Image1.Picture.Icon.Free; //Посольку в ф-ции была передана ссылка, а не значение переменной, то здесь должна удалятся сама переменная Im
except
//Ничего не делаем
end;
Image1.Picture.Icon:=functi(i);
Image1.Refresh;
Image1.Repaint;
end;
end;


 
LEON   (2003-04-15 23:27) [12]



var Result: Pointer;

...
Result := @im;

вот так


 
LEON   (2003-04-15 23:27) [13]

> А поддерживает ли Делфи переменные-сыылки, вроде того, как
> это сделано в РНР?
> Чтоб можно было написать что-то вроде
> ...
> Result:=ℑ //&Im возвращает ссылку на блок памяти, которую
> занимает Im, а не значение Im



var Result: Pointer;

...
Result := @im;

вот так



Страницы: 1 вся ветка

Текущий архив: 2003.04.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
3-91164
MXA
2003-04-08 15:01
2003.04.28
dbExpress и транзакции


1-91349
FZ*XupypG
2003-04-16 04:43
2003.04.28
Создание процедуры, работающей с компонентами


3-91144
Andy
2003-04-08 15:02
2003.04.28
задание ссылочной целостности


14-91461
Почтальён Печкин
2003-04-09 13:09
2003.04.28
Письмо счастья


1-91330
Zheka
2003-04-15 12:26
2003.04.28
Дата создания файла