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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

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

  • Посещение

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

    264

Активность репутации

  1. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в AlarmManager   
    Ну раз так звезды совпали, то еще и мой вариант :-)
    Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде
  2. Like
    Равиль Зарипов (ZuBy) отреагировална c_breaker в Проигрывание звуков в формате .mp3 по таймеру   
    Может кому поможет - проблема решилась использованием андроидовского SoundPool:
     
    создание:
     
         FSoundPool := TJSoundPool.JavaClass.init(10, TJAudioManager.JavaClass.STREAM_MUSIC,0);
     
    добавление звуков:
     
        FSoundPool.load(StringToJString(FileName),1);
     
    проигрывание:
     
        FSoundPool.play(i,1,1,0,0,1);
  3. Like
    Равиль Зарипов (ZuBy) получил реакцию от AlexRusSoft в При повороте экрана закрывается приложение, Delphi XE 10   
    файл AndroidManifest.template.xml
     
    блок activity должен иметь вот такой вид
    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask">
  4. Like
    Равиль Зарипов (ZuBy) получил реакцию от test_parser в PushEvents без Provider   
    Нужно не только обновить/установить приложение, но и зарегистрировать ваш токен для получения уведомлений
  5. Like
    Равиль Зарипов (ZuBy) получил реакцию от test_parser в OnValidateServerCertificate NetHTTPClient   
    убрать [Ref]
  6. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в доступ к вложенным элементам   
    Вот так все работает, но может я не понял вопроса
     
    Желательно это делать в OnApplyStyleLookup данного объекта.
    например если хотите заполнить стилевой текст или картинку:
     
    Новый объект стиля TButton содержит TText, TLabel, TImage и TButton
    procedure TForm_main.Button1ApplyStyleLookup(Sender: TObject);
    begin         TText(TButton(Sender).FindStyleResource('detail')).Text := 'Детали';         TLabel(TButton(Sender).FindStyleResource('titul')).Text := 'Наименование';         TImage(TButton(Sender).FindStyleResource('img')).Bitmap.Assign(BTMP);         TButton(TButton(Sender).FindStyleResource('but_min')).Tag := 58;         TButton(TButton(Sender).FindStyleResource('but_min')).OnClick := ButW_Min; end;  
    Сделайте одну процедуру OnApplyStyleLookup и присвойте необходимым объектам. 
      Можно напрямую заполнять хоть откуда например   TText(Button1.FindStyleResource('detail')).Text := 'Детали'; но тогда страшные аномалии происходят если ваш объект находятся допустим в скролбоксе.
  7. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в [Sensomusic] Среда модуляции звука   
    Официальный сайт: http://www.sensomusic.org/ Автор: Sensomusic Ссылки на приложение: http://www.sensomusic.org/download.php  

  8. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Запрет нажатия на контролы внутри ScrollBox при прокручивании   
    использовать специальное событие это костыль? на windows это событие не отловить, т.к. это для мобильных платформ
  9. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в OnValidateServerCertificate NetHTTPClient   
    убрать [Ref]
  10. Like
    Равиль Зарипов (ZuBy) получил реакцию от enatechno в Запрет нажатия на контролы внутри ScrollBox при прокручивании   
    для мобильных устройств есть специальное событие OnTap
     
    в случае с комбобокс оно не поможет а вот для кнопок самое то
  11. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в OnValidateServerCertificate NetHTTPClient   
    убрать [Ref]
  12. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Запрет нажатия на контролы внутри ScrollBox при прокручивании   
    для мобильных устройств есть специальное событие OnTap
     
    в случае с комбобокс оно не поможет а вот для кнопок самое то
  13. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в TRESTClient   
    подсказка на будущее
    1) кидаем компонент на форму
    2) откомпилим
    3) смотрим какие модули добавились (правда не все нужны, но методом тыка убираем ненужные)
    важный блок в таких модулях initialization, там обычно регистрируются сервисы и прочие плюшки для работы.
    ошибка показала что у вас не инициализировались нужные интерфейсы
    initialization PeerFactory.RegisterPeer(IPImpId, IIPHTTP, TIdHTTPPeer); PeerFactory.RegisterPeer(IPImpId, IIPTCPClient, TIdTCPClientPeerIP); PeerFactory.RegisterPeer(IPImpId, IIPBasicAuthentication, TIdBasicAuthenticationPeer); PeerFactory.RegisterPeer(IPImpId, IIPURI, TIdURIPeerFactory); PeerFactory.RegisterPeer(IPImpId, IIPHashMessageDigest5, TIdHashMessageDigest5Peer);
  14. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Как создать мобильную версию сайта?   
    у меня код состоит только из разбора json'a который формируется на сервере.
     
    весь парсинг написан на php, по нескольким причинам:
    1) всегда есть доступ к файлам чтобы отредактировать, если на сайте изменился дизайн или что-то изменили.
    2) без надобности перекомпилировать приложение в делфи
    3) не нужно заморачиваться с ssl т.к. на андроид 6 не работает ssl да и таскать с собой либы на айос не вариант
     
    offtop: не делайте через TWebBrowser, это глупо. какой смысл тогда от приложения? можно сделать закладку и вытащить её на раб. стол...
     
    p.s. приложения написанные для личного использования, потому что некоторые компании не хотят создавать приложения для удобства пользователям
    приходится самому решать
     
  15. Like
    Равиль Зарипов (ZuBy) получил реакцию от SergeyIT в TRESTClient   
    подсказка на будущее
    1) кидаем компонент на форму
    2) откомпилим
    3) смотрим какие модули добавились (правда не все нужны, но методом тыка убираем ненужные)
    важный блок в таких модулях initialization, там обычно регистрируются сервисы и прочие плюшки для работы.
    ошибка показала что у вас не инициализировались нужные интерфейсы
    initialization PeerFactory.RegisterPeer(IPImpId, IIPHTTP, TIdHTTPPeer); PeerFactory.RegisterPeer(IPImpId, IIPTCPClient, TIdTCPClientPeerIP); PeerFactory.RegisterPeer(IPImpId, IIPBasicAuthentication, TIdBasicAuthenticationPeer); PeerFactory.RegisterPeer(IPImpId, IIPURI, TIdURIPeerFactory); PeerFactory.RegisterPeer(IPImpId, IIPHashMessageDigest5, TIdHashMessageDigest5Peer);
  16. Like
    Равиль Зарипов (ZuBy) отреагировална Kitty в MessageDlg Android и русская кодировка   
    Enabling C++ Applications for Unicode:
    http://docwiki.embarcadero.com/RADStudio/Seattle/en/Enabling_C%2B%2B_Applications_for_Unicode
     
    String constants, such as "string constant", are still narrow (char*), so you cannot pass them to functions of RAD Studio frameworks and libraries that take PChar as you did before. You can pass the constant to functions of RAD Studio frameworks and libraries with a PChar parameter if you prefix the constant with L, as in:
    L"string constant"
  17. Like
    Равиль Зарипов (ZuBy) отреагировална Kitty в MessageDlg Android и русская кодировка   
    А если так?
    MessageDlg(L"русский текст",...
    void __fastcall TForm1::Button1Click(TObject *Sender) { MessageDlg(L"русский текст", TMsgDlgType::mtWarning, TMsgDlgButtons() << TMsgDlgBtn::mbOK, 0, 0); }
  18. Like
    Равиль Зарипов (ZuBy) получил реакцию от Vitaldj в Несколько мониторов, Windows   
    Как то так
    Left := screen.Displays[1].BoundsRect.Left;
  19. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Потоки и процедуры   
    с использованием анонимных функции жить стало легче, как по мне.
    я их использую не только в потоках, а как отложенное действие..
     
    Приведу пример:
    Есть форма в которой выбираются некие данные, допустим местоположение.
    Эта форма вызывается из нескольких мест, т.е. результат выбора пользователя отправляется всегда в разные формы и в визуальные компоненты.
     
    Как я делал это раньше:
    Заводил некую глобальную переменную и по ней смотрел кто вызвал и куда отправить
    myVar := 'form1'; // для примера if myVar = 'form1' then form1.lbLocation.Text := myLocation // (допустим тут хранится выбранные данные пользователя ) else и т.д. Как теперь:
    Переопределяю метод формы Show с параметром aProc: TThreadProcedure
    procedure Show(aProc: TThreadProcedure); overload; создаю переменку FProcedure:TThreadProcedure в privat секции
    В методе Show присваиваю
    FProcedure:= aProc; Show; // обычный метод формы При выборе пользователем местоположения, выполняется вот такой код
    FProcedure;// наша отложенная процедура Close; // закрываем форму и задаю при показе формы процедуру которая должна выполнится при выборе местоположения
    1 вариант
    myLocationForm.Show(procedure begin Form1.lbLocation.Text := myLocation end); 2 вариант
    myLocationForm.Show(procedure begin ShowMesage(myLocation); end); Некая свобода действий всегда хорошо, и довольно просто в реализации
  20. Like
    Равиль Зарипов (ZuBy) получил реакцию от Alisson R Oliveira в SuperObject vs JSON   
    Привет Всем!
     
    Решил поделится впечатлениями по работе с SuperObject'ом и родным JSON'ом
     
    тест был файла с 2000+ объектами в JSON файле
    структура файла была такая
    { "status":"OK", "last_id":"711", "objects":[ { "obj_id":"1", "obj_acc_id":"1", "obj_cat_id":"24", "obj_title":"13 магистраль", "obj_descr":"ЖК представляет собой комфортный дом, состоящий из 14 блок-секций (подъездов). Расположен в перспективном развивающемся районе по 13 Магистрали с удобным выездом как на левый берег, так и в старую часть города. Вблизи Жилого комплекса распологается новая школа, парк отдыха и культуры.", "obj_address":"ул. Мамышулы - 104, д. 16\/1", "obj_address2":null, "obj_url":"3fa07dd73be072b049529c80c7d74732", "obj_planet":"1", "obj_country":"1", "obj_region":"1", "obj_city":"292", "obj_lat":"51.141", "obj_lon":"71.4835", "obj_insert_dt":null, "obj_update_dt":null, "obj_editted":"0", "obj_updated":"0", "obj_deleted":"0", "obj_showed":"1", "obj_rating":"0", "obj_pro_top":"0", "obj_pro_selected":"0", "obj_pro_unix_dt":"0", "obj_partner":"0", "obj_parent_id":"0", "obj_has_child":"0", "obj_currency":"0" }, // тут далее 2000+ объектов ] } SuperObject  Время выполнения:  ~01:393
    JSON родной Время выполнения: ~01:690
     
    разница не особо ощутима, тем более если будет меньше объектов
     
    JSON родной
    function JSONParse(const aJSONData: string; const aMemo: TMemo): boolean; var aJSValue: TJSONValue; aJSObject, aJSObjArr: TJSONObject; aJSArray: TJSONArray; I: integer; begin Result := false; aJSValue := TJSONObject.ParseJSONValue(aJSONData) as TJSONValue; if Assigned(aJSValue) then begin aJSObject := aJSValue as TJSONObject; aMemo.Lines.Add('status: ' + aJSObject.GetValue('status').Value); if aJSObject.GetValue('status').Value = 'OK' then begin Result := true; if Assigned(aJSObject) then begin aJSArray := aJSObject.GetValue('objects') as TJSONArray; if Assigned(aJSArray) then begin Result := true; aMemo.Lines.Add('last_id: ' + aJSObject.GetValue('last_id').Value); aMemo.Lines.Add('count: ' + aJSArray.Count.ToString); for I := 0 to aJSArray.Count - 1 do begin aJSObjArr := aJSArray.Items[I] as TJSONObject; if Assigned(aJSObjArr) then begin aMemo.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' + aJSObjArr.GetValue('obj_cat_id').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_title').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_descr').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_address').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_url').Value); end; end; end; end; end; aJSValue.Free; end; end; SuperObject
    function JSONSOParse(const aJSONData: string; const aMemo: TMemo): boolean; var xObject: ISuperObject; xCount, I: integer; sfmt: string; begin Result := false; xObject := SO(aJSONData); aMemo.Lines.Add('status: ' + xObject['status'].AsString); if xObject['status'].AsString = 'OK' then begin Result := true; xCount := xObject['objects'].AsArray.Length; aMemo.Lines.Add('count: ' + xCount.ToString); aMemo.Lines.Add('last_id: ' + xObject['last_id'].AsInteger.ToString); for I := 0 to xCount - 1 do begin aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_acc_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_cat_id"'].AsInteger.ToString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_title"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_descr"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_address"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_url"'].AsString); end; end; end; Разница ощутима когда пишешь код, SO намного легче читать
     
    Подробней почитать и скачать SO
  21. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Потоки и процедуры   
    с использованием анонимных функции жить стало легче, как по мне.
    я их использую не только в потоках, а как отложенное действие..
     
    Приведу пример:
    Есть форма в которой выбираются некие данные, допустим местоположение.
    Эта форма вызывается из нескольких мест, т.е. результат выбора пользователя отправляется всегда в разные формы и в визуальные компоненты.
     
    Как я делал это раньше:
    Заводил некую глобальную переменную и по ней смотрел кто вызвал и куда отправить
    myVar := 'form1'; // для примера if myVar = 'form1' then form1.lbLocation.Text := myLocation // (допустим тут хранится выбранные данные пользователя ) else и т.д. Как теперь:
    Переопределяю метод формы Show с параметром aProc: TThreadProcedure
    procedure Show(aProc: TThreadProcedure); overload; создаю переменку FProcedure:TThreadProcedure в privat секции
    В методе Show присваиваю
    FProcedure:= aProc; Show; // обычный метод формы При выборе пользователем местоположения, выполняется вот такой код
    FProcedure;// наша отложенная процедура Close; // закрываем форму и задаю при показе формы процедуру которая должна выполнится при выборе местоположения
    1 вариант
    myLocationForm.Show(procedure begin Form1.lbLocation.Text := myLocation end); 2 вариант
    myLocationForm.Show(procedure begin ShowMesage(myLocation); end); Некая свобода действий всегда хорошо, и довольно просто в реализации
  22. Like
    Равиль Зарипов (ZuBy) отреагировална kami в Как показать форму в Android при заблокированном устройстве   
    Простите, а зачем?
    Вот лежит у меня в кармане телефон. Тихо, спокойно лежит. И тут какое-то приложение решает, что нужно разблокировать экран и что-то показать. Во-первых, легко могут пойти несанкционированные нажатия (мотыляется телефон во внутреннем кармане куртки, фиг знает как сенсор экрана будет реагировать), а во-вторых включается экран и начинает усиленно садиться батарейка.
     
    Вопрос: на... в смысле, зачем я буду держать на своем устройстве такое приложение?
     
    "Правильные" приложения показывают уведомление в "шторке", сопровождаемое звуковым сигналом. Услышал пользователь - сам разблокировал экран и пошел разбираться. Не услышал - значит чем-то занят, нечего его беспокоить.
  23. Like
    Равиль Зарипов (ZuBy) отреагировална SergeyIT в RAD 11 на подходе?   
    Про условия DreamSpark не знаю. Но тесты - это дикость, ИМХО. Главное, идея - доступность для масс. Вот просто не могу представить случая, когда ты заработал кучу денег на инструменте и не начал оплачивать - то есть поддерживать этот инструмент. Но стартапам выложить такую сумму, начиная с нуля сложно.
    Да, Вы правы, тьфу-тьфу-тьфу. С дженериками, лямбдами, интерфейсами, словарями... и "Еду на всем" - это МОНСТР!
  24. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в Thoma Bravo Announces Sale of Embarcadero to Idera, Inc.   
    http://community.embarcadero.com/article/news/16211-embarcadero-rad-studio-2016-product-approach-and-roadmap-2
  25. Like
    Равиль Зарипов (ZuBy) получил реакцию от zekelive в [Android] Как изменить цвет системного статус бара и разместить контролы под ним?   
    Тема оказалась настолько интересна что занялся ей подробней.
     
    Мы с zairkz убили много времени, чтобы понять как выкрасить в один цвет без полупрозрачности, взяв скриншот и фотошоп определили, что затемнение происходит на 40%
     
    Решение родилось само собой, затемнить цвет ToolBar'a на 40% и цвет выровняется.
    Казалось бы можно осветлить цвет для подложки и цвет тоже выровнится, но например белый или светлые цвета нельзя еще осветлить.
     

     
    также написал процедуру для определения высоты статус бара и панели навигации
    procedure androidGetBounds(out statusBar, navigationBar: Integer); {$IFDEF ANDROID} var KeyCharacterMap: JKeyCharacterMap; resourceID: Integer; ScreenService: IFMXScreenService; sScale: Single; {$ENDIF} begin navigationBar := 0; statusBar := 0; {$IFDEF ANDROID} if TOSVersion.Check(5, 0) then // вроде только работает с 5.0 ниже нет устройства проверить begin sScale := 1; if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then sScale := ScreenService.GetScreenScale; //получаем скейл resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('status_bar_height'), StringToJString('dimen'), StringToJString('android')); if resourceID > 0 then statusBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale); if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then // проверка на существование наэкранных кнопок или физических begin resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'), StringToJString('dimen'), StringToJString('android')); if resourceID > 0 then navigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale); end; end; {$ENDIF} end; и в модуле FMX.Platform.Android нужно изменения внести (если вы используете измененный модуль для Intel'а)
    // Fix by Flying Wang & CallInUIThread( procedure begin if (not PlatformAndroid.GetFullScreen(nil)) and (SharedActivity.getWindow.getAttributes.Flags and TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN <> TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN) and (SharedActivity.getWindow.getAttributes.Flags and TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS <> TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS) // fix by ZuBy ... SystemBar.zip
×
×
  • Создать...