Вы путаете две разные ситуации: неправильную работу программы и неправильную работу отладчика (он же дебаггер).
Думаю, у вас второй вариант, ибо SetLength настолько много где используется, что сбой в её работе давно бы заметили. У меня в проектах для Андроида в XE6 она отрабатывает без проблем.
Некорректная работа отладчика более вероятна, но это, строго говоря, не влияет на поведение готовой программы.
Может кто-нибудь подсказать как использовать OnCompletionListener в работе с нативными объектами Android?
Мне надо произвести простейшие действия по окончании проигрывания видеофайла. Для этого предназначена коллбек процедура OnCompletionListener. Но ни одного примера на Дельфи я в Гугле и Яндексе не нашел. А те примеры что нашел затрудняюсь перевести на Дельфи.
Наиболее часто встречается что-то типа такого:
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
Toast.makeText(MainActivity.this, "I'm Finished", Toast.LENGTH_SHORT);
}
или такое:
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
finish(); // finish current activity
}
});
Возможно ли подобную конструкцию реализовать на дельфийском паскале?
Пока сделал на базе TJVideoView и TJDialog примерно как описано в http://fire-monkey.ru/topic/2154-native-android-videoview/
В этом случае смог воспользоваться методом FDialog.hide. Так что срочный костыль нашелся, теперь буду спокойно искать более изящное решение.
Попробовал. Не помогло.
Более того, вообще удалил MediaPlayerControl с формы, а поведение не изменилось. Похоже, для Андроида он не нужен, достаточно только MediaPlayer-а.
Уточню вопрос. Задача не в том чтоб узнать об окончании воспроизведения (это я могу сделать по таймеру проверяя состояние плеера).
Проблема в том что он остаётся поверх моей формы, и вот как мне заставить его убраться я не знаю.
В DelphiXE6, проект под Андроид, на свою форму кладу Mediaplayer, по кнопке задаю ему файл и вызываю метод Play. По окончании проигрывания файла на экране висит либо последний кадр, либо черный экран (на двух устройствах по-разному). Для того чтоб снова увидеть свою форму приходится нажимать вручную системную кнопку "Назад". Как можно сделать чтоб окно проигрывателя скрывалось само и показывалась моя форма без участия пользователя сразу по окончании файла видео?
Маленькое замечание: варианты Вячеслава от 01:45 и Alex7wrt от 23:42 дают неравномерное распределение.случайных точек. Вариант Brovin Yaroslav от 15:33 даёт равномерное распределение.
Просил проверить мой тестовый APK на форуме 4pda.ru других владельцев данного девайса, результаты оказались разные.
Производитель выпускал девайс с двумя вариантами прошивки. В одной дельфийские APK нормально работают, в другой, более поздней, уже нет. Перепрошил планшет на первичную прошивку, все мои проекты заработали. Придётся жить с этой прошивкой, хотя она и глючная.
Настройки Android Tools оказались совсем не причём.
Пытаюсь запускать явные активности используя startActivityForResult(intent: JIntent; requestCode: Integer);
Пока requestCode не использовал и оставлял нулевым, проблем не было.
Но вот решил его использовать, и начались проблемы. При requestCode=1 вызывающее приложение падает в момент возврата с невнятным сообщением: "В приложении ProjectAAA произошла ошибка". При requestCode=2 вызывающее приложение не падает, но и в обработчик коллбека не попадает. При requestCode >= 3 вроде всё работает.
Почему такое поведение? В документации я таких ограничений на значение requestCode не увидел.
Для проверки сделал ProjectGroup из двух приложений, вызывающего ProjectAAA и вызываемого ProjectBBB, залил сюда: https://yadi.sk/d/KawBTcv3eh3SF
Проверял на Delphi XE6.
Вопросы:
1. Почему такое поведение?
2. Какой диапазон значений можно спокойно использовать на наступая на эти грабли?
Нет никакого java-кода в генерируемом APK. Дельфя компилит сразу в машинный код под процессоры серии "ARMv7 processor with NEON support"
http://blog.blong.com/2013/09/delphi-for-android-aka-delphi-xe5-aka.html
Возможно, это связано с разными настройками десятичных разделителей в разных языках. Вы используете функцию преобразования StrToFloat с настройками по-умолчанию. Подозреваю, что в разных языках эти умолчания различные. Попробуйте использовать вариант этой функции с двумя параметрами, где формат строкового представления задаётся явно:
function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
и задайте AFormatSettings такое как у вас записаны данные в текстовом файле.
Загрузить текстовый файл в Мемо в андроиде не проблема, делается так же как в винде.
А вот запросить у пользователя путь к файлу - вот это проблема. Готовых работающих компонентов нет. Можно делать самому, идею как сделать можно почерпнуть тут (http://delphifmandroid.blogspot.ru/p/blog-page_27.html), в разделах про файловый менеджер.
Пытаюсь рисовать в PaintBox, но выходит что-то странное.
Пытаюсь для начала залить его цветом, пробовал два варианта:
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
begin
canvas.Clear(TAlphaColorRec.Greenyellow); <- вариант 1: заливает всю форму
PaintBox1.canvas.Clear(TAlphaColorRec.Greenyellow); <- вариант 2: опять заливает всю форму
end;
Но оба варианта заливают всю форму вместо того чтоб залить только сам PaintBox.
Проверял в ХЕ6.
В хелпе написано так:
Canvas: The drawing surface of the object to be paint
Я думал что это поверхность самого PaintBox, а получаю залитой всю форму.
И даже во втором варианте, где явно указан компонент.
Почему такое странное поведение?