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

Лидеры

  1. Евгений Корепов

    Евгений Корепов

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


    • Баллы

      4

    • Постов

      738


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

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

    Модераторы


    • Баллы

      3

    • Постов

      2 517


  3. denprox

    denprox

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


    • Баллы

      3

    • Постов

      44


  4. Kitty

    Kitty

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


    • Баллы

      2

    • Постов

      792


Популярный контент

Показан контент с высокой репутацией 11.04.2017 во всех областях

  1. Пришлось набирать весь код по видео. Если кому будет полезно, вот исходник PathAnim2.rar
    3 балла
  2. Проголосовала.
    2 балла
  3. Добавил тестовый проект и серверную часть, статью по ссылке обновил https://github.com/rzaripov1990/PUSHTestFCM
    1 балл
  4. а написать самой уже никак? на крайний случай, смотрите внимательно на картинку которую скинул выше должно быть 100% совпадание, аккуратней там придется набирать текст!!!!
    1 балл
  5. Обнаружил очередной глюк Tokyo - сломали Text в Android. А именно порушили раскраску символов Юникода. Воспроизводится просто : procedure TFormMain.FormCreate(Sender: TObject); Var Text1: TText; begin Text1:=TText.Create(Self); Text1.Text:='|' + Char($2713) + '|'; Text1.Font.Size:=48; Text1.Color:=TAlphaColorRec.Red; Text1.Align:=TAlignLayout.Client; Text1.TextSettings.HorzAlign:=TTextAlign.Center; Text1.TextSettings.VertAlign:=TTextAlign.Center; FormMain.AddObject(Text1); end; На первом скриншоте этот код выполнен в Berlin, все выглядит как задуманно. На втором скриншоте этот же код в Tokyo.
    1 балл
  6. Создал запрос https://quality.embarcadero.com/browse/RSP-17813 , проголосуйте кому не лень. Спасибо.
    1 балл
  7. Вы про global.pas? Если про него, то как то так : unit global; interface uses System.Classes, {IdHTTP,}System.Net.HTTPClient, SysUtils, FMX.Notification; /// <summary> /// Процедура регистрации устройства. /// </summary> /// <param name="DeviceID"> /// ID регистрируемого устройства /// </param> /// <param name="DeviceToken"> /// Токен регистрируемого устройства /// </param> procedure RegisterDevice(DeviceID : string; DeviceToken : string); /// <summary> /// Процедура отправки Push сообщения на сервер. /// </summary> /// <param name="MessageText"> /// Текст отправляемого сообщения /// </param> procedure SendPush(MessageText : string); /// <summary> /// Процедура вывода сообщения из приложения. /// </summary> /// <param name="MessageText"> /// Текст выводимого сообщения /// </param> /// <param name="BadgeNumber"> /// Число выводимое на иконку приложения /// </param> procedure ShowNotification(MessageText : string; BadgeNumber : integer); const // Доменное имя сайта DOMAIN: string = 'http://example.ru/'; implementation procedure RegisterDevice(DeviceID : string; DeviceToken : string); var // Подключение для передачи данных httpconnect : THTTPClient; AQuery : String; begin try // Создаём подключение httpconnect := THTTPClient.Create; // Указываем данные для отправки AQuery:='?action=register-device&did=' + DeviceID + '&token=' + DeviceToken; {$ifdef ANDROID} AQuery:=AQuery + '&platform=android'; {$else} AQuery:=AQuery + '&platform=ios'; {$endif} // Отправляем запрос httpconnect.Get(DOMAIN + 'push.php' + AQuery); finally // Отключаемся и освобождаем память httpconnect.free end; end; procedure SendPush(MessageText : string); var // Подключение для передачи данных httpconnect : THTTPClient; AQuery : String; begin try // Создаём подключение httpconnect := THTTPClient.Create; // Указываем данные для отправки AQuery:='?action=send-push&text=' + MessageText; // Отправляем запрос httpconnect.Get(DOMAIN + 'push.php' + AQuery); finally // Отключаемся и освобождаем память httpconnect.Free; end; end; procedure ShowNotification(MessageText : string; BadgeNumber : integer); var NotificationC: TNotificationCenter; Notification: TNotification; begin // Создаём центр уведомлений и уведомление для отправки NotificationC := TNotificationCenter.Create(nil); Notification := NotificationC.CreateNotification; try // Если центр уведомлений поддерживается системой if NotificationC.Supported then begin // Устанавливаем текст сообщения Notification.AlertBody := MessageText; // Включаем звук при выводе сообщение Notification.EnableSound := true; // Устанавливаем цифру на иконке приложения Notification.Number := BadgeNumber; NotificationC.ApplicationIconBadgeNumber := BadgeNumber; // Выводим сообщение из приложения NotificationC.PresentNotification(Notification); end; finally // Очищаем переменные Notification.DisposeOf; NotificationC.Free; NotificationC.DisposeOf; end; end; end.
    1 балл
  8. Отличная статья! Но добавлю один нюанс - функция function pushSend($title, $text, $tokens, $server_key) реализована не до конца, дело в том что у FCM есть одно ограничение - отправка не больше 1000 токенов за раз. Сам на это напоролся и не мог понять почему части пользователей рассылки не приходят (рассылка велась по регионам России, общее количество около 100 тысяч). Пришлось накидать промежуточную функцию для разбивки на пакеты по 1000 штук: function SendGCMMessagesPacket($apiKey, $DevicesTokenArray, $message, $title, $DBLink, $TableName, $MyLog_GCM_file) { if (count($DevicesTokenArray)==0) { MyLog($MyLog_GCM_file, "Token Array is 0, skip sending"); return(0); } $Count_Success = 0; $DeviceCountMax = 1000; $DeviceCountIndex = 0; $DevicesTokenPacketArray = array(); $gcpm = new GCMPushMessage($apiKey); while ($DeviceCountIndex<=count($DevicesTokenArray)) { $DevicesTokenPacketArray = array_slice($DevicesTokenArray, $DeviceCountIndex, $DeviceCountMax); MyLog($MyLog_GCM_file, "Packet send: start index $DeviceCountIndex, count ".count($DevicesTokenPacketArray)); $gcpm->setDevices($DevicesTokenPacketArray); $ResponceJSON = $gcpm->send($message, array('title' => $title)); $Count_Success = $Count_Success + AnalyzeResponse($DevicesTokenPacketArray, $ResponceJSON, $DBLink, $TableName, $MyLog_GCM_file); MyLog($MyLog_GCM_file, $ResponceJSON); $DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax; } return($Count_Success); } Функция AnalyzeResponse анализирует ответ и помечает в базе не зарегистрированные токены как неактивные function AnalyzeResponse($DevicesTokenArray, $ResponceJSON, $DBLink, $TableName, $MyLog_GCM_file) { $Count_Success = 0; $ResponceArray = json_decode($ResponceJSON, true); if (isset($ResponceArray['results'])) { $Index = 0; foreach ($ResponceArray['results'] as $key => $value){ if (isset($value['error'])) { if (isset($DevicesTokenArray[$Index])) { MyLog($MyLog_GCM_file, $DevicesTokenArray[$Index].' : '.$value['error']); $query = "UPDATE $TableName SET Active = 0 WHERE DeviceToken = '$DevicesTokenArray[$Index]'"; $mysql_result = mysqli_query($DBLink, $query); } } else { $Count_Success = $Count_Success + 1; } $Index = $Index + 1; } } return($Count_Success); }
    1 балл
  9. ZverA4

    TfgToast

    Сам отвечу. Ярослав подсказал, спасибо ему, а я что-то "затупил" объявляю в паблике: TfgToast *Toast; - это лишнее. надо так: TfgToast::Show(L"Всем привет!");
    1 балл
  10. Вы подменяете понятия. Озвученное - это (возможно) "самое разумное решение", если "надо сделать быстро, а дальше трава не расти" (вспоминаем картинку быстро-качественно-дорого), а никак не самое правильное. У индейцев есть как минимум одна плохая черта - они очень любят покушать ресурсы системы, особенно - посоздавать потоков. Посему система, построенная на тетеринге будет не очень масштабируемой в условиях интенсивного обмена. Небольшая ремарка - еще в первой версии появления нативных http компонентов официальные представители Embarcadero настоятельно стали рекомендовать отказаться от Indy. Самое правильное решение должно удовлетворять всем требованиям, предъявляемым к приложению, обладать хорошей способностью к модификации/устранению ошибок/надстраиваемостью функционала и быть легко масштабируемым. У тетеринга есть одно неоспоримое преимущество - это кроссплатформенность. В остальном правильность выбора его в качестве решения зависит от задачи.
    1 балл
  11. Замените код на такой procedure TForm1.WebBrowser1DidStartLoad(ASender: TObject); var aThread: TThread; begin aThread := TThread.CreateAnonymousThread( procedure begin TThread.Synchronize(nil, procedure begin If CheckBox1.IsChecked Then Image1.Bitmap := WebBrowser1.MakeScreenshot; end) end); aThread.FreeOnTerminate := true; aThread.Start; end;
    1 балл
  12. type TImageListHelper = class helper for TImageList function Add(aBitmap: TBitmap): integer; end; function TImageListHelper.Add(aBitmap: TBitmap): integer; const SCALE = 1; var vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; vLayer: TLayer; begin Result := -1; if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit; // add source bitmap vSource := Source.Add; vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; vSource.MultiResBitmap.SizeKind := TSizeKind.Source; vSource.MultiResBitmap.Width := Round(aBitmap.Width / SCALE); vSource.MultiResBitmap.Height := Round(aBitmap.Height / SCALE); vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True); if vBitmapItem = nil then begin vBitmapItem := vSource.MultiResBitmap.Add; vBitmapItem.Scale := Scale; end; vBitmapItem.Bitmap.Assign(aBitmap); vDest := Destination.Add; vLayer := vDest.Layers.Add; vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width, vSource.MultiResBitmap.Height); vLayer.Name := vSource.Name; Result := vDest.Index; end; Хелпер позволяет добавлять свои методы, не наследуясь от класса. После этого можно обращаться к любому ImageList ImageList1.Add(MyBitmap);
    1 балл
  13. Например, вот так: Создаём фрейм FFrmSettings := TfrmSettings.Create(Self); FFrmSettings.Parent := Parent; Уничтожаем фрейм if FFrmSettings <> nil then begin FFrmSettings.Parent := nil; FFrmSettings.DisposeOf; FFrmSettings := nil; end;
    1 балл
  14. Gingercat

    Перспективы RAD

    Эх, попкорн закончился) Доброго вечера всем. Вот вы тут развели ср..., прям диву даешься. Неужели тут кто то всерьез верит, что Rad Studio похоронят - вы чего? СМена кадровой политики - абсолютно нормальное явление в любой организации, которая не сидит на месте. Другой вопрос - что послужило толчком? Но не суть. Тут прочитал - вот мол никто на FMX не пишет - вы судите по тому, сколько информации (удивленный смайл). Неужто кто то всерьез думает, что солидные компании, которые базируются на Rad Studio, будет трубить на каждом углу - смотрите, у нас софт написан на Rad Studio? (если быть точным, то с использованием, не придирайтесь)) ЗАЧЕМ оно им? С такой ценовой политикой, достаточно нескольких сотен пользователей для безбедной жизни, хотя думаю их в разы больше. А вот про баги и тд - улыбнуло. Есть у меня опыт небольшой работы и с FMX под ANdroid, и куда больший по десктоп, естественно под VCL. Есть опыт с плюсами и шарпом на Visual Studio тоже под десктоп. Ну и Qt немного. И судя по своему скромному опыту, еще вопрос - где больше багов, когда начинаешь копать глубже. Тута вон галку снял, и софт с 99% уверенностью запустится у всех, а Visual Studio - без опыта, один процесс настройки зависимостей проекта в новых версиях - тот еще гемморой. А потом начинаешь пользователям долбить - скачайте рантайм, а вот еще ддлку эту, а у вас версия Фреймворка не та))) Адекватно собрать статически слинкованный Qt мне так и не удалось, точнее удалось под MinGW - не впечатлило. Похоже многие забыли - FMX, Rad, Visual, pascal, c++, c#, и тд, и тп - это только инструмент, все зависит от того, кто его держит. Kitty - мне очень интересно - отчего такая потребность - закопают или нет? А кто мешает перебраться, в случае необходимости в другую среду - знания то лишними не будут. Напоминает покупку первой машины - месяцами выбирают (количество критериев зашкаливает - и чтоб то не сломалось, и не устарело, и тд), в итоге покупается что то непотребное, просто из-за подхода, при этом количество нервов потраченных...) вы же не на всю жизнь покупаете) Так и тут - ну случится беда, закопают - так правильно сказали: может через пару лет и Андроид гавкнет - что теперь не писать под него. В крайнем случае можно на время перебирания в другую среду остаться на старой версии. Хотя, вынужден извиниться, возможно у вас действительно вперед смотрящие, долгосрочные проекты, тогда стоит думать сейчас (ни в коем случае не сарказм). Но положа руку на сердце, поверьте - выбор то не велик, к сожалению, когда дело доходит до чего - то большего, чем Hello World. P.S. не первый год пытаюсь переползти в Visual Studio - именно написание кода там куда более комфортное, но увы - так и не смог) сошелся на Dll-ках, из Visual Studio, и основе в Rad Studio - довольно удобно и комфортно.
    1 балл
  15. Все, окончательно осознал механизм работы, теперь все стало на свои места. Все дело в том, что моя камера выдает данные в формате AARRGGBB, только вот значение старших двух бит равно $00, а не $FF. Поэтому картинка и воспринимается прозрачной для TImage. В итоге пробежался в цикле по памяти, поменял нули на $FF и все заработало.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...