gonzales

Пользователи
  • Публикации

    31
  • Зарегистрирован

  • Посещение

  • Days Won

    1

gonzales last won the day on 4 января 2015

gonzales had the most liked content!

О gonzales

  • Звание
    Продвинутый пользователь
  1. Это я прочитал по ссылке, которую Вы выкладывали ранее. Просто использовал его с ProcessMessages, поэтому он не отрабатывал. Это предположение, или утверждение? тем не менее, application.processmessages отрабатывает в Андроид и во многих случаях правильно, это можно увидеть например при отрисовке массива объектов. Если после каждой отрисовки вставлять application.processmessages то объекты отрисовываются по одному, а если не вставлять, то отрисовка происходит один раз после создания последнего. Если их много, у пользователя создается ощущение, что программа зависла. Я с этим сталкивался, когда писал приложение для фотографий, processmessages замечательно себя показал. Почему здесь этого не произошло - загадка Тем не менее, спасибо за советы, про release очень полезная была инфа, потому как раньше использовал DisposeOf, то бишь принудительное жесткое удаление. По потокам буду заниматься, мое кунг-фу еще не достаточно крутое для этого)))
  2. Более того!!! Я нашел причину странного поведения программы, но объяснения этому пока не вижу вот так работает везде procedure TEssence.EssenceClick(Sender: TObject); var r:TEssence absolute Sender; begin r.Release; end; а вот так только в винде procedure TEssence.EssenceClick(Sender: TObject); var r:TEssence absolute Sender; begin r.Release; application.processmessages; //ведет к segmentation fail в Android end;
  3. А вот так работает. Все таки осталось загадкой, нужно ли использовать поток???? procedure TEssence.EssenceClick(Sender: TObject); var r:TEssence absolute Sender; begin // TThread.Queue(NIL,procedure begin r.Release; // end); end;
  4. К сожалению данный код также не отрабатывает то, что нужно, деструктор не вызывается. Вот код юнита. Вкратце, кнопка Button2 создает экземпляр класса TEssence, который имеет таймер. По таймеру перекрашивается rectangle1, который лежит на форме, по нажатию на объект, он должен удалиться. В Винде видим, что все отрабатывает, объект исчезает и таймер останавливается. В андроиде объект исчезает, а таймер продолжает работать(((( unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, System.ImageList, FMX.ImgList, FMX.Objects; type TEssence = class(TRectangle) private procedure EssenceMouseEnter(Sender: TObject); procedure EssenceMouseLeave(Sender: TObject); procedure EssenceClick(Sender: TObject); public EssenceName: TLabel; EssenceImage: TImage; ReleTimer : TTimer; constructor Create(AOwner: TComponent); Override; destructor Destroy; Override; procedure SetName(Name: string); procedure SetIcon(iconnumber: integer); procedure ReleOnTimer(Sender: TObject); end; type TForm1 = class(TForm) Button2: TButton; ImageList1: TImageList; Rectangle1: TRectangle; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} destructor TEssence.Destroy; var i: integer; begin EssenceImage.Release; EssenceName.Release; ReleTimer.Release; inherited; end; constructor TEssence.Create(AOwner: TComponent); var Size: TSizeF; begin inherited Create(AOwner); Parent := Form1; XRadius := 5; YRadius := 5; Stroke.Thickness := 1.2; Stroke.Color := 4286611584; Fill.Color := 4294967264; Margins.Top := 5; Margins.Bottom := 5; Margins.Left := 10; Margins.Right := 10; Align := TAlignLayout.Top; Position.Y := 1000; Height := 40; OnMouseEnter := self.EssenceMouseEnter; OnMouseLeave := self.EssenceMouseLeave; OnClick := self.EssenceClick; EssenceImage := TImage.Create(self); EssenceImage.Parent := self; EssenceImage.Align := TAlignLayout.Left; Size.cx := 20; Size.cy := 20; EssenceImage.Width := 22; EssenceImage.Margins.Left := 5; EssenceImage.Margins.Right := 0; EssenceImage.WrapMode := TImageWrapMode.Fit; EssenceImage.MarginWrapMode := TImageWrapMode.Original; EssenceImage.Locked := true; EssenceImage.HitTest := false; EssenceImage.Bitmap := Form1.ImageList1.Bitmap(Size, 1); EssenceName := TLabel.Create(self); EssenceName.Parent := self; EssenceName.Margins.Top := 5; EssenceName.Margins.Bottom := 5; EssenceName.Margins.Left := 5; EssenceName.Margins.Right := 10; EssenceName.Align := TAlignLayout.Client; EssenceName.StyledSettings := [TStyledSetting.Family]; EssenceName.Font.Size := 16; EssenceName.FontColor := 4282477025; EssenceName.Text := 'Тест'; EssenceName.WordWrap := false; EssenceName.Locked := true; EssenceImage.HitTest := false; ReleTimer := TTimer.Create(self); ReleTimer.Parent := self; ReleTimer.Interval := 500; ReleTimer.OnTimer := self.ReleOnTimer; ReleTimer.Enabled := true; // end; end; procedure TEssence.EssenceMouseEnter(Sender: TObject); begin (Sender as TEssence).EssenceName.FontColor := 4294934352; end; procedure TEssence.EssenceMouseLeave(Sender: TObject); begin (Sender as TEssence).EssenceName.FontColor := 4282477025; end; procedure TEssence.SetName(Name: string); begin EssenceName.Text := name; end; procedure TEssence.ReleOnTimer(Sender: TObject); begin if form1.Rectangle1.Fill.Color=4282477025 then form1.Rectangle1.Fill.Color:=4294934352 else form1.Rectangle1.Fill.Color:=4282477025; end; procedure TEssence.SetIcon(iconnumber: integer); var Size: TSizeF; begin Size.cx := 20; Size.cy := 20; EssenceImage.Bitmap := Form1.ImageList1.Bitmap(Size, iconnumber); end; procedure TEssence.EssenceClick(Sender: TObject); var r:TEssence absolute Sender; begin TThread.Queue(NIL,procedure begin r.parent:=nil; FreeAndNil(r); end); end; procedure TForm1.Button2Click(Sender: TObject); var e:Tessence; begin e:=TEssence.Create(form1); e.SetName('ntcn'); e.SetIcon(1); end; end.
  5. спасибо. Подскажите, правильно ли я запускаю поток procedure TRoom.RoomClick(Sender: TObject); //var // node: IXMLNode; begin form1.myThread:=TThread.Create; form1.myThread.Queue(NIL,procedure begin (Sender as TRoom).parent:=nil; FreeAndNil(Sender as TRoom); end); form1.myThread.Start; end;
  6. krapotkin, kami Спасибо большое! Буду разбираться. Не затруднит ли выложить простой пример по использованию потока? Заранее спасибо!
  7. Ну в общем то, задачка достаточно стандартная. И в win решается на раз. Вопрос, как это реализовать под Андроид. Вы не знаете случайно?
  8. Напишу более развернуто. Есть класс type TEssence = class(TRectangle) private procedure EssenceMouseEnter(Sender: TObject); procedure EssenceMouseLeave(Sender: TObject); public EssenceName: TLabel; EssenceImage: TImage; constructor Create(AOwner: TComponent); Override; destructor Destroy; Override; procedure SetName(Name: string); procedure SetIcon(iconnumber: integer); end; constructor TEssence.Create(AOwner: TComponent); var Size: TSizeF; begin // if Form1.MasterLayout.FindComponent('RoomsScrollBox') <> nil then // begin inherited Create(AOwner); // Parent := Form1.MasterLayout.FindComponent('RoomsScrollBox') as tvertscrollbox; Parent := Form1.RoomsScrollBox; XRadius := Form1.SkinSettings.Radius; YRadius := Form1.SkinSettings.Radius; Stroke.Thickness := Form1.SkinSettings.StrokeTikness; Stroke.Color := Form1.SkinSettings.StrokeColor; Fill.Color := Form1.SkinSettings.FillColor; Margins.Top := 5; Margins.Bottom := 5; Margins.Left := 10; Margins.Right := 10; Align := TAlignLayout.Top; Position.Y := 1000; Height := Form1.SkinSettings.Height; OnMouseEnter := self.EssenceMouseEnter; OnMouseLeave := self.EssenceMouseLeave; EssenceImage := TImage.Create(self); EssenceImage.Parent := self; EssenceImage.Align := TAlignLayout.Left; Size.cx := Form1.SkinSettings.ImageWidth; Size.cy := Form1.SkinSettings.ImageWidth; EssenceImage.Width := Form1.SkinSettings.ImageWidth + 2; EssenceImage.Margins.Left := 5; EssenceImage.Margins.Right := 0; EssenceImage.WrapMode := TImageWrapMode.Fit; EssenceImage.MarginWrapMode := TImageWrapMode.Original; EssenceImage.Locked := true; EssenceImage.HitTest := false; EssenceImage.Bitmap := Form1.ImageList1.Bitmap(Size, 1); EssenceName := TLabel.Create(self); EssenceName.Parent := self; EssenceName.Margins.Top := 5; EssenceName.Margins.Bottom := 5; EssenceName.Margins.Left := 5; EssenceName.Margins.Right := 10; EssenceName.Align := TAlignLayout.Client; EssenceName.StyledSettings := [TStyledSetting.Family]; EssenceName.Font.Size := Form1.SkinSettings.FontSize; EssenceName.FontColor := Form1.SkinSettings.FontColor; EssenceName.Font.Style := EssenceName.Font.Style + Form1.SkinSettings.FontStyle; EssenceName.Text := 'Тест'; EssenceName.WordWrap := false; EssenceName.Locked := true; EssenceImage.HitTest := false; // end; end; destructor TEssence.Destroy; var i: integer; begin EssenceImage.disposeof; EssenceName.disposeof; //EssenceImage.Parent := nil; //EssenceImage.Free; //EssenceName.Parent := nil; //EssenceName.Free; inherited; end; на базе него есть другой класс type TRele = class(TEssence) public Device_ID: byte; Device_Adress: byte; // ReleImage: TImage; // ReleName: TLabel; ReleSwitch: TSwitch; ReleTimer: TTimer; constructor Create(AOwner: TComponent); Override; destructor Destroy; Override; procedure ReleSwitchClick(Sender: TObject); procedure ReleOnTimer(Sender: TObject); end; constructor TRele.Create(AOwner: TComponent); begin inherited Create(AOwner); ReleSwitch := TSwitch.Create(self); ReleSwitch.Parent := self; ReleSwitch.Align := TAlignLayout.Right; ReleSwitch.Margins.Top := 15; ReleSwitch.Margins.Bottom := 15; ReleSwitch.Margins.Left := 0; ReleSwitch.Margins.Right := 10; ReleSwitch.Width := 55; ReleSwitch.IsChecked := false; ReleSwitch.Locked := true; ReleSwitch.HitTest := false; self.OnClick := self.ReleSwitchClick; ReleTimer := TTimer.Create(self); ReleTimer.Parent := self; ReleTimer.Interval := 1000; ReleTimer.OnTimer := self.ReleOnTimer; ReleTimer.Enabled := true; end; destructor TRele.Destroy; begin ReleSwitch.Parent := nil; ReleSwitch.Free; ReleSwitch:=nil; ReleTimer.Parent := nil; ReleTimer.Free; ReleTimer:=nil; inherited; end; создаю экземпляры класса trele. rele := TRele.Create(Form1.RoomsScrollBox); при нажатии на экземпляр класса должно произойти полное удаление всех элементов на Form1.RoomsScrollBox for i := Form1.RoomsScrollBox.ComponentCount - 1 downto 0 do begin if Form1.RoomsScrollBox.Components[i] is TScrollContent then begin application.ProcessMessages; end else if Form1.RoomsScrollBox.Components[i] is TEssence then begin (Form1.RoomsScrollBox.Components[i] as TEssence).Parent:=nil; (Form1.RoomsScrollBox.Components[i] as TEssence).Free; //(Form1.RoomsScrollBox.Components[i] as TEssence).disposeof; //(Form1.RoomsScrollBox.Components[i] as TEssence).parent:=nil; application.ProcessMessages; end else if Form1.RoomsScrollBox.Components[i] is TRele then begin (Form1.RoomsScrollBox.Components[i] as TRele).Parent := nil; (Form1.RoomsScrollBox.Components[i] as TRele).Free; application.ProcessMessages; end; end; В Win все работает, а в Андроиде нет. Если ставлю Parent:=nil и Free, то не вызывается деструктор, если ставлю DisposeOf, то получаю ошибки при выполнении procedure TControl.MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if FPressed and not(FDoubleClick) and PointInObjectLocal(X, Y) then begin Click; FPressed := False; StartTriggerAnimation(Self, 'Pressed'); end; end; Exception class Segmentation fault (11). и за ней Illegal instruction (4) и программа зависает
  9. Столкнулся с такой же проблемой. Удалось ли решить вопрос?
  10. Доброе время суток! Не могу загрузить свои файлы для приложения на андроид. Все делаю по мануалу http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App#Loading_and_Deploying_Files и вот через deploymentmanager. Но файлы не появляются на устройстве. Проверяю TotalCommander-ом, он все папки видит. Вот скриншот. Подскажите, что не так. Использую Berlin 10.1 Заранее всем спасибо
  11. Нет, не поменялся. Может у тебя в проекте забиты значки? А СплэшСкрин тоже поменялся или просто черный?
  12. Обалдеть, спасибо!!!!!!! Вот изящное решение!!! Действительно, все работает без всяких имен. Вот что значит привычка, всегда писал с присвоением имени)))) Даже не думал, что можно не указывать имя вообще! Еще раз спасибо!
  13. Да, извиняюсь, я просто удалял компоненты в цикле (Form1.RoomsScrollBox.Components[i]).Free; А когда я написал (Form1.RoomsScrollBox.Components[i] as TRoom).Release; То метод появился. Но это понятно у TComponent его нет, только у TObject. Но сути вопроса это не изменило, по Release компонент пропадает, но он еще в памяти, соответственно я не могу создать на его месте другой компонент с таким именем. Вообще задача следующая, есть дерево, находясь на ветке этого дерева я визуализирую все имеющиеся подветки (TRectangle) в ScrollBox. При нажатии на подветку я очищаю весь ScrollBox и выстраиваю новую визуализацию. Может подскажете, как это более грамотно реализовать?
  14. У TRectangle нет метода release.((
  15. PS. Причем, что самое странное ошибка возникает не всегда, она плавающая, причем по какой-то неведомой причине возникает только при клике на третью кнопку))). Сама ошибка никак не сказывается на работоспособности программы, все продолжает работать корректно и больше ошибка не повторяется, но при перезапуске программы опять всплывает