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

#WAMACO

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

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

  • Посещение

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

    27

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

  1. Like
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в invalid class type cast в TakePhotoFromLibraryAction   
    Вы можете перевести "invalid class type cast"? можно использовать, например, любой онлайн переводчик...(google, яндекс)
  2. Like
    #WAMACO получил реакцию от Anatoliy в Пуши после публикации в Google Play   
    Не надо ничего удалять, мало ли кому нибудь пригодится...
  3. Like
    #WAMACO получил реакцию от Rusland в Пуши после публикации в Google Play   
    Не надо ничего удалять, мало ли кому нибудь пригодится...
  4. Like
    #WAMACO отреагировална Pax Beach в Direct3D. Работа со снимками экрана   
    Библиотека для работы с изображениями находится здесь.
     
    Готовится описание.
     
  5. Like
    #WAMACO отреагировална dnekrasov в Поменять местами итемы в ListView   
    А можно ещё так:
    ListView1.Items[0].Index := 1; ListView1.Items[1].Index := 0; ListView1.Items.Sort(TComparer<TListViewItem>.Construct( function(const ALeft, ARight: TListViewItem): Integer begin Result := ALeft.Index - ARight.Index; end)); Поменять-то поменяет, только на сколько обоснован вызов Sort в этой ситуации - решать Вам.
  6. Like
    #WAMACO отреагировална sinuke в Поменять местами итемы в ListView   
    В общем, сделал пока вот так:
    var Source: TListViewItem; Target: TListViewItem; begin ListView1.BeginUpdate; Source := ListView1.Items[0]; Target := ListView1.Items.Insert(1); Target.Text := Source.Text; Source.Text := ListView1.Items[2].Text; ListView1.Items.Delete(2); ListView1.EndUpdate; end; В этом случае придется вручную копировать содержимое каждого итема. Кому интересно, вот тестовый проектик с перетаскиванием итемов мышью
    Demo.zip
    Ну а если кто может предложить вариант получше, не стесняйтесь
  7. Like
    #WAMACO получил реакцию от Anatoliy в Google Play App Signing   
    не забывайте потом скинуть сюда ссылку на Ваше приложение... ;))
  8. Like
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в Разрешающий документ   
    Если можно, скиньте ссылку на приложение... интересно глянуть!
    Оно же сделано на FMX?
  9. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в [Андроид] кнопка с эффектом   
    если это основное действие в приложении, то в андроиде принято делать Floating Action Button (гугл в помощь)
    есть компоненты которые правильно рисуют фигуры (без лесенок и зазубрин), поверх компонента положить картинку или пиктограмму и будет стильно, современно, молодежно
  10. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в Как отправить фотографию в ВКонтакте?   
    вот был рабочий пример, который постил на стену ВК картинку (сейчас вроде чуть изменили апи, но должно работать)
    https://github.com/rzaripov1990/FMX.RESTLight
  11. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в TPushClient - нашёл чудесную вещь   
    у меня есть заготовка, но не помню на чем остановился. надо будет посмотреть и выложить
  12. Like
    #WAMACO отреагировална sinuke в Выделить TListViewItem нажатием правой кнопки мыши   
    FindItemByPosition - вот тут можно найти https://github.com/rzaripov1990/ModernListView. просто скопировать два файла FMX.ListView.pas и FMX.ListView.Types.pas в папку с проектом
    да и высоты всех итемов (и футеров и хидеров) тоже можно узнать. самое просто - циклом пройтись и прибавлять к некой переменной высоту текущего итема. как только эта сумма станет больше локальной координаты, то найден нужный итем
  13. Like
    #WAMACO получил реакцию от AngryOwl в Контрастный стиль для борьбы с солнечным светом?   
    Темный текст на светлом
  14. Like
    #WAMACO получил реакцию от ENERGY в Контрастный стиль для борьбы с солнечным светом?   
    Темный текст на светлом
  15. Like
    #WAMACO отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Причина такого поведения довольно простая - java библиотеки FMX часто передают в Delphi только уведомление о событии, без непосредственного влияния на процесс. Открываем библиотеку fmx.jar и смотрим код класса WebClient (package com.embarcadero.firemonkey.webbrowser;):
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error);// обработка ошибки происходит здесь по дефолту if (this.mListener != null) { this.mListener.onReceivedSslError(view, handler, error);//передача в Delphi лишь уведомления, что событие произошло } } Одно из решений*:
    1. Заменяем** код на:
    public void onReceivedSslError(WebView paramWebView, SslErrorHandler paramSslErrorHandler, SslError paramSslError) { if (this.mListener != null) { this.mListener.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//Delphi обработчик } else { super.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//обработчик по умолчанию } } После манипуляций получаем свою версию библиотеки, мой пример здесь (Delphi Berlin).
    2. Подключаем библиотеку к проекту (скриншот ниже).
    3. Копируем unit FMX.WebBrowser.Android в папку своего проекта и меняем следующие строки:
    procedure TAndroidWebBrowserService.TWebBrowserListener.onReceivedSslError( P1: JWebView; P2: JSslErrorHandler; P3: JSslError); begin P2.proceed;//добавляем разрешение для истекших сертификатов FWBService.FailLoadingWithError;//стандартный обработчик OnDidFailLoadWithError end; *Если вариант изменения кода java библиотек совсем не подходит, можно реализовать все средствами Delphi. Для этого создаем свою реализация класса WebViewClient (или WebClient) и задаем его для JWebBrowser:
    //все тот же unit FMX.WebBrowser.Android; procedure TAndroidWebBrowserService.InitUIThread; var lClient : TWebBrowserCLientFix;//наш класс begin FJWebBrowser := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FJWebBrowser.getSettings.setJavaScriptEnabled(True); lClient := TWebBrowserCLientFix.Create(Self); FJWebBrowser.setWebViewClient(lClient);//меняем на наш класс FListener := TWebBrowserListener.Create(Self); lClient.SetWebViewListener(FListener); //комментируем //FJWebBrowser.SetWebViewListener(FListener); **Замена кода происходит по тому же сценарию, как и создание своих собственных классов на java. Если кому потребуется помощь - пишите, я помогу ответами и примером.

  16. Like
    #WAMACO получил реакцию от Ingalime в Выкладка iOS 10.3.2   
    Вот тут подробнее...
     
  17. Like
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в Посоветуйте, сделать TGrid из TListView. Как добавить кнопку-колонку в ListView   
    Сделайте обычными SpeedButton над ListView.
    И управляйте по событиям как требуется...
    Дешево, удобно и практично будет!
  18. Like
    #WAMACO отреагировална Евгений Корепов в [Статья] PHP сервер для рассылки Push на Android и iOS   
    Это не проблема компонентов, это проблема малограмотности программистов kinvey, видимо они учебник SQL еще не дочитали до места "ON DUPLICATE KEY UPDATE". Беда современных проектов - все деньги тратятся на дизайнеров и менеджеров, а на то что остается на реализацию технической части, можно нанять только индусов или малограмотных оутсорсеров по объявлению.
  19. Like
    #WAMACO отреагировална Fedor K в [Андроид]запрет пушей   
    Ingalime этой настройкой нельзя управлять программно по политики безопасности системы. Из приложения программно можно лишь проверить эту галочку и предложить пользователю открыть эти настройки. Есть 2 решения:
    (самый простой способ) не отправлять уведомление с сервера. Т.к. у Вас устройства хранятся в таблице, то необходимо просто добавить туда новый столбец (например "PushEnabled") и изменить sql запрос, которым выбираете токены устройств с БД. PHP код в этом случае не затрагивается. (если править сервер невозможно или у вас нет доступа) запретить уведомления в BroadcastReceiver, который их обрабатывает и непосредственно создает уведомление в статус баре (приложение свернуто/закрыто) или передает обработку в код FMX (приложение открыто). 2-ой способ является не тривиальным, т.к. требуется изменить стандартную библиотеку FMX cloud-messaging.jar, либо написать свой собственный BroadcastReceiver и его использовать в проекте + придется использовать SharedPreferences, чтобы хранить флаг состояния уведомлений для BroadcastReceiver.
    Я рекомендую воспользоваться первым способом. Опишите логику "включения/отключения" пушей, по каким правилам и где изменяется эта настройка, чтобы легче было Вам помочь.
  20. Like
    #WAMACO отреагировална ENERGY в [Статья] PHP сервер для рассылки Push на Android и iOS   
    Кто просил PHP код, для отправки пушей, без лимита на 1000 токенов за одну отправку. 
    Вот готовый вариант: 
    <?php                                                                                                 $server_key = 'AAAAnCw-yKA:APA91bEYphFbq_w...'; $title = 'Title'; $text = 'test'; $limit = 999; $field_name = 'DeviceToken';    $sql = mysqli_connect("mysqlserver.com", "DBName", "DBPassword");    /* check connection */    if (mysqli_connect_errno()) {     printf("Connect failed: %s\n", mysqli_connect_error());     exit(); }        $offset = 0;    while (true) {                                                                  $query = "SELECT $field_name FROM `DBName`.`TableName` LIMIT $limit OFFSET $offset";    $result = mysqli_query($sql, $query);                     if (!$result) {     die('Invalid query: ' . mysql_error()); }     if (mysqli_num_rows($result) == 0) {      echo "{\"result\":true}";        exit;        }   $arr = array();     while ($row = mysqli_fetch_array($result, MYSQL_ASSOC)) {     $arr[] =  $row["$field_name"];      }       pushSend($title, $text, $arr, $server_key);    $offset = $offset + $limit;   /* free result set */   mysqli_free_result($result);    //  foreach($arr as $item) {  //    echo $item, '<br>'; //} //echo '-----------<br>'; } mysqli_close($sql);                   // max 1000   function pushSend($title, $text, $tokens, $server_key) {     $url = 'https://fcm.googleapis.com/fcm/send';     $headers = array('Authorization: key=' . $server_key,       'Content-Type: application/json');        if (is_array($tokens))       $fields['registration_ids'] = $tokens;     else       $fields['registration_ids'] = array($tokens);        $fields['priority'] = 'high';     $fields['notification'] = array('body' => $text, 'title' => $title);     $fields['data'] = array('message' => $text, 'title' => $title);        $ch = curl_init();     curl_setopt_array($ch, array(             CURLOPT_URL => $url,             CURLOPT_POST => true,             CURLOPT_HTTPHEADER => $headers,             CURLOPT_RETURNTRANSFER => true,             CURLOPT_SSL_VERIFYHOST => 0,             CURLOPT_SSL_VERIFYPEER => false,             CURLOPT_POSTFIELDS => json_encode($fields)     ));     $result = curl_exec($ch);     curl_close($ch);     return $result; } ?>  
  21. Like
    #WAMACO отреагировална ENERGY в DisposeOf или Free?   
    @RoschinSpb
    Ну нет же.
    В не ARC (Auto reference counter), классическом компиляторе (Windows и Mac)  Free всегда вызывает деструктор и освобождает память выделенную под класс и его поля. Т.е. если обратиться потом к такому классу произойдет исключение AV.
    А вот в ARC компиляторах, DisposeOf вызовет деструктор, но память выделенная под класс и его поля, останется занятой, и не освободиться. Т,е. если после DisposeOf обратится к полям класса, не будет исключения AV, но поля уже будут очищены.  При этом в деструкторе можно освободить свои данные и уничтожить инкапсулированные классы.
    Такие объекты называют зомби-объекты - т.к. они остаются висеть в памяти до конца работы программы, и даже если ссылка позже на него уменьшиться до 0, память не освободиться и деструктор не будет вызван повторно.  Чтобы узнать находится ли объект в зомби состоянии, есть метод Disposed - это аналог Assign.
    Повторюсь всем рекомендую статью GunSmoker, там эта тема хорошо освещена.
     
  22. Like
    #WAMACO отреагировална ENERGY в DisposeOf или Free?   
    Вот эту еще почитайте статью, мне она больше понравилась.
    http://www.gunsmoker.ru/2013/05/modern-delphi.html
    Проблема DisposeOf в том, что он не освобождает память, а просто вызывает деструктор (к классу потом можно обратиться, и не будет Access Violation).
    На моб. платоформах я обычно иcпользую Free как и раньше, иногда FreeAndNil (если необходимо) т.к. на моб. платформах в отличии от десктопных платформ, вызов Free работает по другому . Если зайти в тело метода там будет комментарий: 
    // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear В случае моб. платформ - Free обнуляет переменную, уменьшает ARC на единицу, затем проверяет счетчик ARC и если он = 0 - то вызывает деструктор. 
    Если объект где то присваивался, в какую либо еще переменную, и переменная не была обнулена, то его счетчик ссылок ARC > 0, то он не освободиться с вызовом Free, на эту тему есть баг (фича?) с reference procedure, который вроде уже исправили в Токио (я не проверял, т.к. пока токио нормально не работает под Android).
    А вот в случае с визуальными контролами, если нужно убрать контрол, надо использовать DisposeOf  иначе он останется на форме (может кто знает как его убрать при помощи Free, что и где обнулить? ).
  23. Like
    #WAMACO отреагировална ENERGY в Кнопка изменяющая размеры относительно текста   
    Имхо BeginUpdate\EndUpdate тут лишние. Здесь одна операция, а не несколько.
    И лучше это будет сделать в OnResize кнопки.
  24. Like
    #WAMACO отреагировална ENERGY в Кнопки у ListVew ItemAppearance   
    Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав  картинку  с кнопкой  . 
    Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки.
     
    Чтобы определить по какому элементу Item'a кликнул юзер: 
     
    procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); begin   if ItemObject = nil then exit;   ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text); end;
     
  25. Like
    #WAMACO получил реакцию от Vitaldj в Посоветуйте функционал для приложения   
    Добавьте скопление членов партии на карте, т.е. все зарегистрированные члены партии видят близ себя других членов партии. Удобно, например, когда ты на митинге, собрании видишь количество единомышленников, их движение, скопление. Добавьте общий репозиторий добрых дел, с фотографиями, видео, описанием, чтобы другие члены партии могли проголосовать за значимость совершенных действий членов партии.
×
×
  • Создать...