Лидеры
Популярный контент
Показан контент с высокой репутацией 23.05.2017 во всех областях
-
Описание того что нужно как то расплывчато, но вот примерно так можно сделать. Всего один TImage который используется для отрисовки битмапов. Видео и проект Tire.rar4 балла
-
Slava Marchenko подсказал что при закрытом приложении получить сам текст можно так: procedure TFormMain.FormActivate(Sender: TObject); var CurNotification : TPushServiceNotification; begin if Length(fPushService.StartupNotifications) > 0 then for CurNotification in fPushService.StartupNotifications do if Assigned(CurNotification) then Memo.Lines.Text := CurNotification.Json.ToJSON; end;2 балла
-
Запуск приложения от PUSH-уведомления
Ingalime отреагировал ra.eremeev за вопрос
Добрый день, Друзья! Помогите, пожалуйста, разобраться - в голове уже каша Как в Delphi можно реализовать обработку поступающих на устройство PUSH-уведомлений при выгруженном или свернутом приложении? При запущеном и активном приложении проблем нет - использую OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification) в связке с TNotificationCenter. Эта процедура у меня: 1. очищает все активные уведомления; 2. создает в TNotificationCenter последнее пришедшее, которое и отображается пользователю. Его обработчик мной реализован. "Проблемы" есть если приложение выгружено или свернуто... Есть 2 очень похожих сценария: Сценарий №1: Приложение выгружено из памяти. Приходит PUSH. Пользователь нажимает на него. Приложение запускается. OnReceiveNotificationEvent после запуска не отрабатывает. Как обработать событие - не знаю Сценарий №2: Приложение запущено, но свернуто. Приходит PUSH. Пользователь нажимает на него. Приложение становится активным. После этого отрабатывает OnReceiveNotificationEvent: очищаются уведомления и создается новое. Пользователю надо повторно на него нажать и тогда сработает обработчик. Вопрос: Как получить текст (или любое другое поле - не важно) ЭТОГО push-уведомления после запуска/вывода приложения из фона? Допущение: Если ЭТО уведомление (запустившее приложение) идентифицировать нельзя, то как можно понять, что запуск произведен именно по нажатию на push? Задача актуальна не только для Android, но и iOS. Буду ОЧЕНЬ БЛАГОДАРЕН за помощь!1 балл -
Листбокс и Андроид
DMS отреагировал Равиль Зарипов (ZuBy) за вопрос
так же как и в любом другом компоненте, или в родном TListView. можно прям в дизайнере1 балл -
Листбокс и Андроид
DMS отреагировал Равиль Зарипов (ZuBy) за вопрос
https://github.com/rzaripov1990/ModernListView#colorizer1 балл -
1 балл
-
1 балл
-
Листбокс и Андроид
Ingalime отреагировал Равиль Зарипов (ZuBy) за вопрос
Какую мою поставку? Это модернизированные(дописанные) сорсы эмбы1 балл -
[Андроид] статья ZuBy и фантомный пуш
Ingalime отреагировал Равиль Зарипов (ZuBy) за вопрос
Опыт подсказывает, что Интернет Эксплорер не браузер1 балл -
Можете скинуть куда-нибудь файл push.php с внесенными вами изменениями?1 балл
-
[Андроид] статья ZuBy и фантомный пуш
Anasazi отреагировал Равиль Зарипов (ZuBy) за вопрос
хех, весело) а вы свой серверный ключ и id отправителя не стали ставить?) и кто-то не дружит с отправкой запросов в потоке1 балл -
Листбокс и Андроид
DMS отреагировал Равиль Зарипов (ZuBy) за вопрос
можно, используя ModernLV TListView.Transparent TListView.TransparentHeaders TListView.TransparentItems TListView.TransparentSeparators1 балл -
Стрелковый тир (игра)
Равиль Зарипов (ZuBy) отреагировал Mars M за вопрос
Сделать так что бы были известны Создай что то типа редактора карт, где пользователь сможет выбрать текстуру, задать размеры и положение, потом сохранить все это в файл. А потом в игре отрывать его и будет известно все что нужно. Для примера, создать запись(record) type TMap = record Texture: string[255]; wallRect: TRectF; targetRect: TRectF; winRect: TRectF; RadArr: array[0..3] of Single; ClrArr: array[0..3] of TAlphaColor; end; Пользователь во время создания/редактирования карты заполняет его. ............... var Map: TMap; ............... Texture := 'wall.bmp'; wallRect := TRectF.Create(0, 0, 20, 50); ............... ............... Сохраняем в файл var mStream: TMemoryStream; begin mStream := TMemoryStream.Create; mStream.Write(Map, SizeOf(TMap)); mStream.SaveToFile('maps\tire.dat'); mStream.Free; end; В игре создаем точно такую же запись(record) как и в редакторе, загружаем сохраненный файл с параметрами и заполняем из него запись var mStream: TMemoryStream; Map: TMap; begin mStream := TMemoryStream.Create; mStream.LoadFromFile('maps\tire.dat'); mStream.Read(Map, SizeOf(TMap)); mStream.Free; end; В таком случае будут все нужные параметры известны, и примерно так же в играх и делают.1 балл -
А если внутри скрипта есть проверка пароля? Добавь поля login и pass и будет нормально.1 балл
-
DisposeOf или Free?
Равиль Зарипов (ZuBy) отреагировал ENERGY за вопрос
@RoschinSpb Ну нет же. В не ARC (Auto reference counter), классическом компиляторе (Windows и Mac) Free всегда вызывает деструктор и освобождает память выделенную под класс и его поля. Т.е. если обратиться потом к такому классу произойдет исключение AV. А вот в ARC компиляторах, DisposeOf вызовет деструктор, но память выделенная под класс и его поля, останется занятой, и не освободиться. Т,е. если после DisposeOf обратится к полям класса, не будет исключения AV, но поля уже будут очищены. При этом в деструкторе можно освободить свои данные и уничтожить инкапсулированные классы. Такие объекты называют зомби-объекты - т.к. они остаются висеть в памяти до конца работы программы, и даже если ссылка позже на него уменьшиться до 0, память не освободиться и деструктор не будет вызван повторно. Чтобы узнать находится ли объект в зомби состоянии, есть метод Disposed - это аналог Assign. Повторюсь всем рекомендую статью GunSmoker, там эта тема хорошо освещена.1 балл -
DisposeOf или Free?
Равиль Зарипов (ZuBy) отреагировал RoschinSpb за вопрос
Не, это геморрой старый. Наличие подсчета ссылок ни как его не уменьшает. Решается он путем TComponent.FreeNotification. Вся "прелесть" решения в том, что Free работает не так как раньше работал Free, а DisposeOf теперь работает так же как раньше работал Free. На десктопных платформах всё как раньше, а вот на мобильных, надо помнить, что за каждым углом тебя поджидает ARC с дубиной. FreeNotification и ARC по сути два разных механизма для решения одной проблемы, которые частично дублируют друг друга, частично конфликтуют, как два антивируса на одном компе. кактотак1 балл -
Название топика содержит ответ на ваш вопрос - TIdTCPClient, ключевое слово "TCP". Этот протокол адресует устройства (или интерфейсы) исключительно по IP адресу(IPv4 или IPv6). Компонент TIdTCPClient работает следующим образом - если TIdTCPClient.Host содержит IP адрес, все нормально, отправляем туда пакет, но если в TIdTCPClient.Host строка, то ресолвим ее в IP адрес и после этого отправляем пакет на полученный адрес. Разрешение (ресолвинг) DNS имен происходит по примерно такой цепочке : Если это localhost, то система без вопросов возвращает 127.0.0.1 Операционка смотрит свои локальные настройки (windows C:\Windows\System32\drivers\etc\hosts, unix /etc/hosts) Проверяется локальный кэш dns записей Делается запрос на DNS сервер Так же могут применяться экзотические или устаревшие методы, к примеру Windows NetBIOS Name Server (WINS server). И попробуйте перефразировать свой вопрос, уточните конкретную задачу, так будет проще понять что вам нужно.1 балл
-
Вот примерно так PostData:= TStringList.Create; try // Создаём подключение IdHTTP1 := TIdHTTP.Create; // Указываем данные для отправки PostData.Clear; postdata.Add('text_push=' + Memo1.Text); postdata.Add('action=send_push'); // Отправляем запрос Result:=IdHTTP1.Post(DOMAIN + 'push.php', postdata); finally end; Потом можешь куда-нибудь отобразить результат. showmessage(result);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 балл