Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизМожет ли ф-ция возвращать объекты? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c