Доска почета


Popular Content

Showing most liked content since 23.05.2017 Во всех областях

  1. 12 likes
    Ссылка на скачивание (Только для RAD Studio Berlin): fgx_0.7.1.118.zip Инструкция по установке: "Инструкция по установке набора компонентов FGX" FGX - Donate: QIWI: 4890 4941 7671 0929 Yandex.Money: 4100175510891 Описание Эта версия включает в себя следующий набор компонентов: Дизайнер итемов - дизайнер итемов. TfgToast (UPDATED) - класс отображения быстрых сообщений TfgFlipView - слайдер изображений. Поддерживает несколько способов переключения фотографий при помощи эффектов и сдвигов. При первом использовании ОБЯЗАТЕЛЬНО прочитать инструкцию "TfgFlipView - Инструкция загрузки стиля" TfgPositionAnimation - анимация свойств типа TPosition TfgPosition3DAnimation - анимация свойств типа TPosition3D TfgBitmapLinkAnimation - анимация свойств типа TBitmapLink TfgProgressDialog (UPDATED) - Компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения фоновой операции можно оценить. TfgActivityDialog (UPDATED) - компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения операции не возможно адекватно оценить. TfgActionSheet (UPDATED) - Аналог контекстного меню для мобильных платформ. TfgColorsPanel - Палитра цветов с возможностью выбора цвета. TfgGradientEdit (UPDATED) - Компонент выбора градиента. TfgLinkedLabel - Метка поддерживающая открытие Web ссылки в браузере по умолчанию. TfgApplicationEvents - компонент с возможностью легко задать обработчики на основные события приложения: Отслеживание смены состояния приложения, простой, обновление и выполнение действий Actions, Изменение ориентации устройства и тд. TfgVirtualKeyboard - компонент облегчающий работу с виртуальной клавиатурой. Позволяет задать пользовательские кнопки над виртуальной клавиатурой под iOS, а так же отлавливать события по отображению и скрытию клавиатуры. (UPDATED) Зарегистрированы все стилевые объекты на вкладке "FGX: Style objects" Список изменений TfgActionSheet: Добавлен новый вариант темы Theme = Custom и свойство ThemeID, позволяющий для андроида указать идентификатор своей темы диалога. Теперь доступна возможность создать свой вариант диалога для андроида. Изменен порядо срабатывания событий OnCancel, OnHide в реализации на iOS. Раньше срабатывали OnHide -> OnCancel, Теперь: OnCancel -> OnHide Обновлен пример Общие улучшения в читабельности кода TfgProgressDialog, TfgActivityDialog: Добавлен новый вариант темы Theme = Custom и свойство ThemeID, позволяющий для андроида указать идентификатор своей темы диалога. Обновлен пример Общие улучшения в читабельности кода TfgGradientEdit: Добавлено событие OnPointRemoved, срабатывающее, когда точка удалена из градиента. Обновлен пример TfgToast: Исправлена ошибка на iOS, приводящая к AV при многочисленном отображении тостов. (Спасибо Сергею Пьянкову за найденную ошибку) Регистрация стилевых объектов: Теперь регистрируются только те объекты, которые не добавлены в палитру.
  2. 9 likes
    Ссылка на статью. Автор: Александр Бирюков В статья я максимально подробно попытался описать работу с PHP скриптом для рассылки Push сообщений из любой программы вне зависимости от платформы. Затрагивается вопроса от экспорта скриптов до кода программы: отправка и получение Push, регистрация устройств. Надеюсь кому-нибудь пригодится. Буду рад комментариям, обоснованной критике и доработкам.
  3. 5 likes
    Описание того что нужно как то расплывчато, но вот примерно так можно сделать. Всего один TImage который используется для отрисовки битмапов. Видео и проект Tire.rar
  4. 4 likes
  5. 3 likes
    Golovanyuk, такое случается, когда кабель не достаточно хорошего качества/расшатан разъем/кастомная прошивка + недостаточно прав на телефоне. Если приложение первый раз запускается - то проблема не в настройках IDE. Попробуйте сделать следующее: Подключите телефон по USB Перейдите в папку platform-tools, лежит в Android SDK. У меня например такой путь: F:\18.0\PlatformSDKs\android-sdk-windows\platform-tools. Откройте окно команд (зажимаете "Shift" + правая кнопка мыши -> "Открыть окно команд"). Выполните "adb devices" - отобразиться список подключенных устройств. Выполните "adb shell su 0 setenforce 0" - на телефоне может появится окно запроса прав.
  6. 3 likes
    Добрый день, Друзья! Помогите, пожалуйста, разобраться - в голове уже каша Как в Delphi можно реализовать обработку поступающих на устройство PUSH-уведомлений при выгруженном или свернутом приложении? При запущеном и активном приложении проблем нет - использую OnReceiveNotificationEvent(Sender: TObject; const ANotification: TPushServiceNotification) в связке с TNotificationCenter. Эта процедура у меня: 1. очищает все активные уведомления; 2. создает в TNotificationCenter последнее пришедшее, которое и отображается пользователю. Его обработчик мной реализован. "Проблемы" есть если приложение выгружено или свернуто... Есть 2 очень похожих сценария: Сценарий №1: Приложение выгружено из памяти. Приходит PUSH. Пользователь нажимает на него. Приложение запускается. OnReceiveNotificationEvent после запуска не отрабатывает. Как обработать событие - не знаю Сценарий №2: Приложение запущено, но свернуто. Приходит PUSH. Пользователь нажимает на него. Приложение становится активным. После этого отрабатывает OnReceiveNotificationEvent: очищаются уведомления и создается новое. Пользователю надо повторно на него нажать и тогда сработает обработчик. Вопрос: Как получить текст (или любое другое поле - не важно) ЭТОГО push-уведомления после запуска/вывода приложения из фона? Допущение: Если ЭТО уведомление (запустившее приложение) идентифицировать нельзя, то как можно понять, что запуск произведен именно по нажатию на push? Задача актуальна не только для Android, но и iOS. Буду ОЧЕНЬ БЛАГОДАРЕН за помощь!
  7. 3 likes
    Можно и удалять. Но тогда не будут работать мои аналитические инструменты - частота запусков приложения, периоды активности и многое другое. У Равиля запрос добавления токена в базу вот такой: INSERT INTO PushTokens (`deviceToken`, `deviceID`, `platform`) VALUE ('$deviceToken', '$deviceID', '$platform') ON DUPLICATE KEY UPDATE `deviceToken` = '$deviceToken'"; У меня же он чуть сложнее: INSERT INTO gcm (`DeviceID`, `DeviceToken`, `City`, `last_update`, `add_date`, `RequestCount`, `Active`) VALUES ('$DeviceID','$DeviceToken','$City',NOW(),NOW(), 1, 1) ON DUPLICATE KEY UPDATE `DeviceToken` = '$DeviceToken', `City` = '$City', `last_update` = NOW(), `RequestCount` = `RequestCount` + 1, `Active` = 1 Таблица выглядит вот так CREATE TABLE `gcm` ( `id` int(11) NOT NULL AUTO_INCREMENT, `DeviceID` char(32) DEFAULT NULL, `DeviceToken` varchar(255) DEFAULT NULL, `City` varchar(100) DEFAULT NULL, `last_update` datetime DEFAULT NULL, `add_date` datetime DEFAULT NULL, `RequestCount` int(11) DEFAULT '1', `Active` bit(1) DEFAULT b'1', PRIMARY KEY (`id`), UNIQUE KEY `DeviceID_index` (`DeviceID`) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=40337 DEFAULT CHARSET=utf8; Т.е. кроме всего прочего я вижу: Дату-время первого запуска приложения Дату-время последнего запуска приложения Количество запусков приложения Стоит ли еще приложение на этом устройстве (Active) На поле City не обращайте внимание...
  8. 3 likes
    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;
  9. 3 likes
    @RoschinSpb Ну нет же. В не ARC (Auto reference counter), классическом компиляторе (Windows и Mac) Free всегда вызывает деструктор и освобождает память выделенную под класс и его поля. Т.е. если обратиться потом к такому классу произойдет исключение AV. А вот в ARC компиляторах, DisposeOf вызовет деструктор, но память выделенная под класс и его поля, останется занятой, и не освободиться. Т,е. если после DisposeOf обратится к полям класса, не будет исключения AV, но поля уже будут очищены. При этом в деструкторе можно освободить свои данные и уничтожить инкапсулированные классы. Такие объекты называют зомби-объекты - т.к. они остаются висеть в памяти до конца работы программы, и даже если ссылка позже на него уменьшиться до 0, память не освободиться и деструктор не будет вызван повторно. Чтобы узнать находится ли объект в зомби состоянии, есть метод Disposed - это аналог Assign. Повторюсь всем рекомендую статью GunSmoker, там эта тема хорошо освещена.
  10. 3 likes
    Название топика содержит ответ на ваш вопрос - 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). И попробуйте перефразировать свой вопрос, уточните конкретную задачу, так будет проще понять что вам нужно.
  11. 3 likes
    Вот так подготовили Как добавить "резиновый" SplashScreen в XE7 ? p.s. Старайтесь прикладывать проекты к темам, так будет проще вам помочь.
  12. 2 likes
    Кто просил 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; } ?>
  13. 2 likes
    Ingalime этой настройкой нельзя управлять программно по политики безопасности системы. Из приложения программно можно лишь проверить эту галочку и предложить пользователю открыть эти настройки. Есть 2 решения: (самый простой способ) не отправлять уведомление с сервера. Т.к. у Вас устройства хранятся в таблице, то необходимо просто добавить туда новый столбец (например "PushEnabled") и изменить sql запрос, которым выбираете токены устройств с БД. PHP код в этом случае не затрагивается. (если править сервер невозможно или у вас нет доступа) запретить уведомления в BroadcastReceiver, который их обрабатывает и непосредственно создает уведомление в статус баре (приложение свернуто/закрыто) или передает обработку в код FMX (приложение открыто). 2-ой способ является не тривиальным, т.к. требуется изменить стандартную библиотеку FMX cloud-messaging.jar, либо написать свой собственный BroadcastReceiver и его использовать в проекте + придется использовать SharedPreferences, чтобы хранить флаг состояния уведомлений для BroadcastReceiver. Я рекомендую воспользоваться первым способом. Опишите логику "включения/отключения" пушей, по каким правилам и где изменяется эта настройка, чтобы легче было Вам помочь.
  14. 2 likes
    потому что мобильная связь это не провод с интернетом. дикие задержки и все время рвется протоколы обмена с сервером не предусматривают постоянных переподключений а вот HTTP специально разработан для такого режима
  15. 2 likes
    точнее WHERE ((FieldDate >= D1) OR (D1 IS NULL)) AND ((FieldDate <= D2) OR (D2 IS NULL))
  16. 2 likes
    Видео (Task, Future, Parallel, WaitForAll etc.) и на русском
  17. 2 likes
    так же как и в любом другом компоненте, или в родном TListView. можно прям в дизайнере
  18. 2 likes
    Это нативный пикер, он не стилизуется из FMX. Нужно использовать xml стили для кастомизации, но это не точно
  19. 2 likes
    Вот примерно так 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);
  20. 2 likes
    Спасибо получилось. Для таких не умных как я, которые не понимают, что в консоли FCM надо писать самой: 1. Откройте дополнительные параметры в консоли FCM . 2. В первом поле КЛЮЧ принудительно самостоятельно напечатайте "mеssage" без ошибок в первом поле. В поле напротив напишите текст сообщения. 3. При этом появиться дополнительные поля ввода ниже. 4. В первом новом поле ниже напишите принудительно title без ошибок и напротив в значении ваш текст...
  21. 2 likes
    Отличная статья! Но добавлю один нюанс - функция 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); }
  22. 2 likes
    procedure TStartForm.getAllNotfications; var LNotification: TPushServiceNotification; s:string; ps:TPushService; begin if AServiceConnection=NIL then exit; ps:=AServiceConnection.Service; for LNotification in ps.StartupNotifications do begin s:=lNotification.Json.ToString; ///.... end; TNotificationCenter.Create(nil).CancelAll; end;
  23. 1 like
    Пулл потоков вам в помощь. Это о вопросе долго времени создания и удаления инстансов потоков.
  24. 1 like
    имхо, с firemonkey неплохо работает такая схема: 1. создать две потокозащищенные очереди (структуры), на си для этого подходит std::deque, в fmx можно TList. Защита стандартно TCriticalSection; 2. создать несколько потоков, с помощью TEvent указать им ссылки на очереди и критические секции; 3. в потоках: 3.1 TCriticalSection::Enter лочим очередь задач, 3.2 забираем крайнюю задачу 3.3 TCriticalSection::Leave отпускаем очередь задач 3.4 вычисления 3.5 по аналогии с очередью задач лочим очередь результатов, выкладываем результаты, отпускаем 3.6 повтор с пункта 3.1 4. в основном потоке в очереди (тоже lock unlock) выкладывать задачи и при наличии результатов отрисовывать имеющимися средствами. в 4 пункте нужен будет нужен будет какой-нибудь mmtimer.
  25. 1 like
    Для того, чтобы при нажатии на уведомление оно автоматически исчезало из StatusBar при его создании необходимо добавлять флаг: localBuilder.setAutoCancel(true); В библиотеке fmx.jar этот код отсутствует (package com.embarcadero.rtl.notifications, public class NotificationPublisher). У меня есть перекомпиленная библиотека для Seattle. Изменение библиотек выполняется таким же образом, как и создание своих всем известным методов через .bat файл.
  26. 1 like
    Если верить интернету, то в Windows создание потоков и синхронизация с основным потоком довольно "трудозатратая" операция. Для Windows я торможу поток dwStatus := WaitForSingleObject( Parms.fvEventUSB, INFINITE ); Когда надо запустить поток устанавливаю Event, данные из потока скидываю в потокобезопасный буффер и сообщаю об окончании обработки данных установкой другого Event.
  27. 1 like
    ENERGY Для получения всех активных уведомлений в Android существует метод: getActiveNotifications added in API level 23 StatusBarNotification[] getActiveNotifications () FMX (Berlin и ниже точно, Tokyo не смотрел) не предоставляет доступ к этому методу, в исходниках (Androidapi.JNI.App.pas) он закомментирован. Возможно при использовании своего wrapper для класса JNotificationManager или отсюда можно получить доступ к требуемому функционалу.
  28. 1 like
    Отмечу, что сталкивался с такой проблемой - То работает запуск приложения на смартфоне, то не работает, то странности возникают еще при деплоее на смартфон... В общем скажу просто - проблема была в кабеле. Самое интересное, что при подключении смартфон "виделся", и вроде бы все ок, но постоянные глюки при запуске приложения привели к одному решению - смена кабеля и все заработало. Не скажу, что это панацея, но я в своей практике уже трижды сталкивался с подобным. Кабель может работать на подзарядке, и даже при работе с устройством в плане чтения и записи фалов, через проводник, но будет "глючить" при более "тонкой" работе.
  29. 1 like
    @krapotkin TNotificationCenter.Create(nil).CancelAll; Это же утечка памяти. Надо уничтожать объект. Хотя по идее нет, в ARC компиляторах он должен сам уничтожится.
  30. 1 like
    А точно нужно дожидаться, пока все потоки отработают? Это не асинхронные задачи? В качестве еще одного варианта - воспользуйтесь interlocked-функциями. Главный поток определяет, сколько вторичных потоков он запустит. И выставляет нужное значение в integer-переменной. Каждый поток, завершив виток просчета вызывает InterlockedDecrement(ThreadCounter); При достижении нуля - из последнего вторичного потока вызывается TThread.Queue для сообщения главному потоку "все просчеты завершены". Ну и - потоки входят в спячку, например - на ожидании TEvent. А получив очередную порцию данных для просчета - выходят из ожидания события. Даже лучше не так: каждый поток при запуске делает InterlockedIncrement(ThreadCounter), не стоит главному потоку выставлять начальное значение, хватит с него и запуска вторичных потоков. А вот всё остальное - да, остается в силе.
  31. 1 like
    Если Windows - то это WaitForMultipleObjects в остальных случаях - см. TTask.WaitForAll
  32. 1 like
    Под отладчиком запускали? Удалите программу с Андроид. Сделайте Clean проекту. Запустите (Run) еще раз. Какая модель девайса? Новый пустой проект запускается?
  33. 1 like
    Не может, а точно. А баг не заметили потому, что проявляется далеко не на всех картинках. Как я понял только на одном, или нескольких оттенках серого (Ц). Это на сколько я понял из-за того, что при записи TBitmap в поток и последующем восстановлении данные получаются не совсем идентичными. Вот например если эту процедуру запускать несколько раз, то картинка становится клетчатой procedure TForm2.UpdateBitmap(var Bitmap: TBitmap); var Stream: TMemoryStream; begin if Bitmap <> nil then begin Stream := TMemoryStream.Create; try Bitmap.SaveToStream(Stream); FreeAndNil(Bitmap); Stream.Position := 0; Bitmap := TBitmap.Create; Bitmap.LoadFromStream(Stream); finally FreeAndNil(Stream); end; end; end; Вот, что у меня получилось. Вторая картинка (для сравнения) преобразуется точно также, но как видно не портится. Так что проблема не в TImageList и не в TImage, а где-то на более глубоком уровне. Добавляю также небольшой демо проектик. Проверял на Windows 10. Интересно что будет на других платформах. Proj.zip
  34. 1 like
    Кажется пора переводить свои приложения на app tethering... к чему все эти танцы с бубном?!
  35. 1 like
    Лучше каждый раз, потому что не известно из каких данных он генерируется и при этом у него есть срок действия, но хз какой
  36. 1 like
    определена. Начало потока + 6 байт + количество байт, ушедших в строку. Правильнее будет сделать mm.CopyFrom(InStream, InStream.Size - InStream.Position); , но не суть. А вот с путаницей байты-символы это да, это печалька.
  37. 1 like
    InStream.Seek(0, soFromBeginning); InStream.Seek(5, soFromCurrent); //почему не просто InStream.Seek(5, soFromBeginning); или InStream.position := 5 ? InStream.Read(b, 1); // длина строки входит в 1 байт? от 0 до 255?? SetLength(bb, b); // установить длину строки bb в b символов InStream.Read(bb[0], b); // прочитать в строку bb b байтов. Но строка должна содержать b*sizeof(char) байтов, т.е. 2b... ну и в mm попадает вообще максимум 255 - 6 - b это вообще непонятная формула до битмапа там вообще непонятно что доходит mm.CopyFrom(InStream, InStream.Size - 6 - b);// позиция InStream не определена. я бы сделал хотя бы InStream.position := 0;
  38. 1 like
    где он должен отрабатывать? вы сами должны проверять список ваших пушей как показано в предыдущем посте соответственно, получив пуш, вы тут же можете запустить любое другое приложение в помощью интента
  39. 1 like
    если у вас возникали проблемы с TThread то лучше понять источник проблем. Использование System.Threading ничем не отличается в этом плане. Те же потоки создаются. Та же синхронизация требуется. Для меня TTask - это способ в лучшем случае сделать что-то "по-быстрому". Если серьезное что, с отладкой, лучше по-прежнему пользовать TThread.
  40. 1 like
    Вкратце вот здесь можно почитать http://proghouse.ru/programming/36-delphi-xe7-ppl Например, если таск организован как бесконечный цикл, то после завершения каждого таска, в главном потоке увеличивать счётчик. Как только он станет равным количеству запущенных, можно будет обновлять информацию на экране и делать повторный запуск. Разумеется доступ к главному потоку должен быть синхронизирован. А если в таске конечная последовательность действий, то можно просто проверять статусы всех тасков. Логично. WaitForAll приостанавливает поток в котором был вызван до тех пор, пока не будут завершены все таски.
  41. 1 like
  42. 1 like
  43. 1 like
  44. 1 like
    Какую мою поставку? Это модернизированные(дописанные) сорсы эмбы
  45. 1 like
    Опыт подсказывает, что Интернет Эксплорер не браузер
  46. 1 like
    Можете скинуть куда-нибудь файл push.php с внесенными вами изменениями?
  47. 1 like
    хех, весело) а вы свой серверный ключ и id отправителя не стали ставить?) и кто-то не дружит с отправкой запросов в потоке
  48. 1 like
    можно, используя ModernLV TListView.Transparent TListView.TransparentHeaders TListView.TransparentItems TListView.TransparentSeparators
  49. 1 like
    Сделать так что бы были известны Создай что то типа редактора карт, где пользователь сможет выбрать текстуру, задать размеры и положение, потом сохранить все это в файл. А потом в игре отрывать его и будет известно все что нужно. Для примера, создать запись(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; В таком случае будут все нужные параметры известны, и примерно так же в играх и делают.
  50. 1 like
    Не, это геморрой старый. Наличие подсчета ссылок ни как его не уменьшает. Решается он путем TComponent.FreeNotification. Вся "прелесть" решения в том, что Free работает не так как раньше работал Free, а DisposeOf теперь работает так же как раньше работал Free. На десктопных платформах всё как раньше, а вот на мобильных, надо помнить, что за каждым углом тебя поджидает ARC с дубиной. FreeNotification и ARC по сути два разных механизма для решения одной проблемы, которые частично дублируют друг друга, частично конфликтуют, как два антивируса на одном компе. кактотак
This leaderboard is set to Москва/GMT+03:00