Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-91547
tipman
2003-04-11 16:09
2003.04.28
активация окна


1-91312
Stranger
2003-04-17 11:15
2003.04.28
Показ формы из Com объекта


11-91239
Vitalis
2002-07-21 12:08
2003.04.28
Графика в KOL


3-91183
Stelius
2003-04-08 21:35
2003.04.28
Почему не воспринимает русские символы?


7-91560
DerMeister
2003-03-09 20:42
2003.04.28
WM_QUERYENDSESSION и WM_ENDSESSION





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