-
Постов
842 -
Зарегистрирован
-
Победитель дней
123
Ответы сообщества
-
Пост Andrey Efimov - сообщение в TEdit не понятное удаление последнего символа был отмечен как ответ
Здравствуйте.
Это баг, я сообщил о нём ещё в мае (RSP-14928 и RSP-14929), в тех. поддержке предложили временное решение (ответ ниже). (Тема В TEdit стирается предыдущий текст аналогичная).
find FMX.Platform.Android.pas find procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); change code to: procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); var SelStart, SelEnd: Integer; begin if FCaretPosition <> Value then begin FCaretPosition := Value; CalculateSelectionBounds(SelStart, SelEnd); if (FTextView <> nil) and not FInternalUpdate then PlatformAndroid.SynchronizeOnUIThread( procedure begin //Fix By [龟山]Aone(1467948783) //https://quality.embarcadero.com/browse/RSP-14928 // if (SelEnd - SelStart) > 0 then // FTextView.setSelection(SelStart, SelEnd) // else FTextView.setCursorPosition(CaretPosition.X); end); end; end;
-
Пост Andrey Efimov - сообщение в Гиперссылка на форме был отмечен как ответ
Тема будет перенесена в раздел TLabel
Вы вроде не первый день на форуме...
Давайте помогу:
На форуме есть раздел TLabel, заходим и видим несколько похожих вопросов:
[Android] TLabel и открытие URL Как сделать из Label гиперссылку? [TLabel]OnClick в Android Читаем, думаем. Хочется быстрого результата, но не устанавливая компоненты - заходим во 2 тему, видим ссылку на компоненты от Ярослава [RX] [FGX] Описание версии 0.7.1.74, скачиваем, открываем исходники TfgLinkedLabel и смотрим как всё устроено. Или просто устанавливаем и пользуемся компонентом.
Ап. тема перенесена
-
Пост Andrey Efimov - сообщение в Как указать заголовок Android сервиса (android:label для тега <service>) в AndroidManifest.xml? был отмечен как ответ
Попробуйте прописать сервисы в лоб.
Открываем файл AndroidManifest.template.xml в проекте (не в сервисе)
находим
<%services%> заменяем на
<service android:exported="false" android:name="com.embarcadero.services.MyService" android:label="MyService" /> Полностью пересобираем проект.
p.s. У меня получилось так, лейбел прописался во всех манифестах.
-
Пост Andrey Efimov - сообщение в Проблема с выводом большого количества данных SQLite был отмечен как ответ
В общем, потестил малость, набросал приложение, сканирующее System32.
Дано:
3181 файл (+1 новый для проверки) база с двумя одинаковыми таблицами (по два столбца(id, FileName) в каждой) Результаты:
Проверка в цикле, каждый раз по запросу "SELECT * FROM tblFileName WHERE FileName = Имя файла", очень накладно получается примерно 4.8 сек. (4758мс) Проверка с созданием и заполнением временной таблицы и запросом типа такого "select * from `temp` where FileName not in (select FileName from `tblFileName`)", достаточно быстро - 0.4 сек (437мс) Ваш способ - примерно 2.2 сек. (2168мс) Важно заметить, что во втором случае, время замерялось на две задачи, заполнение временной таблицы и сравнение, посредством одного запроса в бд. В первом же случае, данные сразу сравнивались, т.е. замерялся цикл запросов(3181 шт.) на выборку.
Выбор очевиден Не знаю, что мне взбрело в голову в предыдущем сообщении...)))
По поводу Limit, это ключевое слово позволяет не только ограничивать количество выбираемых данных, но и делать выборку блоками, например по 500 записей за раз (select FileName from `tblFileName` LIMIT 1,500), подошло бы, если бы нужно было извлекать блоками по 500 записей.
вот такой запрос:
FDQuery2.SQL.Clear; FDQuery2.SQL.Add('SELECT * FROM tblFileName'); FDQuery2.Active := True; FDQuery2.Open; if not FDQuery2.IsEmpty then begin FDQuery2.Last; mLogs.Lines.Add('Всего записей: ' + FDQuery2.RecordCount.ToString); mLogs.Lines.Add('ID последней записи: ' + FDQuery2.FieldByName('ID').AsString); end; FDQuery2.Close; Работает без проблем, извлекает сразу все записи.
p.s. Тесты проходили на Windows 7 Pro.
-
Пост Andrey Efimov - сообщение в Мини чат на ListView был отмечен как ответ
У нас, есть такие темы:
Чат - элементы форм
Сообщения чата в виде сообщений в iphone
Чат со смайлами
-
Пост Andrey Efimov - сообщение в Ошибка буилда был отмечен как ответ
Вы проверили папку, в ней точно нет этого файла? И есть ли похожая папка? У вас случайно, установлено не две студии(например Сиэтл и Берлин)?
Далее, если похожих папок нет и файла такого нет, то запускаете СДК Менеджер и выкачиваете все пункты (на версии не обращайте внимания, скрин уже устарел, но пункты не изменились) как на скрине из этой темы: Delphi не видит мой телефон
Далее, в студии проверяете путь, если необходимо, исправляете на нужный.
p.s. А вообще, об этом всём, написано в теме по ссылке, которую дал первый раз....
-
Пост Andrey Efimov - сообщение в Название приложения в Андроиде был отмечен как ответ
Полное решение вопроса: Автоматическая смена названия приложения в зависимости от языка системы
-
Пост Andrey Efimov - сообщение в Как показать форму в Android при заблокированном устройстве был отмечен как ответ
Ну, фейсбуком, я не пользуюсь. В любом случае, я не встречал ни одной программы, которая могла бы разблокировать экран. Фейсбук снимает блокировку устройства? Более того, считаю, что такое можно реализовать только с рут-правами, да и то... есть сомнения. Надо читать Андроид АПИ и стековерфлоу
Ап. Покопался малость в апи, для отвода блокировки на задний план, можно попробовать использовать флаг "FLAG_SHOW_WHEN_LOCKED", как только форму закроют, экран блокировки вернётся на своё место. Но разблокировать залоченное устройство не получится.
Ап.2. Для блокировки "провести пальцем" можно использовать флаг "FLAG_DISMISS_KEYGUARD"
-
Пост Andrey Efimov - сообщение в Приложение закрывается после автозапуска был отмечен как ответ
Java класс:
Вы же хотите запустить сервис, а запускаете Активити приложения...
Правильная строка:
launchintent.setClassName(context, "com.embarcadero.services.MyService"); Также некоторые модули совсем необязательны там.
И вообще, вы хотите запустить службу, но весь код, запускает у вас активити...
т.е. для службы надо так:
public class BootCompletedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent TestLauncher = new Intent(); TestLauncher.setClassName(context, "com.embarcadero.services.TestService"); context.startService(TestLauncher); } } } Манифест:
Строка:
<receiver android:name="com.mycompany.myproject" имя указано неверно, у вас же Ресейвер имеет имя "com.mycompany.BootReceiver", откуда взялось "com.mycompany.myproject"?!
Правильно писать:
<receiver android:name="com.mycompany.BootReceiver" и т.д.
Это батник из статьи? у меня другой , в своей статье выложу
Ну вот, всё работает как часы
Держите исправленный проект:
ASARservRepair.zip
p.s. Забыл вычистить проект от classes.dex, поэтому весит 900 кб.
p.s.2 Постараюсь, поскорее написать статью, чтобы все подобные ошибки не возникали у людей
-
Пост Andrey Efimov - сообщение в Перевод строки в нижний регистр был отмечен как ответ
AnsiLowerCase(Question);
-
Пост Andrey Efimov - сообщение в Определение положение ползунка громкости был отмечен как ответ
Где-то был материал...
У меня в блоге есть вот такие статьи:
Как создавать обёртки для JAVA-кода Как подключить и использовать свой JAVA-класс Страничка с готовым кодом: JNI Code Snippet и ещё куча примеров использования Android API в самих статьях
Кстати, это не вы случаем задали вопрос "Здравствуйте. А есть ли возможность определить текущее положение ползунка громкости?" в блоге?
Примерный код:
uses Androidapi.JNI.JavaTypes, Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNIBridge; procedure TForm1.Button1Click(Sender: TObject); var AudioObj: JObject; Audio: JAudioManager; CurrentVolume: Integer; begin AudioObj = SharedActivity.getSystemService(TJActivity.JavaClass.AUDIO_SERVICE); Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); CurrentVolume = Audio.getStreamVolume(TJAudioManager.JavaClass.STREAM_MUSIC); end; -
Пост Andrey Efimov - сообщение в Как задать название приложения на любом языке? был отмечен как ответ
http://delphifmandroid.blogspot.ru/2014/02/delphi-xe5-project-options-version.html, параметр "label"
-
Пост Andrey Efimov - сообщение в [Android] Возможно ли воспроизводить MIDI файлы средствами FireMonkey без установки дополнительных кодеков? был отмечен как ответ
Пользуйтесь поиском перед тем как задать вопрос. Тема: MIDI и FireMonkey
-
Пост Andrey Efimov - сообщение в хранение картинок загруженых с сервера в кеше андроид устройства был отмечен как ответ
В чём проблема? Напишите функцию, которая будет сохранять загруженные картинки в память устройства, а также следить за актуальностью и необходимостью хранения той или иной картинки в памяти устройства.
-
Пост Andrey Efimov - сообщение в Как узнать версию приложения под Android? был отмечен как ответ
Например, вот так:
{for Delphi XE6/XE7: Add to "uses" module "Androidapi.Helpers"} uses Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText; var PackageManager: JPackageManager; VersionPackage,PackageName: JString; begin PackageManager := SharedActivity.getPackageManager; PackageName := SharedActivityContext.getPackageName; VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName; Label1.Text := JStringToString(VersionPackage); p.s. Для подобных вопросов, у меня в блоге есть страничка "JNI Code Snippet"
-
Пост Andrey Efimov - сообщение в Delphi XE7: Программно проверить root права. [Android] был отмечен как ответ
Где-то, я уже отвечал на подобный вопрос, но найти что-то не могу...
Варианты, которые известны мне:
В лоб: Попробовать создать или изменить файл в защищённой директории (уже предложил Alexey Lovchikov) Тут тоже есть свои "камни", я лично не проверял, что будет если права есть, насколько я понимаю, приложение ещё должно запросить эти права Работает на большинстве устройств с рут-правами: Проверить установлено ли приложение SuperSU, если да, то права есть Не точная информация: Была вроде как команда (лучше в гугле посмотреть) для работы с рут-правами, что-то типо этого Runtime.getRuntime().exec("su"); -
Пост Andrey Efimov - сообщение в Компилятор игнорирует программное изменение свойств компонентов был отмечен как ответ
Слипом вы подвешиваете главный поток, поэтому кнопка остаётся нажатой. Почему не происходит прорисовка, я точно сказать не могу, но скорее всего связано с подвешенным главным потоком.
Чтобы ваш код заработал, можно, например, использовать "Application.ProcessMessages" (кнопка будет нажата):
procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Visible := True; Application.ProcessMessages; Sleep(3000); Panel1.Visible := False; Application.ProcessMessages; end; Или воспользоваться потоками (кнопка будет в обычном состоянии):
procedure TForm1.Button1Click(Sender: TObject); begin TThread.CreateAnonymousThread( procedure begin TThread.Synchronize(nil, procedure begin Panel1.Visible := True; end); TThread.Sleep(3000); TThread.Synchronize(nil, procedure begin Panel1.Visible := False; end); end ).Start; end; Можно написать вот так (без синхронизации тоже работает, это у меня уже в привычку вошло, работу с визуальными компонентами в синхронизацию запихивать): Используйте вариант описанный выше.
Возможно, есть более лучшее решение...
-
Пост Andrey Efimov - сообщение в [Android] Преобразование HEX строки в String был отмечен как ответ
Как я и сказал: под Андроидом - string[0], в цикле - "-1"
Вот так:
function TForm1.HexToStr2(const source: string): string; var i, idx: Cardinal; StrAsBytes: TBytes; begin SetLength(StrAsBytes, length(source) div 2); i := 0; idx := 0; while i <= length(source) - 1 do begin StrAsBytes[idx] := StrToInt('$' + source[i] + source[i + 1]); i := i + 2; idx := idx + 1; end; result := tencoding.ansi.GetString(StrAsBytes); end; Если нужен один код на две ОС, то используйте директиву {$IFDEF}
-
Пост Andrey Efimov - сообщение в zip архив у которого Compressed size и Uncompressed size 0xFFFF был отмечен как ответ
Rad Studio из коробки умеет работать с zip архивами, единственный (вроде) минус – не работает с запароленными архивами. Модуль System.Zip(Справка), попробуйте воспользоваться им.
-
Пост Andrey Efimov - сообщение в Как узнать, что в TTimeEdit поменялось время? был отмечен как ответ
Не знаю, что вам необходимо, но схема "Нажал на кнопку, открылся выбор даты и времени, выбрал. После этого выбранная дата и время отобразились на кнопке" работает отлично.
Вот простой пример:
procedure TForm1.Button1Click(Sender: TObject); begin TimeEdit1.OpenPicker; end; procedure TForm1.TimeEdit1Change(Sender: TObject); begin Button1.Text := DateToStr(TimeEdit1.Date); end; Есть ещё события: OnOpenPicker, OnClosePicker ...
-
Пост Andrey Efimov - сообщение в [Android] Возможно ли наложить маску на видео? был отмечен как ответ
Что мне известно из моих экспериментов под Андроид.
Стандартный плеер, при открытии/запуске видео, создаёт новый "слой", разместить что-то над этим слоем не получится, сдвинуть его на задний план тоже не получится.
Запустить что-то над MX плеером тоже не получится, т.к. Андроид может выгрузить мх плеер, т.к. наше приложение не прозрачное.
-
Пост Andrey Efimov - сообщение в Есть ли аналог TImageList? был отмечен как ответ
Пожалуйста, перед тем как создать тему, воспользуйтесь поиском по форуму или просто перейдите в нужный раздел.
Есть целый раздел: TImageList, а в нём тема: Есть ли в fmx класс TImageList?
-
Пост Andrey Efimov - сообщение в Как узнать, что экран устройства повернулся? был отмечен как ответ
Первое, что пришло в голову:
Когда происходит смена ориентации, срабатывает событие OnResize, вот в нём и сравнивать ширину и высоту формы.
Upd.
Глянул пример, вот этот "C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Samples\User Interface\Forms". Там сделано так же.
-
Пост Andrey Efimov - сообщение в [Android] [XE7] Как задать цвет фона для заставки SplashScreen? был отмечен как ответ
Вот "Как добавить "резиновый" SplashScreen в XE7", написал заметку по добавлению сплешскрина, вдруг кому-то пригодится. Хотя по сути перевод справки и некоторые замечания от меня.
Да простит меня админ за кросспостинг