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

Лидеры

  1. ENERGY

    ENERGY

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


    • Баллы

      3

    • Постов

      568


  2. Сергей Сергеев

    Сергей Сергеев

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


    • Баллы

      2

    • Постов

      144


  3. dnekrasov

    dnekrasov

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


    • Баллы

      2

    • Постов

      317


  4. #WAMACO

    #WAMACO

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


    • Баллы

      2

    • Постов

      776


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

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

  1. Равиль, сразу извиняюсь, готов понести наказание, но запощу решение. Как уже говорил все просто, если у вас 4345 сообщений, то делим массив токенов и отправляем 4 раза по 1000, и один раз 345. Не забывайте что вы программисты, и во всех языках программирования это делается одинаково просто. Вот код, писал прямо в гитхабе, естественно не проверял, если что то упустил, прошу прощения (а упустил я анализ результата). function pushSendOver1000($title, $text, $tokens, $server_key) { $Count_Success = 0; $DeviceCountMax = 1000; $DeviceCountIndex = 0; $DevicesTokenPacketArray = array(); while ($DeviceCountIndex<=count($tokens)) { $DevicesTokenPacketArray = array_slice($tokens, $DeviceCountIndex, $DeviceCountMax); pushSend($title, $text, $DevicesTokenPacketArray, $server_key); $DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax; } } Запостил также на гитхаб. Можете ручками добавить функцию в конец https://github.com/rzaripov1990/PUSHTestFCM/blob/master/pushTest/push.php и соответственно вызывать не pushSend, а pushSendOver1000
    2 балла
  2. Понял как это делать. Устанавливаем высоту кнопки procedure TfrmMain.lvFavoritesUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var TextObject: TListItemDrawable; begin TextObject := AItem.Objects.FindDrawable('TextButton16'); if TextObject <> nil then begin TextObject.Height := 30; end; end;
    2 балла
  3. Сергей Сергеев

    Ipv6 в datasnap

    Проблема решена - приложение в Апп сторе. Опишу как решил. Конфигурация - Berlin 10.1 - update 2, Xcode 8. Datasnap сервер, использую tcpIp. Компоненты на клиенте TSqlConnection - для Datasnap, TIdTcpClient - использую для проверки соединения перед открытием ДатаСнар соединения, т.к. в нем не работает ТаймОут и есть вероятность "залипнуть" Сервер так и остался в ИП4 ( вначале хотел перевести его в ип6, но провайдер МТС ответил, что такие адреса не дает, сделал туннель с tunnelbroker.net на тестовый сервер, но так и не пригодилось ( кстати бесплатно, но без гарантии пропускной способности) . Никаких квадратных скобок , если у вас имена хостов а не ИП адреса не нужны. Смысл простой - у обоих компонентов нужно выставить свойства протоколов в зависимости от сети нахождения клиента. Вначале ставлю у обоих ИПв4, если коннект ексептиться - то ставлю ипв6 и еще раз пробую коннектится. и только второй ексепт скажет, что сети действительно нет. function TClientModule1.gethost(aHost : string):string; var dbxProps: TDBXDatasnapProperties; begin try TabbedForm.HostDS := TabbedForm.Host4; TabbedForm.HostP := TabbedForm.Host4; // ставим все в ип4 IdTCPClient1.IPVersion := TIdIpVersion.Id_IPv4; IdTCPClient1.Host:=TabbedForm.Host4; IdTCPClient1.Port:=StrToInt(TabbedForm.port); //порт сервера DataSnap idTCPClient1.ConnectTimeout := 12000; //заданный тайм-аут Assert(SQLConnection1.DriverName = 'DataSnap', 'Driver must be DataSnap'); dbxProps := SQLConnection1.ConnectionData.Properties as TDBXDatasnapProperties; dbxProps.CommunicationProtocol := 'tcp/ip'; dbxProps.CommunicationIPVersion := 'IP_IPv4'; IdTCPClient1.Connect; if IdTCPClient1.Connected then begin //подключились result:=TabbedForm.Host4; TabbedForm.HostDS := TabbedForm.Host4; TabbedForm.HostP := TabbedForm.Host4; IdTCPClient1.Disconnect; end; except on E: Exception do begin //toast ('IPv4 except '+E.Message); try IdTCPClient1.IPVersion := TIdIpVersion.Id_IPv6; IdTCPClient1.Host:= TabbedForm.Host6P; IdTCPClient1.Port:=StrToInt(TabbedForm.port); //порт сервера DataSnap idTCPClient1.ConnectTimeout := 12000; //заданный тайм-аут IdTCPClient1.Connect; if IdTCPClient1.Connected then begin //подключились result:=TabbedForm.Host6DS; TabbedForm.HostDS := TabbedForm.Host6DS; TabbedForm.HostP := TabbedForm.Host6P; IdTCPClient1.Disconnect; dbxProps.CommunicationIPVersion := 'IP_IPv6'; end; except on E: Exception do begin //не подключились result:='Не подключились'; dbxProps.CommunicationIPVersion := 'IP_IPv4'; IdTCPClient1.IPVersion := TIdIpVersion.Id_IPv4; TabbedForm.HostDS := TabbedForm.Host4; TabbedForm.HostP := TabbedForm.Host4; end; end; end; end; Тут немного есть излишества кода - думал что для Ип4 и Ип6 будут разные имена хостов, но сейчас это одно и тоже имя Сервера который находится в Ип4 и не имеет ни выхода ни адреса в ип6. вызвав эту фунцию я заполняю глобальные переменные ( ds- датаснап сервер. P- для пробного открытия ("пинг" )) на самом деле они тоже одинаковые. клиента проверял, как описано http://www.brianjcoleman.com/tutorial-how-to-test-your-app-for-ipv6-compatibility/ т.е. макбук подключен через 3ж модем в сеть и через WiFi раздает ИпВ6 сеть и Айфон к ней присоединен. Если приложение работает в этой внутренней ипв6 сети, то все - проблема решена - Аппле именно так и проверяет.
    2 балла
  4. Добавьте скопление членов партии на карте, т.е. все зарегистрированные члены партии видят близ себя других членов партии. Удобно, например, когда ты на митинге, собрании видишь количество единомышленников, их движение, скопление. Добавьте общий репозиторий добрых дел, с фотографиями, видео, описанием, чтобы другие члены партии могли проголосовать за значимость совершенных действий членов партии.
    2 балла
  5. Вот вариант, его можно применять в любом месте (обычно в OnCreateForm), не обязательно в DPR. Флаг можно добавлять и удалять. Для обычного запрета выключать экран нужен только лишь флаг FLAG_KEEP_SCREEN_ON, остальные не нужны. Для Tokyo и возможно поздних версий, CallInUIThread не нужен. {$IFDEF ANDROID} procedure TurnOnAndKeepScreenAndroid(aEnable: boolean); var vFlags: integer; begin vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON; if aEnable then begin CallInUIThread ( // uses FMX.Helpers.Android procedure begin TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags); end ); end else CallInUIThread ( procedure begin TAndroidHelper.Activity.getWindow.clearFlags (vFlags); end ); end; {$ENDIF}
    1 балл
  6. При переводе проекта с Berlin на Tokyo при выборе цвета в TComboColorBox, выбранный цвет не отображается. DropDownKind.Custom. В Berlin все работает нормально.
    1 балл
  7. Вы уверены, что это хорошая идея? Когда много уровней вложенности есть хороший шанс вообще не увидеть веток дерева. В какой-то версии TTreeView исправлялся так, чтобы текст не обрезался. А Вы хотите вернуть такое поведение назад? Item1 SubItem1 SubItem2 SubIte SubI Su ...
    1 балл
  8. все что связано с размерами высчитывается вручную в событии OnUpdateObjects две текстовые кнопки
    1 балл
  9. Чтобы просто избавиться от горизонтального скроллбара нужно обработать событие OnCalcContentBounds. Что-то типа этого: procedure TMainForm.TreeView1CalcContentBounds(Sender: TObject; var ContentBounds: TRectF); begin ContentBounds.Width := TreeView1.Content.BoundsRect.Width; // Нужно учесть еще и ширину вертикального скроллбара end;
    1 балл
  10. В Berlin и Tokyo AddFontResource и RemoveFontResource прекрасно отрабатывают, только вызывать их надо до Application.Run. Кстати, лучше использовать AddFontResourceEx и RemoveFontResourceEx с флагом FR_NOT_ENUM - тогда надобность в SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) отпадает.
    1 балл
  11. Дело в том, что TComboBox лишь контейнер, вам нужно обращаться именно к списку элементов в ListBox. Чтобы запретить перевод можно поступить так: var i, count : integer; begin count := cbbFiles.Count - 1; for i := 0 to count do cbbFiles.ListBox.ListItems[i].AutoTranslate := False; end;
    1 балл
  12. Для начала можно посмотреть приложения других партий. Потом можно глянуть сайты партий и особенно сайт вашего заказчика, т.к. часто подобные приложения копируют очень многое с сайта. Т.е. можно будет уже придумать основной функционал, а потом уже добавлять чаты, карты и т.п. А вообще @kami дело сказал:
    1 балл
  13. Нормативная документация (устав, цели, программа) Актуальные вопросы на предстоящую повестку дня на какой-нибудь сессии Обращения от граждан (хотя они гораздо чаще идут на конкретного представителя) "Внутреннее" голосование по какому-нибудь разрабатываемому документу / согласование уполномоченными должностными лицами А вообще - лучше всего уточнить у заказчика. Не "какой функционал должен быть у приложения" , "дайте ТЗ", а "давайте вместе подумаем / пофантазируем - вот у нас есть мобильное приложение. И мы будем его использовать для / чтобы ...". Причем это лучше делать не в письменной форме, а при личной встрече (при наличии такой возможности).
    1 балл
  14. Периодически членам партии в пушах присылать призывы поддержать материально (из своего кармана) какое-нибудь благое начинание типа скинуться на: ремонт дороги, школы, больницы...
    1 балл
  15. В общем можно сделать, конечно, установку шрифта в инсталлере программы. И это будет оптимальным решением. Но можно обойтись и без него. Не буду расписывать детали, просто закину приложение и фрагменты кода. Думаю разберетесь. Естественно изменив на свои шрифты и т.п. Все нижеперечисленное - в файл проекта DPR, перед Application.Initialize; const CKey = '\Software\Microsoft\Windows NT\CurrentVersion\Fonts'; CFontFileName = 'spherelive.ttf'; CFontName = 'spherelive (TrueType)'; procedure ExecuteWait(const sProgramm: string; const sParams: string = ''; fHide: Boolean = false); var ShExecInfo: TShellExecuteInfo; begin FillChar(ShExecInfo, sizeof(ShExecInfo), 0); with ShExecInfo do begin cbSize := sizeof(ShExecInfo); fMask := SEE_MASK_NOCLOSEPROCESS; lpFile := PChar(sProgramm); lpParameters := PChar(sParams); lpVerb := 'open'; if (not fHide) then nShow := SW_SHOW else nShow := SW_HIDE end; try if (ShellExecuteEx(@ShExecInfo) and (ShExecInfo.hProcess <> 0)) then try WaitForSingleObject(ShExecInfo.hProcess, INFINITE) finally CloseHandle(ShExecInfo.hProcess); end; except On E : Exception do ShowMessage('font install Exception: ' + E.Message); end; end; if not IsFontRegistered(TPath.Combine(ExtractFilePath(ParamStr(0)), CFontFileName), CFontName) then if FileExists(TPath.Combine(ExtractFilePath(ParamStr(0)), 'RegFontC.exe')) then ExecuteWait(TPath.Combine(ExtractFilePath(ParamStr(0)), 'RegFontC.exe')); Application.Initialize; Где будет лежать файл со шрифтом - это уже ваше дело. Можно его куда угодно поместить. Хоть в ресурсы, хоть файлом просто, хоть с инета скачать. P.S. Ну и конечно - это все именно под винду... RegFont.zip
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...