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

ENERGY

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

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

  • Посещение

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

    57

Весь контент ENERGY

  1. Есть еще вариант - Заменить оконную процедуру на свою. Второй вариант с модификацией юнита FMX.Platform.Win я бы вообще исключил, т.к. модуль поменяться в будущем и придут новые проблемы. Вот есть вариант с хуком: http://teran.karelia.pro/articles/item_6148.html
  2. У Delphi же есть TThreadPool и TTask. Также смотри TParallel.For Т.е. можно сделать что то типа Pool := TThreadPool.Create; Pool.SetMaxWorkerThreads(10); TTask.Run( procedure begin ... TThread.Synchronize(nil, procedure begin что то делаем в GUI end); end, Pool ); Или вот код из реального проекта. Качаем файлы в разных потоках. Pool := TThreadPool.Create; Pool.SetMaxWorkerThreads(10); TParallel.For(0, FMembersList.Count - 1, procedure(Idx: Integer) var AHTTP: TIdHTTP; begin if not FileExists(FMembersList[Idx].FileName) then begin AHTTP := TIdHTTP.Create(nil); try AHTTP.HandleRedirects := true; FStreamList[Idx].Clear; AHTTP.Get(FMembersList[Idx].URL, FStreamList[Idx]); finally FreeAndNil(AHTTP); end; TThread.Queue(TThread.CurrentThread, procedure var AItem: Integer; begin ... end; Log.d('Current Thread = ' + inttostr(Idx)); end); end; end, Pool);
  3. Спасибо за ответ. Я это читал, но как то не особо осветили они эту тему. В общем по экспериментам - TimageList сам выбирает нужные размер, в зависимости от размера контрола, на основе метода TimageList.BestSize (fixme?) К примеру если TListItem в ListView имеет высоту 44, и в списке картинок есть картинка < 44 - то будет показана она (например 32x32 ). Если там только картинка 16x16. то она будет увеличена или уменьшена, если картинка больше 44. Желательно сразу подбирать правильный размер (ну или рядом), т.к. если увеличить 16x16 в 32x32 она будет размыта. А если поставить слишком большие картинки (например 128 ), то список будет дольше грузиться и тратить ресурсы на не нужную работу... Конечно измененные картинки кэшируются (8 на текущий момент?) Так что смотреть надо на минимальную и максимальную высоту, которые вы меняете от платформы к платформе.. Размер картинок меняется по запросу на лету, в остальное время они всегда лежат в оригинальном размере. При этом лучше не ставить кучу картинок разного размера, т.к. это все будет в оперативной памяти, даже те, что не используются на этой платформе.
  4. Все приходит с опытом. Отключайте его по частям, ищите проблему. Используйте Assert во время написания нового кода, запускайте под отладчиком, используйте Log.d (видео ) . Не забывайте про синхронизацию (TCriticalSection (TMonitor)\AtomicIncrement и др\Synchronize для обновления GUI ) если используете другие потоки, - без нее будут случайные и не постоянно появляющиеся ошибки AV. Возможно программа слишком не оптимизированная (куча контролов\много картинок в ImageList напр), забирает много памяти и девайс глючит. Может тут еще советов дадут.
  5. Ага, понял как он работает. Значит TimageList 32x32. Для каждой картинки (ItemIndex ) в списке можно добавлять разные размеры, указав их из файлов. Затем система выбирает нужный размер, в зависимости от каких то критериев. К примеру, для картинки с индексом 0 я добавил 4 разные (в смысле не по размеру, в вообще - другие) иконки - одну 16x16 (scale 1), вторую 24x24 (1,5) и 3. 32x32 и 4. 48x48 для теста. Под Windows показалась картинка 24x24. Под Android на HTC телефоне тоже показалась картинка 24x24. А где можно почитать про стандарты - в каком случае какой размер подхватывается (видимо это зависит от платформы и dpi экрана) и вообще какие размеры по умолчанию должны присутствовать?
  6. Вобщем дело не в формате. Дело оказалось почему то в размере. Я взял иконку размером 32x32 (scale 1) и поставил в список, и вуаля - везде есть прозрачность. Но иконка того же размера в Android телефоне как и была 16x16 . Теперь вопрос - какой размер иконок должен быть? И почему размер иконок не меняется при отображении в LV, хотя размер иконки и TImageImage менялся (был 16x16 и иконка тоже, поставил 32x32 и иконку тоже кинул 32x32) Спасибо.
  7. Меня это проблема преследует со времен VCL... Подскажите как же ее решить... FMX TListView - ItemAppearanceName = ImageListItem. Лежит fmx TimageList, в настройках указано 16x16 и прорачный цвет clNone, добавил одну иконку 16x16 с прозрачностью. Если запустить под Windows 10 все ок. Если запустить под Android то при выделении (selected) вместо прозрачности белый цвет. В результате иконка некрасиво обрамлена в белом квадрате.. Иконку делал в Axiallis IconWorkShop, сохранил как ico, Пробовал заливать белым вместо прозрачного, и затем ставить в TimageList белый как прозрачный - тоже самое... Что же делать...
  8. А где бы пример такого проекта с таким TlistView подсмотреть? Подскажите пожалуйста.
  9. Спасибо за ответ. Но причем тут TMultiView к TListView? Что то не пойму. У ListView есть свое событие OnGuesture, где можно перехватить длинное нажатие. Вопрос не в этом, а в том, из какого компонента состряпать PopupMenu в моб. ОС? Что обычно используют для этих целей, чтобы отобразить меню в ListView? Я просто думал возможно есть готовое решение, где можно просто указать в Design Time PopupMenu в TListView (как это делается в VCL) и оно будет показываться при длинном нажатии (т.е. не высчитывать самому координаты, центрируя его на экране и писать какой то код ).
  10. Подскажите как сделать PopupMenu в TListView на мобильных системах? PopupMenu там не работает, он для Windows и OSX. Нужно при долгом нажатии в TListView показывать меню. Может в Delphi это можно сделать проще, чем создавать TListBox и просчитывать координаты? А если по другому никак, можно пример как это сделать? Спасибо. upd: Я просто думал возможно есть готовое решение, где можно просто указать в Design Time PopupMenu в TListView (как это делается в VCL) и оно будет показываться при длинном нажатии (т.е. не высчитывать самому координаты, центрируя его на экране и писать какой то код ).
  11. FMX TlistBox нужно использовать, когда есть немного пунктов, и они разные, к примеру это может быть список настроек. Основная фишка TListBox - это то что можно кидать на каждый пункт разные контролы, лэблы, кнопки, чекбоксы итд. TListView предназначен для больших списков. Его также можно по разному настроить. Контролы на пункты ListView кидать нельзя. Я нашел видео (ссылка на ютуб, на всякий случай) где все это объясняется на разных проектах (TListBox и TListView) от Рэя Конопки. Причем там в конце видео есть ссылка на 7 проектов - примеров. Скачать . Я также залил этот зип архив на наш форум, продублировав. На Stackoverflow есть хороший пример как добавлять и делать дизайн пунктов FMX TListView в RunTime mobilelistcontrols.zip
  12. Может какую то книгу посоветуете в pdf, чтобы была возможность читать ее без интернета (в транспорте итд). Вот вы например как учились? Изучали Java? Долго? По каким книгам\самоучителям\курсам? чтобы переводить с Java на Delphi достаточно базовых знаний Java Очень не хватает FAQ по этому поводу. Сделали бы тему, куда сбрасывались бы все ньюансы по переводу с Java на Delphi. Я б с удовольствием подхватил. Если в сети будет мало инфы, то Delphi Android так и останеться не популярный. Вот я вот только экспериментальным путем понял что Uri это обычная строка c content://xxx И что URI.withValue - это обычное соединение двух строк. А я думал это объект какой то в памяти итп. Вот такой инфы не хватает. Народ бы гораздо быстрее вошел в курс дела. А Delphi стоит большего, ведь это мечта из 90 тых - сделать инструмент, который компилит один исходный код для разных платформ, без особых изменений, мало у кого получилось.
  13. Порекомендуйте книги для изучения Android, желательно на русском. Английский не проблема, но на русском будет быстрее. Если на англ. будет манул перевода кода с Java на Delphi это тоже будет очень хорошо. А то мне приходится изучать эту систему по мере поступления задач (читать Help Android), а хотелось бы быстрее войти в курс дела. А то я до сих пор не знаю базовых вещей, к примеру есть ли в Андроид системе аналог системы сообщений как в Windows (PostMessage, SendMessage, Broadcast итд ) Я вот нашел одну.. Может вы и получше посоветуете. Спасибо.
  14. Большое Вам спасибо Ярослав, за то что вносите большой вклад в развитие Mobile Delphi. Очень мало примеров и документации (причем на любом языке) по этому поводу, ваш сайт очень выручает. Я попробовал демку c:\Program Files (x86)\Embarcadero\Studio\18.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Address Book\Contacts\Contacts_Delphi.dproj с TAddressBook . Delphi 10 upd 1 Запускал на телефоне HTC - ни один контакт не загрузился - просто пустой список. UPD: Вместо AddressBook1.AllContacts(Source, Contacts); Нужно AddressBook1.AllContacts(nil, Contacts); тогда загружает все контакты. Вся проблема в том, что он считывает сразу все контакты. А мне это не нужно. Лучше использовать код для поиска конкретного номера, прекрасно находит работает (также работает и вставка нового контакта, здесь описал http://stackoverflow.com/questions/29782398/insert-contacts-in-android-with-delphi/41294891#41294891): function TCore.IsNumberInAddressBook(const aNumber: string): boolean; var vCursor: JCursor; vQueryStr: string; begin Result := false; // will be: data1 LIKE '%+380501960000%' (with quotes) vQueryStr := JStringToString( TJCommonDataKinds_Phone.JavaClass.NORMALIZED_NUMBER) + ' LIKE ''%' + aNumber + '%'''; vCursor := TAndroidHelper.Activity.getContentResolver.query( TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, nil, //projection String: A list of which columns to return. Passing null will return all columns, which is inefficient. StringToJString(vQueryStr), // String: A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given URI. nil, nil); // Query help: https://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) if vCursor <> nil then try Result := vCursor.getCount > 0; finally vCursor.close; end; end; // а это может пригодится while (cursor.moveToNext) do begin lbContactsList.Text := JStringToString(cursor.getString( cursor.getColumnIndex(StringToJString('DISPLAY_NAME')))); lbContactsList.Tag := cursor.getInt(cursor.getColumnIndex(StringToJString('_ID'))); // ListBox1.AddObject(ListBoxItem); end; UPD: AllContacts находится в \source\fmx\FMX.AddressBook.Android.pas А вообще для самообразования хотелось бы узнать как вызвать ContactsContract.PhoneLookup.CONTENT_FILTER_URI И что это за конструкция такая Uri.withAppendedPath, ведь в будущем наверняка с ней придется сталкиваться. Если вы в курсе, расскажите пожалуйста.
  15. Никак не могу сделать поиск контакта по номеру. Есть пример на Java, я все пытаюсь научиться переводить с java на Delphi, но не всегда получается. Вот пример (там же есть полный пример.): Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... В нем используется Uri.withAppendedPath (это Jnet_UriClass из Androidapi.JNI.Net) Я нигде не нашел пример работы с ним. Попытался сделать сам : vUriClass: Jnet_UriClass; vfilter : TJavaObjectArray<JString>; wUri := vUriClass.withAppendedPath( TJContactsContract_PhoneLookup.JavaClass.CONTENT_FILTER_URI, vUriClass.encode( StringToJString('+11111111') ) ); vfilter := TJavaObjectArray<JString>.Create(1); vfilter[0] := TJCommonDataKinds_StructuredName.JavaClass.DISPLAY_NAME; with SharedActivity.getContentResolver do wCursor :=query(wUri, vfilter, nil,nil, nil); // Query to get all contact sorted by displayname Но ничего не получилось, вылетает ошибка сегментации в withAppendedPath. Помогите пожалуйста, одна на вас надежда. Второй день пошел уже. Как этот ContactsContract.PhoneLookup provider использовать? Вот полный код на Java : public String getContactDisplayNameByNumber(String number) { Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); String name = "?"; ContentResolver contentResolver = getContentResolver(); Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); try { if (contactLookup != null && contactLookup.getCount() > 0) { contactLookup.moveToNext(); name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); //String contactId = contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); } } finally { if (contactLookup != null) { contactLookup.close(); } } return name; }
  16. Конечно можно. И видео можно. В Папке Samples видел пример. Не помню точно как называется, но ищи проект со словом Camera.
  17. Привет. Есть код, который прекрасно работает в активити, но если вызывать его из сервиса, вылетает ошибка - Activity not found, maybe you are in a service , - т.к. нельзя использовать SharedActivityContext в сервисе. На StackOverflow есть несколько подобных вопросов, но все они для Явы. function GetConnectivityManager: JConnectivityManager; var ConnectivityServiceNative: JObject; begin ConnectivityServiceNative := SharedActivityContext.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; Наверняка кто-то уже сталкивался с этой проблемой, подскажите как ее решить. Спасибо. P.s. В сервисе нужно периодически поверять наличие интернета при помощи NetworkInfo.
  18. Ребята в Delphi встроен уже механизм синхронизации и он мультиплатформенный. MonitorEnter(Self); MonitorExit(Self); См. TMonitor Также см. AtomicExchange AtomicDecrement AtomicIncrement
  19. Кстати, я вспомнил в Delphi же есть у каждого объекта TMonitor и MonitorEnter. Ведь он же мультиплатформенный по идее?
  20. Какие есть средства для синхронизации потоков в Android? Нужен аналог критических секций в Windows - есть два потока, которые пишут в один участок памяти (буфер), подскажите пожалуйста. Насколько я понял там мутексы есть? Есть ли в Delphi какие то обертки для синхронизации под андроид? Спасибо.
  21. Все оказалось проще чем я думал. Странно что никто не ответил. Итак, просто пишем одну строчку. https://github.com/FMXExpress/android-object-pascal-wrapper uses java.net.InetAddress; Result := TJInetAddress.JavaClass.getByName(StringToJString('google.com')).isReachable(3000); Или например запуск процесса (Runtime.exec): https://github.com/FMXExpress/android-object-pascal-wrapper uses java.lang.Process, java.lang.Runtime; var Process : JProcess; Runtime : JRuntime; Process := TJRuntime.JavaClass.getRuntime.exec(StringToJString(sCmd)); Process.waitFor; Result := Process.exitValue;
  22. Спасибо большое. Уже разобрался. Но вопрос так и не решен. Возьмем к примеру тот же ConnectivityManager. Для получения ссылки на него используется функция function GetConnectivityManager: JConnectivityManager; var ConnectivityServiceNative: JObject; begin ConnectivityServiceNative := SharedActivityContext.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; Насколько я понял классы получают по разному, эта строчка всегда разная: SharedActivityContext.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE) для других классов. В хелпе четко прописано что Get an instance of this class by callingContext.getSystemService(Context.CONNECTIVITY_SERVICE). А вот что делать к примеру для получения такого класса InetAddress https://developer.android.com/reference/java/net/InetAddress.html Конкретно нужно вызвать метод isReachable(timeout : Integer). Т.е. у меня есть все заголовки интерфейса JInetAddress, а вот как получить ссылку на класс я не знаю. (кстати почему у вас подсветки Delphi кода нет - и это на сайте посвященному Delphi? Здесь я выбрал С): Спасибо, очень жду ответа.
  23. Привет. Про программировании в Windows, использовать Windows API просто - 1. Открываем MSDN, находим нужную функцию. Смотрим из какой она DLL. 2. Затем портируем описание в Delphi, LoadLibrary и вызов нужной фукнции. А вот как это сделать на Андроиде, я так и не понял. Я понял что есть обертки, но нужно научиться это делать самому. Кстати многие вопросы и существует здесь из за того, что народу не понятно как это сделать. Нигде нету толкового объяснения, с примером. Например я нашел статью где описывается обертка в Wifi, подскажите пожалуйста как сделать точно так же пошагово. Например для класса WifiInfo 1. https://developer.android.com/reference/android/net/wifi/WifiInfo.html читаем документацию. 2. Что делать дальше?
×
×
  • Создать...