Лидеры
Популярный контент
Показан контент с высокой репутацией 11.04.2017 во всех областях
-
TPath - нарисовать путь для объекта
Алмаз Амангельды и 2 других отреагировал denprox за вопрос
Пришлось набирать весь код по видео. Если кому будет полезно, вот исходник PathAnim2.rar3 балла -
Delphi Tokyo сломали Text в Android
Евгений Корепов и ещё один отреагировал Kitty за вопрос
Проголосовала.2 балла -
Отправка пуша из консоли firebase
Kitty отреагировал Равиль Зарипов (ZuBy) за вопрос
а написать самой уже никак? на крайний случай, смотрите внимательно на картинку которую скинул выше должно быть 100% совпадание, аккуратней там придется набирать текст!!!!1 балл -
Delphi Tokyo сломали Text в Android
Kitty отреагировал Евгений Корепов за вопрос
Обнаружил очередной глюк 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 балл -
Delphi Tokyo сломали Text в Android
Rusland отреагировал Евгений Корепов за вопрос
Создал запрос https://quality.embarcadero.com/browse/RSP-17813 , проголосуйте кому не лень. Спасибо.1 балл -
[Статья] PHP сервер для рассылки Push на Android и iOS
Ingalime отреагировал Евгений Корепов за тема
Вы про 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 балл -
[Статья] PHP сервер для рассылки Push на Android и iOS
Rusland отреагировал Евгений Корепов за тема
Отличная статья! Но добавлю один нюанс - функция 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 балл -
TfgToast
Brovin Yaroslav отреагировал ZverA4 за вопрос
Сам отвечу. Ярослав подсказал, спасибо ему, а я что-то "затупил" объявляю в паблике: TfgToast *Toast; - это лишнее. надо так: TfgToast::Show(L"Всем привет!");1 балл -
Вы подменяете понятия. Озвученное - это (возможно) "самое разумное решение", если "надо сделать быстро, а дальше трава не расти" (вспоминаем картинку быстро-качественно-дорого), а никак не самое правильное. У индейцев есть как минимум одна плохая черта - они очень любят покушать ресурсы системы, особенно - посоздавать потоков. Посему система, построенная на тетеринге будет не очень масштабируемой в условиях интенсивного обмена. Небольшая ремарка - еще в первой версии появления нативных http компонентов официальные представители Embarcadero настоятельно стали рекомендовать отказаться от Indy. Самое правильное решение должно удовлетворять всем требованиям, предъявляемым к приложению, обладать хорошей способностью к модификации/устранению ошибок/надстраиваемостью функционала и быть легко масштабируемым. У тетеринга есть одно неоспоримое преимущество - это кроссплатформенность. В остальном правильность выбора его в качестве решения зависит от задачи.1 балл
-
Скриншот с WebBrowser (WebBrowser1.MakeScreenshot)
Rusland отреагировал Равиль Зарипов (ZuBy) за вопрос
Замените код на такой 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 балл -
FMX.ImageList динамическое добавление элементов
Евгений Корепов отреагировал ENERGY за вопрос
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 балл -
Перспективы RAD
Alex Bakulin отреагировал Gingercat за вопрос
Эх, попкорн закончился) Доброго вечера всем. Вот вы тут развели ср..., прям диву даешься. Неужели тут кто то всерьез верит, что 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 балл -
Все, окончательно осознал механизм работы, теперь все стало на свои места. Все дело в том, что моя камера выдает данные в формате AARRGGBB, только вот значение старших двух бит равно $00, а не $FF. Поэтому картинка и воспринимается прозрачной для TImage. В итоге пробежался в цикле по памяти, поменял нули на $FF и все заработало.1 балл