-
Похожий контент
-
От FREEFAR
Друзья, помогите-таки расставить точки над "И".
Как же все таки правильно уничтожать динамически создаваемые компоненты TFrame
Сейчас делаю так:
mapFrame.DisposeOf;
mapFrame.Parent := nil;
mapFrame := nil;
Вроде удаляется и новый создается.
Но вот беда.
Если я создам функцию типа FreeFrame(Frame: TFrame);
то как бы я ее не вызывал с входным параметром "mapFrame"
фрейм все равно живет...
Что не так? Куда копать?
-
От Alex7wrt
Добрый день.
Знаю, что на форуме есть несколько тем о том, как удалять объекты под Android и счетчике ссылок, однако использование рекомендаций оттуда мне пока не помогло.
Суть вопроса: создаю свой класс
type TRext =class(TRectangle) Text: TText; procedure RextMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure RextMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure RextMouseLeave(Sender: TObject); Constructor Create(AOwner: TComponent); override; Destructor Destroy; override; end; type TMyChoose = class Item1, Item2, Item3: TRext; Edits: TEdit; procedure ItemClick(Sender: TObject); procedure OnEditFocus(Sender: TObject; var ACanFocus: Boolean); Constructor Create(Form: TForm); Destructor Destroy; override; end; ..... constructor TRext.Create(AOwner: TComponent); begin inherited Create(AOwner); Text:=TText.Create(Self); Text.Parent:=Self; Text.Align:=TAlignLayOut.Client; Self.Text.OnMouseDown:=RextMouseDown; Self.Text.OnMouseUp:=RextMouseUp; Self.Text.OnMouseLeave:=RextMouseLeave; end; Destructor TRext.Destroy; begin Text.Release; Text:=nil; inherited; end; constructor TMyChoose.Create(Form: TForm); begin inherited Create; Item1:=TRextCreate(Form); Item1.Parent:=Form; Item1.Align:=tAlignLayout.MostLeft; Item2:=TRextCreate(Form); Item2.Parent:=Form; Item2.Align:=tAlignLayout.MostLeft; Item3:=TRextCreate(Form); Item3.Parent:=Form; Item3.Align:=tAlignLayout.MostLeft; Edits:=TEdit.Create(Form); Edits.Parent:=Form; Edits.Align:=tAlignLayout.MostLeft; ......... end; Destructor TMyChoose.Destroy; begin Item1.Release; Item1:=nil; Item2.Release; Item2:=nil; Item3.Release; Item3:=nil; Edits.Release; Edits:=nil; inherited; end; Под Windows все нормально работает и уничтожается. Под Android вызов Destroy у объекта типа TMyChoose не приводит ни к чему.
Вместо Release и nil использовал также DisposeOf и Nil, а также FreeAndNil - результат аналогичный.
Как правильно уничтожать составные объекты?
-
От rareMax
Пасаны - хватай ее: https://www.embarcadero.com/ru/products/delphi/starter/promotional-download
В след за плюсами начали раздавать делфи стартер. Функционал урезан до жути, но возможно вам много и не нужно?
-
От Дениска
Пустое приложение. У меня есть формы: А и B.
А по кнопке создаёт и показывает B и сразу самоуничтожается:
B := TB.Create(nil); B.Show; A.Free; B в свою очередь делает обратное: A := TA.Create(nil); A.Show; B.Free; На Win32 платформе в диспетчере задач память по мере открытия форм не растёт. В iOS 6.1.1 iPhone 3 проследить память я не смог, но после 5-10 открытий форм приложение падает. Вероятнее всего растёт хип (heap). Почему тогда не работает FREE?? Как правильно освободить память и уничтожить форму в iOS??? Я нашёл ответ. Если на форме есть картинки, то их нужно: Image1.Bitmap.Assign(nil); -
От xenon54
procedure TForm1.Button1Click(Sender: TObject); var t : TImage; begin t := TImage.Create(Form1); Memo1.Lines.Add(IntToStr( t.RefCount ) ); t.Parent := form1; t.Width := 50; t.Height := 50; Memo1.Lines.Add(IntToStr( t.RefCount ) ); t.Bitmap.Assign(image1.Bitmap); Memo1.Lines.Add(IntToStr( t.RefCount ) ); t.tag := 11; Memo1.Lines.Add(IntToStr( t.RefCount ) ); end; procedure TForm1.Button2Click(Sender: TObject); var i : Integer; begin Memo1.Lines.Add('---------------------'); for I := 0 to Form1.ComponentCount-1 do begin if Components[i] is TImage then if Components[i].Tag = 11 then begin Memo1.Lines.Add(IntToStr( TImage( Components[i] ).RefCount ) + ' - ' + IntToStr( Components[i].Tag ) ); TImage( Components[i] ).Parent := nil; Memo1.Lines.Add(IntToStr( TImage( Components[i] ).RefCount ) + ' - ' + IntToStr( Components[i].Tag ) ); end; end; end; Вот результат memo после одного клика по button1 и одного клика по button2:
5 7 7 7 ------------------------------ 9 - 11 10 - 11 После этого делаю еще 1 клик по button2 и получаю:
7 - 11 10 - 11 Кто-нибудь может объяснить почему RefCount такой большой? Ведь по идее в самом начале на объект ссылается только сама переменная "T" и плюс ссылка в списке "components" у form1. После выхода из процедуры "button1click" локальная переменная(ссылка на объект) "T" уничтожается и ее можно не считать, я правильно понял? Почему RefCount равен не 2, а 7? Почему если в конце процедуры "button1click" написать "t := nil;" картинка пропадает с формы, ведь на нее куча ссылок если верить RefCount'у Как тогда правильно уничтожить такой объект? Система IOS.
-
От kidrock1
Всем привет, друзья. Столкнулся со следующей проблемой. Создаётся поток с целью загрузки картинок во время чтения статьи. Да так чтобы основная форма в момент загрузки не была заморожена. Вот код:
type ThreadHTTP1=class(TThread) private i:integer; public procedure Execute;override; procedure ShowResult1; end; procedure ThreadHTTP1.Execute; var j:integer; begin inherited; try lStream1 := TMemoryStream.Create; Form3.IdHTTP1.Get('http://totalmma.ru/newsupload/8306.jpg',lStream1); except // ShowMessage('no'); end; Synchronize(ShowResult1); end; procedure ThreadHTTP1.ShowResult1; begin ShowMessage(IntToStr(Form3.IDHTTP1.Response.ContentLength)); Form3.Image1.Bitmap.LoadFromStream(lStream1); Form3.Image1.Visible := true; Form3.Caption:=IntToStr(i)+' kbs'; Form3.IdHTTP1.Free; Stream.Free; end; procedure TForm3.Button1Click(Sender: TObject); var MyHTTP1:ThreadHTTP1; begin MyHTTP1 := ThreadHTTP1.Create(False); end; Так вот проблема в следующем. На винде всё работает. А вот когда компилируешь под андройд и переносишь на телефон, при нажатии на кнопке ничего не происходит. Очень прошу помочь, друзья.
-
От rareMax
Смотрел примеры для новой версии XE6 - и увидел что в блоке try finally для освобождения пишут DisposeOf вместо Free. Можете рассказать в каких случаях писать Free а в каких DisposeOf? Спасибо.
-
-
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
Как правильно создавать и удалять объекты в run time?
А то создаю так:
И разрушаю так:
То в Win всё ок, а на симуляторе iOS объекты не разрушаются, а просто остаются.
Попробовал так:
Тогда всё на Win опять всё ок, а на симуляторе разрушается, но при попытке снова создать - приложение крашится.
Поделиться сообщением
Ссылка на сообщение