Доска почета


Popular Content

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

  1. 11 likes
    Ссылка: http://blog.rzaripov.kz/2016/12/3-modernlistview.html Автор: Зарипов Равиль @ZuBy Описание: Реализация динамической подгрузки контента: Бесконечный скроллинг (например как лента в ВК) Паджинация/Пагинация (постраничная загрузка)
  2. 11 likes
    Описание: Назначение: Быстрые уведомления, появляющиеся в нижней части экрана, предназначенные для отображения короткой текстовой информации и опционно изображения Поддерживаемые платформы: Android, iOS Демо проект: Samples\ToastsDemo\ToastsDemo.dproj Доступен с версии: RX (R100) Возможности: Несколько быстрых способов отображения уведомления: TfgToast.Show(Message) - только текст TfgToast.Show(Message, Icon) - текст и картинка TfgToast.Show(Message, Duration) текст + настройка длительности отображения TfgToast.Show(Message, Duration, Icon) - текст + картинка + длительность отображения Доступно редактирование цвета заднего фона (TfgToast.BackgroundColor) Доступно редактирование цвета сообщения (TfgToast.MessageColor). Возможность добавить к сообщению иконку (TfgToast.Icon) Доступно редактирование длительности отображения уведомления (TfgToast.Duration) Возможность менять глобальные параметры отображения всех тостов в рамках приложения (TfgToast.DefaultBackgroundColor, TfgToast.DefaultMessageColor и TfgToast.DefaultPadding) Примеры вызова: // Быстрое отображение, только текст TfgToast.Show('Message'); // Быстрое отображение, текст + картинка TfgToast.Show('Message', Bitmap); // Настраиваемое отображение var Toast: TfgToast; begin Toast := TfgToast.Create(EditToastMessage.Text, TfgToastDuration(ComboBoxDurationType.ItemIndex)); try if SwitchShowIcon.IsChecked then Toast.Icon.Assign(Image1.Bitmap); Toast.MessageColor := ColorComboBoxMessage.Color; Toast.BackgroundColor := ColorComboBoxBackground.Color; Toast.Show; finally Toast.Free; end; end; Скриншоты:
  3. 9 likes
    Ссылка на статью. Автор: Александр Бирюков В статья я максимально подробно попытался описать работу с PHP скриптом для рассылки Push сообщений из любой программы вне зависимости от платформы. Затрагивается вопроса от экспорта скриптов до кода программы: отправка и получение Push, регистрация устройств. Надеюсь кому-нибудь пригодится. Буду рад комментариям, обоснованной критике и доработкам.
  4. 9 likes
    Ориентировочная дата выпуска Ориентировочная дата выпуска курса - 31 июня 2016 года. Краткое описание Этот курс посвящен использованию стилей в FireMonkey. Стили являются одной из самых главных особенностей FireMonkey, отличающих FMX фреймворк от других. С одной стороны с их помощью вы можете придать своему приложению индивидуальность и добавить визуальную неповторимость. Однако, с другой стороны использование стилей является очень сложной темой и содержит много нюансов, не зная которые, можно потратить много времени на попытку понять причину неудач использования. Тема является одной из самых популярных, поэтому она будет рассмотрена в первую очередь. Что вы будете уметь после прохождения курса? В результате прохождения курса, вы сможете: Создать свой стиль на основе вашего UI дизайна приложения простейшим путем из возможных Редактировать и дополнять уже существующие стили, идущие в поставке с FireMonkey Создавать и использовать уже существующие стили для использования их в своих компонентах Детально понимать, как работает механизм стилей, Понимать, как создать "эффективный" стиль. Стиль, который не будет сказываться на производительности вашего приложения. Сделать действительно кроссплатформенное приложение с точки зрения стилей. Использование разных стилей для разных платформ (Android, iOS, Windows, OSX) Научитесь анализировать типовые ошибки создания стилей и исправлять их в кратчайшие строки. Будете знать технику создания своего стиля для любого стилевого компонента с нуля. На кого рассчитан курс? Курс рассчитан на: Разработчиков, которые начинают использовать FireMonkey. Разработчиков, планирующие использовать стили в своих приложениях. Разработчиков, которые уже использовали стили, но поняли, что это не так просто, как кажется. Состав курса Пока курс находится в процессе разработке, здесь будут представлены только основные темы и вопросы. По мере готовности курса, будет дано детальное описание всех уроков. Что такое стиль, что он из себя представляет? Архитектура стилей: Основные части стилевого механизма, назначения и их взаимодействия (TStyleBook, TStyledControl, TStyleManager). Как происходит процедура загрузки/выгрузки/смены стиля? Изменение стилей на лету. Замена платформенных стилей. Кеш стилей. Достоинства и потенциальные опасные места при проектировании компонента со стилями. Динамическая подгрузка стиля на мобильных платформах. Уведомления. Способы узнать, когда стиль меняется для компонента или формы. Растровые и векторные стили: Назначения Отличия Достоинства и недостатки? Что выбрать? Манипулирование стилем: Доступ к элементам стиля: StylesData, FindStyleResource. Достоинства и недостатки. Какой способ выбрать? Форсирование загрузки и выгрузки стиля Стилизация рамки окна: Структура стиля рамки окна (Windows only) Какие элементы стиля за что отвечают Платформенные стили: Откуда FireMonkey берёт стиль по умолчанию? Как изменить стиль по умолчанию? Где взять исходники дефолтных стилей. Tint эффект Что такое, зачем нужен и в чем его преимущества? Когда стоит использовать Tint, а когда нет? Принципы работы. Настройки, как использовать? Контролы поддерживающие Tint эффект Дизайнер стилей FMX. Принципы работы Знакомство с интерфейсом, Создание нового стиля, Удаление существующего, Смена порядка стилевых объектов (Z-order), Создание нового стиля Редактирование существующего Дизайнер стилей VCL - как один из способов создания FMX стилей. Описание Основные принципы работы Автоматическое создание FMX стиля без необходимости знания структуры стиля с точки зрения FMX компонентов. Получение стилей по умолчанию. Создание стилей для базовых компонентов (TListBox, TEdit, TMemo, TButton, TTabControl) Как узнать структуру стиля для компонента? Фиксация размера (Фиксация высоты, ширины или ширины и высоты) TListBox: Способы создания своих итемов с любыми элементами TEdit, TMemo: TButton TTabControl Анализ типичных ошибок при создании и редактировании стилей
  5. 7 likes
    Проблема решалась очень просто. Оказывается нужно при вызове startActivityForResult использовать requestCode отличный от занятых в FMX, я использую REQUEST_IMAGE_CAPTURE = 1001 тогда обработчик сообщений FMX поймет, что сообщение не для него и передаст его в систему.
  6. 7 likes
    вопрос закрыт. все получилось. с ардуино получаю и отправляю данные ничего такого особо интересного - я делаю экструдер
  7. 7 likes
    В общем можно сделать, конечно, установку шрифта в инсталлере программы. И это будет оптимальным решением. Но можно обойтись и без него. Не буду расписывать детали, просто закину приложение и фрагменты кода. Думаю разберетесь. Естественно изменив на свои шрифты и т.п. Все нижеперечисленное - в файл проекта 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
  8. 6 likes
    Нормативная документация (устав, цели, программа) Актуальные вопросы на предстоящую повестку дня на какой-нибудь сессии Обращения от граждан (хотя они гораздо чаще идут на конкретного представителя) "Внутреннее" голосование по какому-нибудь разрабатываемому документу / согласование уполномоченными должностными лицами А вообще - лучше всего уточнить у заказчика. Не "какой функционал должен быть у приложения" , "дайте ТЗ", а "давайте вместе подумаем / пофантазируем - вот у нас есть мобильное приложение. И мы будем его использовать для / чтобы ...". Причем это лучше делать не в письменной форме, а при личной встрече (при наличии такой возможности).
  9. 5 likes
    Описание того что нужно как то расплывчато, но вот примерно так можно сделать. Всего один TImage который используется для отрисовки битмапов. Видео и проект Tire.rar
  10. 5 likes
    Добрый вечер. Скоро будет полностью подготовлен.
  11. 5 likes
    Вместо утреннего кофе, уперся рогом и сделал получение информации через CUDA, тесовый проект прилагаю. В режиме отладки работает отлично, вижу размер видеопамяти, но потом вылетает с access violation (при обращении к визуальным компонентам или просто при продолжении работы). В чем дело понять не могу, сначала грешил на FMX, но проект на VCL выдает те же симптомы. Очень, очень странные дела... Код простой, используется cudaRT.pas из CUDA wraper Паскуда https://code.google.com/archive/p/pascuda/source/default/source и cudart32_65.dll идущая вместе с драйверами NVIDIA Var CudaDeviceProp : TCudaDeviceProp; hDevice: Integer; GPUMemorySize : Cardinal; LMessage : String; begin hDevice:=0; if CudaGetDeviceProperties(CudaDeviceProp, hDevice)=ceSuccess then begin GPUMemorySize:=CudaDeviceProp.TotalGlobalMem div 1024 div 1024; LMessage:=Format('GPU Memory size = %d Mb', [GPUMemorySize]); Memo.Lines.Add(LMessage); end; test099 Cuda Info VCL.7z
  12. 5 likes
  13. 5 likes
    Добрый день, Определить, что TListBox (TScrollBox) прокручен до конца можно используя событие OnViewPortPositionChange. Это событие вызывается каждый раз при прокручивании контента. Этот метод возвращает текущее положение ViewPort - позиция окна, в котором отображаются текущие элементы TListBox. Об этом подробно описано в этой статье: "Платформонезависимый скроллинг в Fire Monkey" Ниже приведен код, который проверяет, что TListBox прокручен до конца. procedure TForm1.ListBox1ViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin if NewViewportPosition.Y > ListBox1.ContentBounds.Height - ListBox1.Height then ShowMessage('End!'); end;
  14. 4 likes
  15. 4 likes
  16. 4 likes
    Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
  17. 4 likes
  18. 4 likes
    Равиль, сразу извиняюсь, готов понести наказание, но запощу решение. Как уже говорил все просто, если у вас 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
  19. 4 likes
    Периодически членам партии в пушах присылать призывы поддержать материально (из своего кармана) какое-нибудь благое начинание типа скинуться на: ремонт дороги, школы, больницы...
  20. 4 likes
    это не случайные символы. и создаете вы его сами, когда НАСЛЕДУЕТЕ master-форму для конкретных платформ и разрешений http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_FireMonkey_Views
  21. 4 likes
    Первое что пришло в голову в виде "бреда", точнее так уже сделали)) Но не знаю насколько вам подойдет такое решение. У нас есть сервер базы данных, на сервере понятно есть все данные необходимые для печати, принтер настроен на сервере, на сервере есть служба которая мониторит базу (таблицу) в которой если появилась новая команда для печати тогда служба формирует документ из данных базы с использованием FastReport, и кидает на принтер по умолчанию для печати. Сервер (а точнее комп Pentium DualCore, 2 gb RAM) на котором MySQL, Windows (хотя FastReport есть и для Linux (beta)) работает автономно уже 8-й месяц, и за это время не прикоснулись к нему ни разу (даже если честно очень странно)
  22. 4 likes
    Типы координат В FIreMonkey различают три вида координат: Локальные - это координаты в системе координат контрола. Абсолютные - это координаты в системе координат клиентской части формы. Экранные - это координаты в системе координат экрана. Соответственно, если речь идет о форме, то позиция формы задается в экранных координатах. Если речь идет о контролах, то в локальных координатах своего родительского контрола. Конвертация Локальные -> Абсолютные TControl.LocalToAbsolute(TPointF): TPointF Абсолютные -> Локальные TControl.AbsoluteToLocal(TPointF): TPointF Абсолютные -> Экранные TControl.Scene.LocalToScreen(TPointF): TPointF; Экранные -> Локальные TControl.Scene.ScreenToLocal(TPointF): TPointF;
  23. 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. Буду ОЧЕНЬ БЛАГОДАРЕН за помощь!
  24. 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;
  25. 3 likes
    @RoschinSpb Ну нет же. В не ARC (Auto reference counter), классическом компиляторе (Windows и Mac) Free всегда вызывает деструктор и освобождает память выделенную под класс и его поля. Т.е. если обратиться потом к такому классу произойдет исключение AV. А вот в ARC компиляторах, DisposeOf вызовет деструктор, но память выделенная под класс и его поля, останется занятой, и не освободиться. Т,е. если после DisposeOf обратится к полям класса, не будет исключения AV, но поля уже будут очищены. При этом в деструкторе можно освободить свои данные и уничтожить инкапсулированные классы. Такие объекты называют зомби-объекты - т.к. они остаются висеть в памяти до конца работы программы, и даже если ссылка позже на него уменьшиться до 0, память не освободиться и деструктор не будет вызван повторно. Чтобы узнать находится ли объект в зомби состоянии, есть метод Disposed - это аналог Assign. Повторюсь всем рекомендую статью GunSmoker, там эта тема хорошо освещена.
  26. 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). И попробуйте перефразировать свой вопрос, уточните конкретную задачу, так будет проще понять что вам нужно.
  27. 3 likes
  28. 3 likes
    interface function IsConnected: Boolean; function IsWiFiConnected: Boolean; function IsMobileConnected: Boolean; implementation uses System.SysUtils, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, FMX.Helpers.Android, Androidapi.Helpers; function GetConnectivityManager: JConnectivityManager; var ConnectivityServiceNative: JObject; begin ConnectivityServiceNative := TAndroidHelper.Context.getSystemService (TJContext.JavaClass.CONNECTIVITY_SERVICE); if not Assigned(ConnectivityServiceNative) then raise Exception.Create('Could not locate Connectivity Service'); Result := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID); if not Assigned(Result) then raise Exception.Create('Could not access Connectivity Manager'); end; function IsConnected: Boolean; var ConnectivityManager: JConnectivityManager; ActiveNetwork: JNetworkInfo; begin ConnectivityManager := GetConnectivityManager; ActiveNetwork := ConnectivityManager.getActiveNetworkInfo; Result := Assigned(ActiveNetwork) and ActiveNetwork.IsConnected; end; function IsWiFiConnected: Boolean; var ConnectivityManager: JConnectivityManager; WiFiNetwork: JNetworkInfo; begin ConnectivityManager := GetConnectivityManager; WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI); Result := WiFiNetwork.IsConnected; end; function IsMobileConnected: Boolean; var ConnectivityManager: JConnectivityManager; MobileNetwork: JNetworkInfo; begin ConnectivityManager := GetConnectivityManager; MobileNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE); Result := MobileNetwork.IsConnected; end; @Rusland
  29. 3 likes
    там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания" но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))
  30. 3 likes
    Да, интриган я тот еще. )) Ошибка оказалась банальной - разные форматы и разделители даты и времени. Из-за этого приложение сразу рушилось, ошибка не отображалась почему-то в отличие от других исключений. В англоязычных странах используют формат типа "07/02/2017" и тд. Подлечил приведением формата даты к нужному.
  31. 3 likes
    Ага, разобрался - все дело в объявлении TagObject как "слабой" ссылки: [Weak] FTagObject: TObject, т.е. присвоение этому полю не увеличивает счетчик ссылок и объект будет жив только в пределах вашей процедуры. Грубо говоря в "слабой" мы храним объект до тех пор, пока он хранится где то еще. Вам НЕОБХОДИМО создавать ГЛОБАЛЬНУЮ структуру для хранения этих объектов. К примеру сохранит картинки в TObjectList (модуль System.Generics.Collections), и после этого уже присваивать их в Image2.TagObject Вот работающий вариант вашего кода: unit copystream; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, System.Generics.Collections; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; SaveBut: TButton; LoadBut: TButton; procedure SaveButClick(Sender: TObject); procedure LoadButClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FImageStore : TObjectList<TMemoryStream>; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FImageStore:=TObjectList<TMemoryStream>.Create; end; procedure TForm1.LoadButClick(Sender: TObject); begin if Assigned(Image2.TagObject) then Image2.Bitmap.LoadFromStream(Image2.TagObject as TMemoryStream); end; procedure TForm1.SaveButClick(Sender: TObject); Var LStream : TMemoryStream; begin LStream:=TMemoryStream.Create; FImageStore.Add(LStream); try Image1.Bitmap.SaveToStream(LStream); finally Image2.TagObject:=LStream; end; end; end.
  32. 3 likes
    Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав картинку с кнопкой . Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки. Чтобы определить по какому элементу Item'a кликнул юзер: procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); begin if ItemObject = nil then exit; ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text); end;
  33. 3 likes
    это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
  34. 3 likes
    Вот так вот вроде работает: Только нужно будет закомментировать строчку assert(sizeof(TCudaDeviceProp) = 540, 'sizeof(TCudaDeviceProp) <> 540');
  35. 3 likes
    Вот вариант, его можно применять в любом месте (обычно в 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}
  36. 3 likes
    Дело в том, что TComboBox лишь контейнер, вам нужно обращаться именно к списку элементов в ListBox. Чтобы запретить перевод можно поступить так: var i, count : integer; begin count := cbbFiles.Count - 1; for i := 0 to count do cbbFiles.ListBox.ListItems[i].AutoTranslate := False; end;
  37. 3 likes
    Добавьте скопление членов партии на карте, т.е. все зарегистрированные члены партии видят близ себя других членов партии. Удобно, например, когда ты на митинге, собрании видишь количество единомышленников, их движение, скопление. Добавьте общий репозиторий добрых дел, с фотографиями, видео, описанием, чтобы другие члены партии могли проголосовать за значимость совершенных действий членов партии.
  38. 3 likes
    Подумайте о будущем, если проект будет развиваться и одной цифры ошибки станет не достаточно. Подумайте о наследниках-программистах (или о себе через пять лет) которые будут чесать репу и угадывать (вспоминать) что же означает каждая цифра ответа. Времена экономии каждого байта трафика прошли. Вспомните истории предшественников - 640 килобайт более чем достаточно для любого компьютера, 4294967296 ip адресов достаточно для всего человечества, размера MTU 1500 байт достаточно для TCP пакета в обозримом будущем, максимального размера файла в 4 гигабайта достаточно для любых нужд и вряд ли в будущем появятся накопители объемом более 9 терабайт (FAT32). Отдавая данные/результат в теле ответа в формате JSON вы развязываете себе руки и делаете задел на будущее. Вначале вам достаточно будет вот такого { "status" : true, "error" : 0 } потом возможно такое { "status" : false, "error" : 123, "errormessage" : "mysql deadlock in tables employments", } а потом еще что нибудь { "status" : true, "error" : 0, "errormessage" : "", "executiontime" : 304, "clastersource" : "bagama_server" } все эти добавления займут у вас одну-две строчки на php и одну-две строчки в приложении. При этом, вы сможете диагностировать ответ сервера, сидя на берегу моря, с помощью браузера вашего телефона.
  39. 3 likes
    function FileSize(const aFilePath: string): Int64; var vSR : TSearchRec; begin if FindFirst(aFilePath, faAnyFile, vSR ) = 0 then begin Result := vSR.Size; FindClose(vSR); end else Result := -1; end; Мультиплатформенный вариант без открытия файла (размер берется из файловой системы).
  40. 3 likes
    Во время добавления так же можно отключить обработчики ListView1.OnUpdatingObjects и(или) ListView1.OnUpdateObject (если у вас в них есть какой либо код). ListView1.BeginUpdate; ListView1.OnUpdatingObjects:=Nil; ListView1.OnUpdateObjects:=Nil; for i := 0 to List.Count - 1 do begin LVItems := ListView1.Items.Add; LVItems.Data['MyData']:=... ... end; ListView1.OnUpdatingObjects:=ListView1UpdateObjects; ListView1.OnUpdateObjects:=ListView1UpdatingObjects; ListView1.EndUpdate;
  41. 3 likes
    Например так: var path: TPathData; .......... Path:=TPathData.Create; Path.Clear; Path.MoveTo(PointF(x[0],y[0])); for i:=1 to N do Path.LineTo(PointF(x[i],y[i])); Path.ClosePath;
  42. 3 likes
  43. 3 likes
    проверка интернета function CheckInet: boolean; var aResp: IHTTPResponse; aHTTP: THTTPClient; begin Result := false; aHTTP := THTTPClient.Create; try try aResp := aHTTP.Head('http://google.com'); Result := aResp.StatusCode < 400; except Result := false; end; finally FreeAndNil(aHTTP); end; end; get запрос function HTTPGet(const aURL: string): string; var aHTTP: THTTPClient; aResp: TStringStream; begin Result := 'Error'; aResp := TStringStream.Create('', TEncoding.UTF8); aHTTP := THTTPClient.Create; try try aHTTP.Get(aURL, aResp); Result := aResp.DataString; except Result := 'Error'; end; finally FreeAndNil(aHTTP); FreeAndNil(aResp); end; end;
  44. 3 likes
    Вот так подготовили Как добавить "резиновый" SplashScreen в XE7 ? p.s. Старайтесь прикладывать проекты к темам, так будет проще вам помочь.
  45. 3 likes
    У меня на гите есть пример TRestLight и здесь на форуме тоже, через TRestClient, воспользуйтесь поиском
  46. 3 likes
    я использовал вот такой вариант в одной программе function GetScreenOffTimeout: integer; // Androidapi.JNI.Provider, FMX.Helpers.Android begin Result := 0; {$IFDEF ANDROID} Result := TJSettings_System.JavaClass.getInt(SharedActivityContext.getContentResolver, TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT, 15000); // 15 seconds is default is not found {$ENDIF} end; function SetScreenOffTimeout(ATimeOut: integer): Boolean; // Androidapi.JNI.Provider, FMX.Helpers.Android begin Result := false; {$IFDEF ANDROID} Result := TJSettings_System.JavaClass.putInt(SharedActivityContext.getContentResolver, TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT, ATimeOut); {$ENDIF} end;
  47. 3 likes
    У нас тоже печать через базу данных. Отличие от описанного варианта только в том что база удаленная, а служба печати может быть установлена на любом клиентском компе с Windows, с которого и идет печать на любой принтер доступный с этого клиентского компа. При этом на клиенте служба может быть настроена для выбора только определенных заданий печати (например задания только определенного отдела или задания отправленные только с определенных терминалов).
  48. 3 likes
    Ура! Я победил проблему. Причем с помощью почти забытой мной процедуры FindFirst ;-) Код работает корректно под Windows и Android. Файл не передергивается, антивирус спокоен. function TFileManager.GetFileSize(APath : String) : String; Var AFileSizeByte : Int64; AFileSizeFloat : Double; SearchRec : TSearchRec; FileAttrs: Integer; begin FileAttrs :=faArchive; FileAttrs := FileAttrs + faAnyFile; Result:='unknow'; AFileSizeByte:=0; try FindFirst(APath,FileAttrs,SearchRec); AFileSizeByte:=SearchRec.Size; FindClose(SearchRec); except Exit; end; if AFileSizeByte<1024 then begin Result:=Format('%d',[AFileSizeByte])+' Byte'; Exit; end; if AFileSizeByte<1048576 then begin AFileSizeFloat:=AFileSizeByte/1024; Result:=Format('%6.3f',[AFileSizeFloat])+' KByte'; Exit; end; if AFileSizeByte<1073741824 then begin AFileSizeFloat:=AFileSizeByte/1048576; Result:=Format('%6.3f',[AFileSizeFloat])+' MByte'; Exit; end; AFileSizeFloat:=AFileSizeByte/1073741824; Result:=Format('%6.3f',[AFileSizeFloat])+' GByte'; end;
  49. 3 likes
    procedure TMainForm.SearchChanelEditChangeTracking(Sender: TObject); var Lower: string; begin Lower := SearchChanelEdit.Text.Trim.ToLower; if Lower = '' then begin if Assigned(listView.Items.Filter) then begin // Clear filter listView.Items.Filter := nil; end; end else begin // Start or update filter listView.ItemIndex := -1; listView.Items.Filter := function(X: string): Boolean begin Result := Lower.IsEmpty or X.ToLower.Contains(Lower); end; end; end; Передача фильтра в ListView
  50. 3 likes
    Пока могу только посоветовать статью "Получаем список доступных устройств хранения информации". Важно: Третий метод будет работать на всех версиях Android до 4.3. С версии 4.3 произошли значительные изменения в организации файлов. К сожалению, у меня нет устройства с Android 4.3 чтобы провести анализ и написать код для версий выше 4.3. И второе, приложения, написанные в Делфи, по какой-то причине, не могут прочитать файл mounts. Я предполагаю, что если бы файл можно было прочитать, то код для версий выше 4.3 основывался на чтении этого файла. UPD (25.11.14). Для Android 4.4.* описано тут: Android 4.4 и запись на внешнюю карту памяти...
This leaderboard is set to Москва/GMT+03:00