Перейти к содержанию
  • Регистрация

Евгений Корепов

Пользователи
  • Публикаций

    624
  • Зарегистрирован

  • Посещение

  • Победитель дней

    68

Весь контент Евгений Корепов

  1. Задача следующая - добавить анимацию в ListBoxItem по клику, ListBoxItem может быть несколько десятков. Создавать для каждого Animation накладно. Update: Нашел решение в теме http://fire-monkey.ru/topic/1073-smena-roditelskogo-komponenta-dlia-animatora/ : но мне нужно также событие AnimationFinish, по нему происходит смена содержимого ListBox. (Пишу компонент файл-менеджера для одного проекта). Update: Вроде нашел решение, все работает. Подскажите корректно ли я это делаю? procedure TFormMain.FormCreate(Sender: TObject); begin FloatAnimation.Parent:=Nil; // FloatAnimation создан в дизайнатйме, лежит на форме, поэтому нужно так сделать. FloatAnimation.Enabled:=False; end; procedure TFormMain.ListBoxFilesItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); begin CurrentItem:=Item; if CurrentItem.Tag=1 then // Смена папки begin FloatAnimation.Parent:=Item; FloatAnimation.PropertyName:='Opacity'; FloatAnimation.Enabled:=True; FloatAnimation.Start; end; end; procedure TFormMain.FloatAnimationFinish(Sender: TObject); begin FloatAnimation.Enabled:=False; FloatAnimation.Parent:=Nil; FillListBoxFile(CurrentItem.TagString); end; Причем без этого куска кода: FloatAnimation.Enabled:=False; FloatAnimation.Parent:=Nil; работать не хочет. Хотя работает и ладно... ;-)
  2. { "registration_ids": [ "APA91bFwDgtPtlwgvbgVt7qpxqes0UIi...", "APA91bFS3fknVDY6qifQiJ1KZDSjwZE..." ], "data": { "title": "Заголовок сообщения", "message": "Текст сообщения" } }
  3. Подскажите где закралась ошибка. Процедура должна отправлять файл через намерение (файл текстовый). aFileName:='/storage/emulated/0/Download/test/тестовый файл для отправки.out.txt'; aComment:='Комментарий к файлу'; procedure ShareFile(aFileName, aComment : String); var Intent : JIntent; uri : Jnet_Uri; AttachmentFile: JFile; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_SEND); Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(aComment)); Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aComment)); AttachmentFile := TJFile.JavaClass.init(StringToJString(aFileName)); Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile); Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID)); Intent.setType(StringToJString('text/plain')); SharedActivity.startActivity(Intent); end; Наблюдаю следующее: Gmail - все отлично, файл присоединён, комментарий в теме письма DropBox - все отлично, файл передан Google Drive - файл передан, но у него отрезано расширение (в папке лежит файл с именем "тестовый файл для отправки") Yandex Disk - все работает Облако Mail.ru - предлагает создать текстовый файл ("Новый текстовый файл.txt"), в который записывает только две одинаковые строчки "Комментарий к файлу" Уже весь мозг сломал. А заказчик требует работу через все эти системы.
  4. Да, точно. Дезинформировал в прошлом посте. У меня вот так: implementation {$IFDEF ANDROID} uses FMX.PushNotification.Android; Var APushService : TPushService; AServiceConnection : TPushServiceConnection; {$ENDIF ANDROID}
  5. В uses должно быть только System.PushNotification. В опциях проекта отметили Receive push notifications?
  6. Огромное спасибо!!! Все заработало! Проблема видимо в косячном примере от embarcadero. Проверку InAppPurchase.IsProductPurchased(ProductId) необходимо выполнять в событии OnProductsRequestResponse, т.е. после завершения ,видимо ассинхронного, InAppPurchase.QueryProducts. А никак не в OnSetupComplete как в примере от Embarcadero "CapitalIAP". Кстати в Delphi 10 тот же косяк в примере, видимо они даже не пробовали проверять его работоспособность.
  7. Купил сам у себя, не через тестовый аккаунт. Деньги списались,в "Payments Merchant Center" покупка отобразилась. Но FInAppPurchase.IsProductPurchased(NoAdsID) мне говорит False, не куплен продукт. Что делать, ума не приложу.
  8. InAppPurchase.IsProductPurchased работает на тестовых аккаунтах? Сделал покупку, но IsProductPurchased всегда возвращает False. procedure TFormMain.InAppPurchaseSetupComplete(Sender: TObject); begin LogMy('InAppPurchaseSetupComplete'); FInAppPurchase.QueryProducts; if FInAppPurchase.IsProductPurchased(NoAdsID) then begin LogMy(NoAdsID+' Yes ProductPurchased'); Буду очень благодарен, если кто даст ссылку на нормальную документацию, желательно на русском. Хочется понять хотя бы основные вещи, к примеру что такое метод ConsumeProducts (потреблять продукты?). И возможна ли отладка InAppPurchase? Запуск в отладочной версии не позволяет работать с InAppPurchase.
  9. Virtual Keboard как раз есть и видима. Так что не вариант. Кстати события OnVirtualKeyboardHidden и OnVirtualKeyboardShown в XE8 работают не стабильно, иногда с секундными задержками, иногда вообще забывают срабатывать. Видимость лучше проверять с помощью function TFormMain.KeyboardVisible : Boolean;var Keyboard: IFMXVirtualKeyboardService; begin Result:=False; if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then Result:=TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState; end;
  10. Delphi XE8, Android. Возможно ли определить источник ввода символов в TEdit? Т.е. откуда приходит ввод - виртуальная клавиатура или внешняя usb или блютус клавиатура (в моём случае это сканеры штрих кодов)
  11. Var HDevicePushParams : TDevicePushParams; APushService : TPushService; AServiceConnection : TPushServiceConnection; SQuery : String; begin APushService:=TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); APushService.AppProps[TPushService.TAppPropNames.GCMAppID]:='ХХХХХХХХХХХХХХХХ'; AServiceConnection:=TPushServiceConnection.Create(APushService); AServiceConnection.Active:=True; AServiceConnection.OnChange:=ServiceConnectionOnChange; AServiceConnection.OnReceiveNotification:=ServiceConnectionOnReceiveNotification; HDevicePushParams.DeviceID:=APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; HDevicePushParams.DeviceToken:=APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; SQuery:=APIURL+'?DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken; HTTPThread:=THTTPThread.Create(SQuery,FQueue); // Здесь просто отправка на сервер в потоке. Сервер принимает стоку и складывает в базу пары "DeviceID - DeviceToken", можно еще что нибудь отправлять, чтоб точно идентифицировать клиента. А на сервере все еще проще. Вот php: $title = 'Это заголовок'; $message = 'Это текст сообщения.' $devices = 'DeviceToken - один конкретный получатель'; $apiKey = "AIzaХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ"; $gcpm = new GCMPushMessage($apiKey); $gcpm->setDevices($devices); $response = $gcpm->send($message, array('title' => $title)); Лениво было писать велосипед, использовал готовую отсылалку https://github.com/mattg888/GCM-PHP-Server-Push-Message . Там все просто, она заворачивает все в json и отправляет на http
  12. Delphi XE8, Android. Пишу слайдер картинок. Задачу себе поставил аналогичную слайдеру Ввконтакте. Т.е. Жестами листаем налево/направо, двойной клик увеличение, повторный двойной клик уменьшение, ну и пальцами можно растягивать изображения. Все работало замечательно до момента добавления анимации. Слайд (TImage) лежит в TScrollBox. Анимация увеличения (FloatAnimation) тоже отлично работает. Но позиционирование картинки сделать не могу с анимацией, анимацию не могу привязать к ViewportPosition. В итоге, при увеличении картинки, не область по которой ткнули, а по уродски - левый верхний угол остаётся зафиксированным, увеличивается вправо и вниз. Как можно связать FloatAnimation и ViewportPosition ?
  13. Странно, а зачем ты 8-ку обновлял с 4-ки? Да в том то и дело что не обновлял, я купил обновление XE7, за пару недель до выхода восьмёрки (даже не подозревал что новая версия на подходе), и 30 апреля сего года мне Embarcadero прислала письмо, что мол так как вы редкостный мудила, умудрились купить старый продукт перед выходом нового, то дарим вам обновление до XE8 (причем ссылка на обновление была валидна всего сутки). Дареному коню зубы не смотрят, я естественно принял щедрый подарок ;-)
  14. Да, видимо где то между обновлениями XE5, XE7, XE8 я протупил :-(
  15. Ну а кто говорит про новую лицензию???? Я же только обновляю ранее купленную! Это в разы дешевле. А подскажите про "Recharge Renewal", кто может этим обновлением воспользоваться? Мне в аллсофте отказали в праве его приобрести. У меня "Delphi XE8 Professional Named User (Upgrade from XE4 or later) - ESD", сказали что с "Delphi XE8 Professional Named User" нельзя перейти на "ОБНОВЛЕНИЕ (RECHARGE RENEWAL) ТОЛЬКО С DELPHI XE8 PROFESSIONAL RECHARGE NAMED". А ведь всего 16 579,00 руб., счастье было так близко ;-( Обновление "ОБНОВЛЕНИЕ NAMED (UPGRADE)" за 31 447,00 руб., да плюс обновление "MOBILE ADD-ON PACK", не потяну, ибо частный разработчик, занимаюсь этим в качестве хобби для души.
  16. Примеры кода так и остались уродскими, добавление readme.html не особо помогло. Вот к примеру "\Studio\17.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\CapitalIAP" демонстрирующий "in-app payment and advertisement services". Неужели для этого нужен проект из пяти форм на тысячу строк кода? К теме относится несколько десятков строк, остальное - мешающий пониманию мусор.
  17. TSensorManager - за пол года наконец то допилили AmbientLight и HumanProximity (в XE8 были заглушки). Остальные сенсоры, к примеру Temperature, остались за кадром. LinearAccelerometer3D сломали - демо-пример наглухо виснет при FActiveSensor.Stop;
  18. Подскажите как добраться до кнопки очистки содержимого TSearchBox? Сам TSearchBox у TListView благодаря теме "Можно ли программно передать фокус на SearchBox и очистить строку?" доступен без проблем, но кнопка не обнаруживается в ListViewProducts.SearchEdit.Children.Items :-( Хочу изменить логику ее появления - сделать видимой всегда, когда есть текст в ListViewProducts.SearchEdit.Text. По умолчанию ее поведение малость загадочное - она исчезание при любой возможности (потеря фокуса, Resize, смена ориентации и т.д.). Что бы очистить поле поиска, пользователю приходится в данный момент производить следующие манипуляции: Кликнуть на SearchBox Ввести любой символ Нажать на появившуюся "кнопку с крестиком" Пока написан костыль на все возможные манипуляции - добавляю пробел в конец SearchBox, удаляю добавленный пробел, но иногда он не срабатывает и вводит пользователя в ступор. Пытался решить проблему добавлением отдельной кнопки очистки, с нормальным поведением, но опять же встает вопрос как навсегда скрыть родную кнопку. Сейчас пытаюсь отказаться от встроенного в TListView TSearchBox, сделать отдельное поле ввода поиска, но с наскока не пойму как передавать строку фильтрации в TListView.
  19. Хм, а можно подробнее? С наскока нагуглить ничего не удалось, а собственные знания у меня пока в зачаточном состоянии :-)
  20. Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии procedure TFormMain.Edit1ChangeTracking(Sender: TObject); Var FEdit : TEdit; FFloat : Single; begin If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя Exit; FEdit:=(Sender as TEdit); // Для удобства... FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы if (FEdit.Text.IsEmpty) or (FEdit.Text.Equals('-')) then // Если пусто (ничего не введено или все удалено) или только минус, ничего не делаем Exit; FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно) begin FEdit.Text:='0,'; FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой end; if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище Else FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища end;
  21. Намучавшись с не работающим FilterChar и кучей способов ввода по маске, сделал свой способ. По моему мнению самый простой. Код позволяет вводить только числа, включая дробные и отрицательные. procedure TFormMain.Edit1ChangeTracking(Sender: TObject); Var FEdit : TEdit; FFloat : Single; begin If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя Exit; FEdit:=(Sender as TEdit); // Для удобства... FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы if FEdit.Text.IsEmpty then // Если пусто (ничего не введено или все удалено), ничего не делаем Exit; FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно) begin FEdit.Text:='0,'; FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой end; if FEdit.Text.Equals('-') then // Если введен только минус, не пытамся его драконить Exit; if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище Else FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища end; В качестве временного хранилища использовано TagString, дабы не разводить глобальных переменных. Возможно понадобиться очистка временного хранилища при многократном использовании: procedure TFormMain.Edit1Enter(Sender: TObject); begin If Not (Sender is TEdit) Then Exit; (Sender as TEdit).TagString:=''; end; Буду рад услышать замечания и предложения.
  22. Т.е. средствами Delphi это не сделать? Только отдельный класс на java и морока с модификацией classes.dex? Я надеялся что мне поможет компонент турецкого коллеги http://brsatalay.blogspot.com.tr/2014/10/delphi-android-broadcast-receiver.html . По крайней мере с другими броадкастами он отлично справляется. А почему тогда получаю ошибку "В приложении Таком-то произошла ошибка"? Или это просто симптом отсутствия обработчика BOOT_COMPLETED?
  23. Пытаюсь сделать автозагрузку приложения в андроид, но не выходит каменная чаша. Приложение пустое. Даю права на "Receive boot completed", в манифесте делаю следующие изменения (выделил комментариями с "*******"): <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <%application-meta-data%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> <!-- *********************************************************************** --> <receiver android:name=".BootReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <!-- *********************************************************************** --> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) --> При включении телефона получаю ошибку "В приложении Таком-то произошла ошибка". До TForm.onCreate точно не доходит. Что я делаю не так? Помогите пожалуйста.
×
×
  • Создать...