Перейти к содержанию
Fire Monkey от А до Я

gonzales

Пользователи
  • Постов

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

  • Посещение

  • Победитель дней

    27

Весь контент gonzales

  1. Не работает, программа валится. Работает вот так. Сам искал, вдруг кому сгодится procedure TForm1.Button1ApplyStyleLookup(Sender: TObject); var l:tlayout; begin l:=StyleBook1.Style.FindStyleResource('Button1Style1') as Tlayout; (l.FindComponent('GlowEffect') as TGlowEffect).GlowColor:=Talphacolorrec.Red; end; А вот на лету не меняет. Программа не валится, но и изменений нет l:=StyleBook1.Style.FindStyleResource('Button1Style1') as Tlayout; (l.FindComponent('GlowEffect') as TGlowEffect).GlowColor:=Talphacolorrec.Red; form1.Button1.ApplyStyleLookup; Изменения по ApplyStyleLookUp не происходят. Причем ApplyStyleLookUp компонента происходит раньше чем например FormShow формы. Вопрос, как теперь применить настройки стиля по нажатию на кнопку.
  2. gonzales

    чтение смс

    Комрады, всем доброго времени суток! подскажите, может кто сталкивался. Читаю приходящие на андроид смс. function TForm1.FetchSms: string; var cursor: JCursor; uri: Jnet_Uri; id_smsid, addressidx, bodyidx: integer; smsid, address, body: string; begin uri := StrToJURI('content://sms/inbox'); cursor := SharedActivity.getContentResolver.query(uri, nil, nil, nil, nil); id_smsid := cursor.getColumnIndex(StringToJString('_id')); addressidx := cursor.getColumnIndex(StringToJString('address')); bodyidx := cursor.getColumnIndex(StringToJString('body')); cursor.moveToFirst; begin Result := ''; smsid := JStringToString(cursor.getString(id_smsid)); address := JStringToString(cursor.getString(addressidx)); body := JStringToString(cursor.getString(bodyidx)); if address = form2.TelEdit.Text then begin Result := { UnixTimeToDateTime (msgunixtimestampms) { +IntToStr(trunc(msgunixtimestampms/1000)) + '+' + } body; end; end; end; На выходе, если в смс стоит '1', получаю '1'#012. Причем, если вывести Result в showmessage - будет '1', но программа не хочет переводить его в целочисленный вид. А также Length('1'#012)=2. Попытка отбросить последний символ ни к чему не приводит. procedure TForm1.SMSTimerTimer(Sender: TObject); var mess: string; i: integer; sms_num: string; l:integer; begin {$IFDEF ANDROID} mess := Form1.FetchSms; if mess <> '' then begin l:=Length(mess); for i := 0 to l - 2 do if mess[i] <> '' then sms_num := sms_num + mess[i]; for i := 0 to Form1.InSMSMessages.ChildNodes.Count - 1 do //<------------ВОТ СЮДА ПРОГРАМММА НЕ ДОХОДИТ begin if Form1.InSMSMessages.ChildNodes.Nodes[i].GetAttribute('ID') = strtoint(sms_num) then begin Form1.Active := true; smslabel.Text := Form1.InSMSMessages.ChildNodes.Nodes[i].GetAttribute('Name'); Form1.SMSMessage.Visible := true; Vibrator.vibrate(1000); break; end; end; end; {$ENDIF} end; Может кто подсказать, что это за # и как от него избавиться. Всем заранее спасибо!
  3. Это я прочитал по ссылке, которую Вы выкладывали ранее. Просто использовал его с ProcessMessages, поэтому он не отрабатывал. Это предположение, или утверждение? тем не менее, application.processmessages отрабатывает в Андроид и во многих случаях правильно, это можно увидеть например при отрисовке массива объектов. Если после каждой отрисовки вставлять application.processmessages то объекты отрисовываются по одному, а если не вставлять, то отрисовка происходит один раз после создания последнего. Если их много, у пользователя создается ощущение, что программа зависла. Я с этим сталкивался, когда писал приложение для фотографий, processmessages замечательно себя показал. Почему здесь этого не произошло - загадка Тем не менее, спасибо за советы, про release очень полезная была инфа, потому как раньше использовал DisposeOf, то бишь принудительное жесткое удаление. По потокам буду заниматься, мое кунг-фу еще не достаточно крутое для этого)))
  4. Более того!!! Я нашел причину странного поведения программы, но объяснения этому пока не вижу вот так работает везде 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;
  5. А вот так работает. Все таки осталось загадкой, нужно ли использовать поток???? procedure TEssence.EssenceClick(Sender: TObject); var r:TEssence absolute Sender; begin // TThread.Queue(NIL,procedure begin r.Release; // end); end;
  6. К сожалению данный код также не отрабатывает то, что нужно, деструктор не вызывается. Вот код юнита. Вкратце, кнопка 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.
  7. спасибо. Подскажите, правильно ли я запускаю поток 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;
  8. krapotkin, kami Спасибо большое! Буду разбираться. Не затруднит ли выложить простой пример по использованию потока? Заранее спасибо!
  9. Ну в общем то, задачка достаточно стандартная. И в win решается на раз. Вопрос, как это реализовать под Андроид. Вы не знаете случайно?
  10. Напишу более развернуто. Есть класс 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) и программа зависает
  11. Столкнулся с такой же проблемой. Удалось ли решить вопрос?
  12. Доброе время суток! Не могу загрузить свои файлы для приложения на андроид. Все делаю по мануалу http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App#Loading_and_Deploying_Files и вот через deploymentmanager. Но файлы не появляются на устройстве. Проверяю TotalCommander-ом, он все папки видит. Вот скриншот. Подскажите, что не так. Использую Berlin 10.1 Заранее всем спасибо
  13. Нет, не поменялся. Может у тебя в проекте забиты значки? А СплэшСкрин тоже поменялся или просто черный?
  14. Обалдеть, спасибо!!!!!!! Вот изящное решение!!! Действительно, все работает без всяких имен. Вот что значит привычка, всегда писал с присвоением имени)))) Даже не думал, что можно не указывать имя вообще! Еще раз спасибо!
  15. Да, извиняюсь, я просто удалял компоненты в цикле (Form1.RoomsScrollBox.Components[i]).Free; А когда я написал (Form1.RoomsScrollBox.Components[i] as TRoom).Release; То метод появился. Но это понятно у TComponent его нет, только у TObject. Но сути вопроса это не изменило, по Release компонент пропадает, но он еще в памяти, соответственно я не могу создать на его месте другой компонент с таким именем. Вообще задача следующая, есть дерево, находясь на ветке этого дерева я визуализирую все имеющиеся подветки (TRectangle) в ScrollBox. При нажатии на подветку я очищаю весь ScrollBox и выстраиваю новую визуализацию. Может подскажете, как это более грамотно реализовать?
  16. PS. Причем, что самое странное ошибка возникает не всегда, она плавающая, причем по какой-то неведомой причине возникает только при клике на третью кнопку))). Сама ошибка никак не сказывается на работоспособности программы, все продолжает работать корректно и больше ошибка не повторяется, но при перезапуске программы опять всплывает
  17. Доброго времени суток! Помогите советом, как убить кнопку кликнув на нее. Создаю на скролбоксе динамический массив кнопок (наследники Trectangle). По нажатию (onClick) любой кнопки из массива весь массив должен уничтожиться. Естественно это приводит к ошибке. В VCL я бы использовал POSTMESSAGE но в firemonkey затрудняюсь ответить. На ум пока приходит только Таймер)))) Но это же жесть))) Приложение кроссплатформенное, поэтому решение нужно соответствующее. Заранее всем спасибо за советы.
  18. Сам нашел!!! program Project1; uses //System.StartUpCopy, FMX.Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. закоментировал модуль System.StartupCopy и все заработало. Странно, попробывал на других, полноценных приложениях, тоже все завелось. Зачем вообще этот модуль нужен?????
  19. Доброго времени суток всем! Камрады, выручайте, столкнулся с неприятной неприятностью. Обновил прошивку на телефоне, причем версия Андроид не изменилась, 5.1.1. Изменилась только оболочка (MIUI8 если кто знает) После этого перестали запускаться приложения, написанные на Дельфи ХЕ8. Причем как старые так и новые. Уже все перепрбывал, менял Android SDK, отключал разрешения, менял настройки debug-release. Все бес толку, приложение показывает SplashScreen и умирает. Запустил в debug режиме, получил на старте исключение First chance exception at $E44B68E9. Exception class EStartUpCopyException with message 'Cannot deploy, "" file not found in assets'. Process Project1.apk (21807) в модуле Sustem.StartUpCopy, функция function CopyAssetToFile(LAssetManager: PAAssetManager; const AssetFolder, AssetName: string; const DestinationRoot, DestFolder, FileName: string): Boolean; то есть я так понимаю, что проблема с deploy, но все тоже самое на другом телефоне работает без проблем (специально проверил на старом телефоне). Откатил прошивку обратно, все сразу заработало. Налил новую - тут же перестало. Посмотрел ошибки logcat, но ничего примечательного не нашел I/ActivityManager( 3676): START u999 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.embarcadero.Project1 cmp=com.embarcadero.Project1/com.embarcadero.firemonkey.FMXNativeActivity bnds=[550,657][686,793]} from uid 1000 on display 0 V/WindowManager( 3676): addAppToken: AppWindowToken{1bf9ff3b token=Token{f0781ca ActivityRecord{258c4935 u999 com.embarcadero.Project1/com.embarcadero.firemonkey.FMXNativeActivity t29}}} to stack=1 task=29 at 0 V/WindowManager( 3676): Adding window Window{1522af0f u0 Starting com.embarcadero.Project1} at 7 of 13 (after Window{2e27bdf1 u0 com.miui.securitycore/com.miui.xspace.ui.activity.XSpaceSettingActivity}) I/ActivityManager( 3676): Start proc 20826:com.embarcadero.Project1/u999a106 for activity com.embarcadero.Project1/com.embarcadero.firemonkey.FMXNativeActivity V/UidProcStateHelper( 3676): process state changed:[20826,99910106,2] V/UidProcStateHelper( 3676): process state changed:[8006,10023,3] W/ActivityManager( 3676): getTasks: caller 10023 is using old GET_TASKS but privileged; allowing I/UsageStatsDatabase( 3676): Upgrading from version 0 to 2 I/UsageStatsDatabase( 3676): Deleting all usage stats files I/UsageStatsService( 3676): User[999] Rollover scheduled @ 2016-09-06 03:00:00(1473120000000) I/ActivityManager( 3676): Process com.embarcadero.Project1 (pid 20826) has died V/UidProcStateHelper( 3676): process died:[20826,99910106] В общем замучился уже, не могу понять, чего ему не хватает. Пробовал apk файл руками закидывать на телефон, все равно вылетает. Помогите, кто чем может, советом каким!!! Заранее спасибо! PS. Прошу прощения, если написал не в тот раздел, не сразу увидел раздел Андроид. Если модераторов не затруднит, перенесите тему. Спасибо!
  20. Начало вопроса http://fire-monkey.ru/topic/193-u-menia-perestaet-rabotat-fokus-posle-smeny-fok/ В XE6 WebBrowser действительно работал правильно, с выходом апдейта опять начались проблемы, имеется тело Samsung Galaxy S3, при вызове клавиатуры в WebBrowser не отображаются вводимые буквы в поле ввода браузера. С телом HTC Incredible S работает правильно. Вот такая незадача, придется видимо откатываться обратно на XE6
  21. Спасибо. Воспользовался предложенной утилитой, действительно, такой строки у меня нет. Просто странно, что текст везде идет со сглаживанием, все родные элементы имеют сглаживание, а вот программы из Delphi идут без него. Наверное за это разные инструменты отвечают
  22. Quality = HighQuality Это свойство выставлено. А как узнать, что антиалиасинг поддерживается? Я как ни гуглил, никакой информации не нашел. У меня тело HTC Incredible S
  23. Доброе время суток! При рисовании на канве, например TImage абсолютно отсутствует антиалайсинг. Даже TShape с закругленными углами в design-time отрисовывается красиво, а в run-time без всякого сглаживания. Никакой информации по этому поводу не нашел. Может кто подскажет, как рисовать с антиалайсингом? В DesignTime: В Runtime: Пишу для android на XE5.
  24. Доброе время суток! Среда: RAD Studio Delphi XE5 Устройство: Android 4.0.4, HTC Incredible S Столкнулся со следующей проблемой, необходимо использовать браузер для аутентификации пользователя. Как Вы наверное знаете, компонент TWebBrowser не имеет фокуса ввода, то есть виртуальная клавиатура не отображается при клике на поле ввода в браузере. лечится такая фигня строками кода webbrowser1.canfocus := true; webbrowser1.SetFocus; НО!!! оказывается после таких строк фокус ввода не переходит на обычные поля вводя, типа TEdit. Даже строки edit6.canfocus := true; edit6.SetFocus; не помогают. Что делать??? Да, забыл сказать, что прога под Андроид
×
×
  • Создать...