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

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

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

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

  • Посещение

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

    67

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

  1. Не разобрался в чем дело. Откатил систему на точку восстановления недельной давности и все заработало.
  2. Delphi XE8 перестали собираться проекты под Андроид. Ни с того, ни с сего. Пустой проект - тоже самое. При попытке билда вот такие ошибки. Голову сломал уже, не могу понять что произошло. [DCC Error] E2597 D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -ldl D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lc D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lm D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -landroid D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lEGL D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lGLESv2 D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -llog D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -ljnigraphics D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lGLESv1_CM D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\embarcadero\studio\16.0\lib\Android\Release\SysInit.o: in function Sysinit::__getenv(char*):SysInit(.text._ZN7Sysinit8__getenvEPc+0x4): error: undefined reference to 'getenv' [SKIP] D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\embarcadero\studio\16.0\lib\Android\Release\Androidapi.Eglext.o: in function Androidapi::Eglext::eglDestroyImageKHR(void*, void*):Androidapi.Eglext(.text._ZN10Androidapi6Eglext18eglDestroyImageKHREPvS1_+0x4): error: undefined reference to 'eglDestroyImageKHR' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\embarcadero\studio\16.0\lib\Android\Release\System.JSON.o: in function System::Json::initialization():System.JSON(.text._ZN6System4Json14initializationEv+0xc): error: undefined reference to '__aeabi_memset' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function expand_workspace:pcre_compile.c(.text+0x1398): error: undefined reference to 'memcpy' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function compile_regex:pcre_compile.c(.text+0x32d0): error: undefined reference to 'strncmp' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function compile_regex:pcre_compile.c(.text+0x3440): error: undefined reference to 'memset' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function compile_regex:pcre_compile.c(.text+0x6ec8): error: undefined reference to 'strcmp' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function pcre_compile2:pcre_compile.c(.text+0x758c): error: undefined reference to 'strlen' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_compile.o): in function pcre_compile2:pcre_compile.c(.text+0x7838): error: undefined reference to 'memcmp' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x30): error: undefined reference to 'tolower' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x50): error: undefined reference to 'islower' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x64): error: undefined reference to 'toupper' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x6c): error: undefined reference to 'tolower' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0xc8): error: undefined reference to 'isupper' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0xf0): error: undefined reference to 'islower' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x118): error: undefined reference to 'isalnum' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x154): error: undefined reference to 'isspace' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x170): error: undefined reference to 'isxdigit' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x198): error: undefined reference to 'isgraph' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x1c0): error: undefined reference to 'isprint' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x1e8): error: undefined reference to 'ispunct' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x210): error: undefined reference to 'iscntrl' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x254): error: undefined reference to 'isspace' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x264): error: undefined reference to 'isalpha' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x280): error: undefined reference to 'isxdigit' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x290): error: undefined reference to 'isalnum' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/libpcre.a(pcre_maketables.o): in function pcre_maketables:pcre_maketables.c(.text+0x2b0): error: undefined reference to 'strchr' D:\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: d:\\embarcadero\\studio\\16.0\\lib\\Android\\Release/librtlhelper.a(thunk_helpers.o): in function intercept_thunk_index(char const*):./thunk_helpers.c:46: error: undefined reference to '__assert2' [DCC Fatal Error] F2588 Linker error code: 1 ($00000001) Failed
  3. Согласно http://docwiki.embarcadero.com/RADStudio/Seattle/en/Multi-Device_Application_to_Receive_Push_Notifications , примерно в середине статьи: Project Settings To enable your application to receive remote notifications: Right-click your project in the Project Manager. Choose Project > Options > Entitlement List. Set Receive Push Notification value to True.
  4. "Project Options"->"Entitlement List"->"Receive Push notifications" установлено в True?
  5. Попробовал ваш код. Не помогло. Буфер не очищается. PS. Brovin Yaroslav, кстати TEdit.CheckSpelling = False тоже не убирает подчеркивание. PPS. Delphi RX, Android 4.2.2 Быть такого не может. Отладкой проверяли? Может у вас срабатывает на if Assigned(FClipboardSvc) then и ничего не выполняется. В главной форме не забудьте FClipboardSvc: IFMXClipboardService; и потом: procedure TFormMain.FormCreate(Sender: TObject); begin if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipboardSvc)) then FClipboardSvc := nil; ...
  6. Сейчас проверил "чистое" приложение в котором рекламы нет и никогда не было и быть не может. И опаньки - "В одном или нескольких активных APK-файлах есть SDK рекламных объявлений: Версия: 47, SDK: AdMob". P.S. Вообще глянул внутрь бинарников, обилие мусора поражает воображение, такое ощущени что компилятор туда складывает всю отладочную информацию и все модули которые идут в составе Delphi, даже если их нет в Uses и их использование не предполагается.
  7. Есть приложение опубликованное на Google Play в двух ипостасях - бесплатное с рекламой и платное без рекламы. Все было нормально, пока Google Play не ввела новый пункт в "Цены и распространение" - "НАЛИЧИЕ РЕКЛАМЫ". Теперь в платной версии мне пишет "В одном или нескольких активных APK-файлах есть SDK рекламных объявлений: Версия: 47, SDK: AdMob". Реклама создается в бесплатной версии динамически. Использую директивы компилятора типа: {$IFDEF IALITE} Fmx.InterstitialAd.Android, FMX.Advertising, {$ENDIF IALITE} В Project options, в Entitlement List галки на AdMob Service не стоит. Бинарный поиск в папке с релизом выдает несколько сотен вхождений фразы AdMob (в основном Androidapi.JNI.AdMob) в файлах classes.dex и libИмя_проекта.so , откуда они там? Директивы компилятора работают, специально писал абракадабру в файлах которые не должны компилится - все хорошо, компилятор не видит этот бред. Где копать? Иначе угрожают заблокировать платное приложение :-(
  8. К сожалению на английском я только чтец, но никак не писец. ;-) Но все равно спасибо за совет.
  9. Вот именно на нексусе с шестым андроидом я и тестил. Не могли бы вы попробовать именно Get с чтением в TStringStream? Потому как крах наступает при записи полученных данных в stream в недрах Indy. Буду безмерно благодарен. Могу завтра собрать тестовый проект для пробы.
  10. Т.е. если у меня не идет перехват исключения какой то функции, то ее надо завернуть еще в одну функцию и ее вызов завернуть в try except? Это как то звучит на грани безумия. В приведенной вам ссылке ничего подобного не увидел. Но вернемся к теме, мне не нужен перехват исключения, мне нужен рабочий код. В коде ошибок нет, он работает под всеми платформами и на всех версиях кроме андроида 6.
  11. Как то так: procedure TFormMain.NotificationCenterReceiveLocalNotification(Sender: TObject; ANotification: TNotification); begin If ANotification.Name.Equals('Взгляни на третью вкладку') Then TabControl.ActiveTab:=TabItem3; NotificationCenter.CancelNotification(ANotification.Name); end;
  12. TidHTTPClient перестал работать в Android 6. При попытке Get приложение закрывается с segmentation fault. То же самое приложение на всех остальных версиях андроида работает нормально. На эмуляторе проверить не удалось, по какой то причине эмулятор с андроид 6 у меня запускается около часа, а попытка отладки приводит к зависанию дельфи. Взял на пол часа живое устройство, отладка показала что крах происходит на стадии разбора результата. Т.е. данные с сервера реально получает (это подтверджают логи сервера), и при попытке вернуть результат все умирает. Код простой: Var HTTPResult : TStringStream; URI: TIdURI; HTTP: TIdHTTP; begin AURL:='http://10.10.0.1'; FHost:='10.0.0.1'; HTTP:=TIdHTTP.Create; HTTP.CookieManager := TIdCookieManager.Create(HTTP); HTTP.Request.Host:=FHost; HTTP.AllowCookies := true; HTTP.HandleRedirects := True; HTTP.ConnectTimeout:=6000; HTTP.ReadTimeout:=30000; HTTP.Request.CustomHeaders.AddValue('Connection','keep-alive'); HTTP.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'; HTTP.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'; HTTP.Request.AcceptEncoding:='gzip, deflate, sdch'; HTTP.Request.AcceptLanguage:='ru,en-US;q=0.8,en;q=0.6'; Result.Status:=False; Result.MessageText:=''; AURL:=StringReplace(AURL,'{AuthorizationKey}',AuthorizationKey,[]); AURL:=StringReplace(AURL,'{Host}',FHost,[]); HTTPResult:= TStringStream.Create('', TEncoding.UTF8); URI := TIdURI.Create(AURL); HTTP.CookieManager.AddServerCookie(CookieAuthorization, URI); try HTTP.Get(AURL,HTTPResult); except on E : Exception do begin Result.Status:=False; Result.MessageText:=E.Message; Exit; end; end; Result.Status:=True; Result.MessageText:=Trim(HTTPResult.DataString); HTTPResult.Free; URI. Free; end; Падает на строке HTTP.Get(AURL,HTTPResult);, try не срабатывает. Запрос именно http, не https. К сожалению живое устройство было у меня не долго, досконально разобраться не успел. Выяснил что падает на строке 1423 в idHTTP.pas: IOHandler.ReadStream(LS, -1, True); У кого будут какие мысли? Понятно что разработчики забили на Indy довольно давно, но не хочется целиком десяток проектов переписывать. P.S. System.Net.HTTPClient работает в тех же условиях, не падает, но не смог заставить работать cookie, разбираюсь в чем дело. Хотя при отсутствии таймаутов и обработки редиректов применение сего очень ограничено.
  13. Спасибо огромное! В прошлом не хватало OnBalloonClick. Один вопрос - картинка берется из приложения? Вот свою бы ставить на выбор. И OnAnimate не задействовано никак. Развитие компонента ожидается?
  14. Избежать появления кнопки Вставить можно очисткой буфера обмена. Например так: procedure TFormMain.Edit1CanFocus(Sender: TObject; var ACanFocus: Boolean); begin if Assigned(FClipboardSvc) then FClipboardSvc.SetClipboard(''); ACanFocus:=True; end; Обратите внимание что именно пустая строка очищает буфер, попытка сделать FClipboardSvc.SetClipboard(Nil); поместит в буфер строку 'empty'.
  15. Вы будете смеяться, но проблема решена. Методом научного тыка. Не работающая установка значения ListView.ScrollViewPos решается следующей строкой ListView.ItemIndex:=0; (Не важно 0 или любое другое число). Т.е. для того чтоб заработало делаем так: ListView.ItemIndex:=0; ListView.ScrollViewPos:=333; // Ура, работает!!! Почему так работает, я не понял.
  16. Ветка форума поэтому и называется TListView, что речь идет о TListView, а не ListBox. Кстати заметил странность, после ListView.Resize иногда GetMaxScrollViewPos выдает реальное число а не 0. Удалось точно узнать в какой ситуации: 1. Добавляем много итемов, чтоб не помещались в видимую область 2. Удаляем все итемы (ListView.ClearItems;) 3. Опять добавляем итемы и позиционируем ScrollViewPos:=300 - Ура все работает. Если в 1 пункте все итемы помещаются в видимую область, то в Четвертом пункте ScrollViewPos:=300 не приводит ни к какому результату (GetMaxScrollViewPos = 0). Остается списать все на очередной косяк Embarcadero, других мыслей нет...
  17. Вот здесь посмотрите https://code.google.com/p/delphi-foundations/source/browse/trunk/Book/06.+Arrays,+collections+and+enumerators/Simple+search+%28TArray+class+helper%29/CCR.Generics.SimpleArraySearch.pas?r=29
  18. Не подходит. ScrollTo позиционирует Item по нижней границе ListView. Трудно придумать применение этой функции с точки зрения дизайна приложения. Логично позиционировать по верху. Но если высота ListView не кратна ItemHeight, то даже с помощью дополнительных вычислений не возможно этим методом позиционировать нужный итем сверху. Метод ScrollViewPos идеален для этого, но по какой то причине не работает сразу после создания итемов.
  19. Задача в следующем: Динамически заполняю ListView, после заполнения нужно установить ListView.ScrollViewPos в произвольную позицию. Но не выходит по причине того, что в процедуре TCustomListView.SetScrollViewPos(const Value: Single) функция GetMaxScrollViewPos всегда в таком случае возвращает ноль. Подозреваю что после добавления итемов нужно как то передёрнуть ListView, но не знаю как. Пробовал ApplyStyleLookup, Repaint, Resize, RecalcSize - не помогает. Отрисованный и видимый в приложении ListView прекрасно позиционируется с помощью ScrollViewPos. А GetMaxScrollViewPos выдает реальную длину списка. Ткните меня в правильную процедуру.
  20. Думаю да, судя по исходникам под все платформы. И кстати ошибка у меня в коде: Note: FindFirst allocates resources (memory) that must be released by calling FindClose. Забыл FindClose.. В хелпе есть упоминание мака, так что думаю будет работать точно. Note: Some of the file attribute constants are not valid on all platforms. For example, faVolumeID and faArchive do not work on MAC OS.
  21. Ура! Я победил проблему. Причем с помощью почти забытой мной процедуры 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;
  22. Эффект тот же. Этот способ я вторым проверил.
  23. Нужно получить размер файла под любыми платформами. Сейчас использую функцию function TFileManager.GetFileSize(APath : String) : String; Var F : file of Byte; AFileSizeByte : Integer; AFileSizeMbyte : Double; begin Result:=''; AssignFile(F, APath); FileMode := 0; // readonly try try Reset(F); AFileSizeByte:=FileSize(F); CloseFile(f); except end; finally AFileSizeMbyte:=AFileSizeByte/1048576; Result:=Format('%6.3f',[AFileSizeMbyte])+' Mbyte'; end; end; Работает, но есть одно но - под Windows, если проверяю exe файл, антивирус (в данном случае Защитник Windows) унюхивает что производится открытие файла и начинает его проверять на вирусы. Из за этого сканирование директории с большим количеством исполняемых файлов подвешивает основной поток приложения. Вопрос в следующем - нет ли другого способа получения размера? Странно что TFile, TPath или TDirectory не содержат такого полезного метода. В данный момент двигаюсь в направлении отдельного потока получения размера, но решение не красивое, хочется быстро и сразу.
  24. Без "FloatAnimation.Parent:=Nil" вылетало исключение. Какой именно не скажу, грохнул весь этот код. Опять наступил на старые грабли и изменил принципу "Никогда, никогда не использовать ListBox в проектах". Самодельный аналог на вертикальном скроллбоксе работает на порядок красивее и стабильнее. Этот компонент переписал на ListView.
  25. Задача следующая - добавить анимацию в 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; работать не хочет. Хотя работает и ладно... ;-)
×
×
  • Создать...