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

krapotkin

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

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

  • Посещение

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

    209

Активность репутации

  1. Like
    krapotkin отреагировална Martifan в Как разрешить имя хоста в ip адрес на Андроиде?   
    В контексте Delphi, вы можете использовать Indy компоненты для этого. TIdStack имеет метод ResolveHost() который может быть использован для разрешения имени хоста.
     
    var GStack: TIdStack; begin GStack := TIdStack.Create; try ShowMessage(GStack.ResolveHost('localhost', Id_IPv4).ToString); finally GStack.Free; end; end; Учтите, что разрешение имени хоста в IP-адрес не гарантирует, что хост будет доступен для подключения. Если имя хоста не может быть разрешено, будет вызвано исключение UnknownHostException.
    Также обратите внимание, что операции с сетью, такие как разрешение имени хоста, могут быть медленными, и рекомендуется выполнять их в фоновом потоке, чтобы не блокировать главный поток приложения.
    По поводу вашей проблемы с локальной сетью - возможно, имя хоста, которое вы пытаетесь разрешить, не зарегистрировано в локальном DNS. В этом случае, вы можете попробовать использовать полное доменное имя (FQDN) хоста, или использовать прямой IP-адрес, если он известен.
    Если метод разрешения имен не работает для локальной сети, вероятно, проблема связана с настройками DNS в вашей локальной сети. Имена хостов в локальной сети обычно разрешаются с помощью механизма DNS, поэтому если ваш DNS сервер или файлы hosts не содержат соответствующих записей для имени хоста, который вы пытаетесь разрешить, то метод разрешения имен вернет ошибку.
    Если вы контролируете настройки DNS в вашей локальной сети, вы можете добавить соответствующие записи для всех хостов, которые вы хотите разрешать.
    Кроме того, некоторые системы поддерживают механизмы обнаружения служб на локальной сети, такие как mDNS (Multicast DNS), который используется в протоколе Zeroconf/Bonjour. Если ваши устройства и приложения поддерживают mDNS, вы можете использовать имена хостов с суффиксом .local для разрешения имён в локальной сети.
    Пожалуйста, учтите, что разрешение имён хостов в IP-адреса - это сложная область, которая зависит от многих факторов, включая конфигурацию вашей сети, настройки DNS, поддержку протоколов обнаружения служб и т.д. Если вы столкнулись с проблемами, вам может потребоваться обратиться к системному администратору или к специалисту по сетям для получения помощи.
  2. Like
    krapotkin отреагировална Martifan в Размер компилируемого файла   
    Когда вы говорите, что приложения на Андроиде весят 400КБ и используют библиотеки Java размером 2ГБ, вы, по-видимому, имеете в виду разницу между размером исполняемого файла приложения и размером всех библиотек, которые оно может использовать во время выполнения.
    Современные фреймворки, такие как Java для Android или .NET, часто используют большое количество библиотек, которые содержат общий код, используемый многими приложениями. Эти библиотеки обычно устанавливаются один раз и затем используются множеством приложений, поэтому их размер не влияет на размер каждого отдельного приложения.
    С другой стороны, приложения, созданные с использованием Delphi, обычно компилируются в нативный код и включают в себя все необходимые библиотеки и зависимости. Это может привести к тому, что исполняемые файлы будут больше, чем если бы они использовали общие библиотеки, но они не зависят от установленных библиотек времени выполнения.
    С точки зрения конечного пользователя, размер приложения часто не является ключевым фактором, особенно с учетом того, что современные устройства имеют большое количество памяти. Однако для разработчиков может быть важно минимизировать размер приложения, чтобы сократить время загрузки и уменьшить использование ресурсов.
    В итоге, вопрос "маленькие или большие приложения" зависит от контекста и требований конкретного приложения. В некоторых случаях использование общих библиотек может быть выгодно, в других - предпочтительнее иметь самодостаточное приложение с включенными в него всеми необходимыми библиотеками.
  3. Thanks
    krapotkin получил реакцию от Humanoid в Вышла Delphi 11 Community Edition   
    ой, что-то далеко все зашло
    если что, RAD Studio - это и есть Delphi + Builder
    только Builder - мертвая штука даже по сравнению с самой Delphi, которая, "как известно", мертва)))
    Множество людей ставили этот продукт и то, что все работает из коробки, несомненно.
    Значит, где-то вы сворачивали не туда.
    Поэтому нужно было просто не валить все в кучу, а разбираться по одной проблеме.
    Разобрались  с видимостью телефона - раз. Установили JDK - два. И далее по шагам. Потому что В двух абзацах описать продукт на десяток гигабайт мне лично не представляется возможным.
  4. Thanks
    krapotkin получил реакцию от Hevard в Вышла Delphi 11 Community Edition   
    безотносительно SDK. Надеюсь, вы сможете найти на своих дисках свой SDK и ввести путь к нему в SDK base path. Остальное она и так почти все сама подтягивает. 
    Но. Проблема в заголовке вовсе не в SDK.
    Закрыть Delphi. Ввести в командной строке
    ado devices
    и искать свой телефон там
    https://learn.microsoft.com/ru-ru/dual-screen/android/emulator/adb
    еще внимательно почитайте тут:
    https://fire-monkey.ru/topic/7184-android-sdk-с-чем-едят-и-как-бороться/#comment-42318
    https://fire-monkey.ru/topic/6431-не-подключается-huawei/#comment-38150
     
  5. Like
    krapotkin получил реакцию от Ingalime в Вышла Delphi 11 Community Edition   
    СДК к видимости мобил не имеет отношения 
    Делфи тоже
    Если ваш телефон видится через ADB - он будет и в Делфи
    Если нет  - то и нет.
     
  6. Like
    krapotkin получил реакцию от GASCHE в Почему при вырезании части изображения выходное изображение получается искаженным?   
    я предлагаю простую игру
    вместо всех этих (XXX+YYY*Z/12.4) поставить константы
    и тогда вся отладка будет простой и красивой
    50,50 - 100,120 - вырезать
    0,0 - 50,70 - вклеить
    и посмотреть, соответствует ли вашим ожиданиям картинка
    на 99% ваша ошибка в расчетах координат. что ваши переменные обозначают и чему равны, кроме вас, никто не ведает
    писать программу, чтобы отладить ваш код, ну какбы совсем лень
    а свой проект вы не приложили.
    вот собсно никто и не отвечает 
  7. Thanks
    krapotkin получил реакцию от Hds Wert в скопировать изображение в буфер обмена   
    Clipboardservice это объект. Его надо создать. В первом примере нарисовано, как. 
  8. Like
    krapotkin получил реакцию от Hds Wert в скопировать изображение в буфер обмена   
    вставка
      if not TPlatformServices.Current.SupportsPlatformService(IFMXExtendedClipboardService, ClipboardService) then
        exit;
     if ClipboardService.HasImage then
      begin
        b := TBitmap.Create;
        bs := ClipboardService.GetImage;
        b.Assign(bs);
    end
    копирование
    ....
    surface := TBitmapSurface.Create();
    surface.Assign(bitmap);
    ClipboardService.SetImage(surface)
     
     
  9. Like
    krapotkin отреагировална Alexandr Suvorov в Android 12 (API 31)   
    Вопрос решился. 
    Все было в том, что с API31 в файле AndroidManifest.xml в раздел <activity> добавили параметр (android:exported="true")
    И при переезде с более старых версий Delphi на новую, этот файл необходимо удалить, чтоб среда разработки создала его заново.
    Вот что нужно сделать (пеервод Гугл):
    Обеспечение актуальности файла AndroidManifest.template.xml.
    Если у вас есть существующий проект приложения FireMonkey для платформы Android из предыдущей версии RAD Studio, 
    вам необходимо удалить файл AndroidManifest.template.xml из корневого каталога вашего проекта.
    Перед запуском RAD Studio выполните следующие шаги, чтобы убедиться, 
    что файл AndroidManifest.template.xml устанавливает значение для 
    экспортируемого атрибута в объявлении действия FMXNativeActivity:
    1. Перейдите в %AppData%\Embarcadero\BDS\22.0каталог.
    2. Удалите файл AndroidManifest.xml.
    3. Перейдите в корневой каталог вашего приложения.
    4. Удалите файл AndroidManifest.template.xml.
    При следующем запуске RAD Studio и сборке приложения FireMonkey будет автоматически 
    создана обновленная версия файла AndroidManifest.template.xml.
    оригинальная ссылка:
    https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Android_Application_Manifest_File_(AndroidManifest.xml)
     
  10. Like
    krapotkin получил реакцию от Aleks Serov в Видеоплеер для Андроид 11 на Delphi 11   
    использовать Alcinoe или VLC For FMX 
    Github - поиск
  11. Like
    krapotkin получил реакцию от vitalik8311 в Помогите c SQL запросом   
    а можно в архивы не класть DCU EXE и всякие RSM файлы по 89 мбайт?
    нужен только исходный код и база
  12. Like
    krapotkin получил реакцию от vitalik8311 в Помогите c SQL запросом   
    все очень просто.
    представьте что у вас 100500 тысяч пользователей, и давайте всех их скачаем на компьютер, а тут поищем среди них через Locate()
    сама по себе плохая мысль.
    но кроме того, это значит, что вам еще и все их пароли должны прислать из базы? т.е. вам останется только выбрать, на чье имя вам интереснее оформить вашу ипотеку?
  13. Like
    krapotkin получил реакцию от vitalik8311 в Помогите c SQL запросом   
    https://www.cyberforum.ru/blogs/469693/blog5254.html
    select * from user where login = :login and password = :password  
  14. Like
    krapotkin получил реакцию от vitalik8311 в FDConnection   
    форма нужна для отображения визуальных компонентов
    подключение и датасеты вообще ни разу не визуальные
    кроме того если датасеты еще можно положить на каждую форму/фрейм отдельно, то подключение лучше держать одно. Какой смысл для этого держать форму, там же нет взаимодействия с пользователем ??
    Не очень важное, но...
    Главной формой приложения становится первая созданная форма. А вот модуль данных можно создавать до форм. И подключение проводить тоже до. Если этого требует логика приложения.
     
  15. Like
    krapotkin получил реакцию от Andrey Efimov в FDConnection   
    начнем с важных вещей:
    образно выражаясь, сначала вводят логин и пароль, а только потом нажимают кнопку, иначе в чем смысл логина вообще?
    у вас тут - сначала подключаемся, потом заполняем свойства. Кому они там нужны уже?
              FDConnection1.Connected := true;
              FDConnection1.Params.Pooled := false;
              FDConnection1.LoginPrompt := false;
              FDConnection1.Params.DriverID := 'MSAcc';....
    то же и с запросом. Сначала сделать запрос с пустым текстом, а текст запроса пообещать позже дослать?
              FDQuery1.Active := true;
              FDQuery1.SQL.Add('SELECT * FROM usersbase');
    логично, что сервер говорит SQL_NO_DATA. запроса-то нет.
    кроме того, если несколько раз нажать, то каждый раз к запросу будет добавляться строка SQL.Add(...)? зачем?
    параметры БД действительно нужно заполнять перед подключением, а вот тексты запросов, если они не меняются, достаточно один раз - в дизайн-тайме. и больше не трогать. Ну или хотя бы
              FDQuery1.SQL.Text := 'SELECT * FROM usersbase';
              FDQuery1.Active := true;
    Во всех этих ошибках нет никакой специфики FireDac. Для ADO все идентично прям на 102%
    еще по мелочам
    -ConnectionString это совсем не Database Name. Нужно читать доки. Примечание про ADO в силе. Там точно так же.
    -это конечно волшебное решение в процедуру подключения передавать параметром TLabel. Нафига ??
    -сама форма с компонентами доступа тоже не нужна. Нужен модуль данных.
    -ну и наименования форм конечно.
    Можно говорить о том, что проект исключительно мой и как хочу, так и делаю, тогда вопрос - а почему тогда он тут? И почему я должен пробираться сквозь мысли автора чтобы решить его проблему? 
    - последнее, ваш архив весит 30+ МБайт. Мой - 25 КБайт. Для чего мне все эти остальные файлы?
    CagortaModified.7z
  16. Like
    krapotkin получил реакцию от Andrey Efimov в FDConnection   
    форма нужна для отображения визуальных компонентов
    подключение и датасеты вообще ни разу не визуальные
    кроме того если датасеты еще можно положить на каждую форму/фрейм отдельно, то подключение лучше держать одно. Какой смысл для этого держать форму, там же нет взаимодействия с пользователем ??
    Не очень важное, но...
    Главной формой приложения становится первая созданная форма. А вот модуль данных можно создавать до форм. И подключение проводить тоже до. Если этого требует логика приложения.
     
  17. Like
    krapotkin получил реакцию от Евгений Корепов в Подключение из приложения под Андроид к удаленной БД сайта MySQL в С++ Builder XE   
    Тезисно. Прямое подключение разрушается, когда соединение разрывается. А в мобильной сети оно постоянно может отключаться и включаться, переключаться между WiFi и 4G. Установление подключения к БД тогда требуется каждый раз, как происходит такой разрыв. У HTTP запрос проходит разово. Запросили - ответил, или нет. Соединение не требуется. Не прошел запрос, ничего, повторим.
  18. Like
    krapotkin отреагировална Tumaso в Подключение из приложения под Андроид к удаленной БД сайта MySQL в С++ Builder XE   
    Рекомендую ознакомится с идеологией REST, ее целями и задачами.
    В целом прямое подключение к БД неправильно не только для мобильных приложений, а для десктопных тоже. Давая прямой доступ к БД для выполнения sql-запросов, вы даете злоумышленникам большие возможности по произвольному доступу к данным.
    А используя промежуточный слой в виде бэка, вы как минимум скрываете тип используемой БД, структуру таблиц.
  19. Like
    krapotkin получил реакцию от vitalik8311 в FDConnection   
    начнем с важных вещей:
    образно выражаясь, сначала вводят логин и пароль, а только потом нажимают кнопку, иначе в чем смысл логина вообще?
    у вас тут - сначала подключаемся, потом заполняем свойства. Кому они там нужны уже?
              FDConnection1.Connected := true;
              FDConnection1.Params.Pooled := false;
              FDConnection1.LoginPrompt := false;
              FDConnection1.Params.DriverID := 'MSAcc';....
    то же и с запросом. Сначала сделать запрос с пустым текстом, а текст запроса пообещать позже дослать?
              FDQuery1.Active := true;
              FDQuery1.SQL.Add('SELECT * FROM usersbase');
    логично, что сервер говорит SQL_NO_DATA. запроса-то нет.
    кроме того, если несколько раз нажать, то каждый раз к запросу будет добавляться строка SQL.Add(...)? зачем?
    параметры БД действительно нужно заполнять перед подключением, а вот тексты запросов, если они не меняются, достаточно один раз - в дизайн-тайме. и больше не трогать. Ну или хотя бы
              FDQuery1.SQL.Text := 'SELECT * FROM usersbase';
              FDQuery1.Active := true;
    Во всех этих ошибках нет никакой специфики FireDac. Для ADO все идентично прям на 102%
    еще по мелочам
    -ConnectionString это совсем не Database Name. Нужно читать доки. Примечание про ADO в силе. Там точно так же.
    -это конечно волшебное решение в процедуру подключения передавать параметром TLabel. Нафига ??
    -сама форма с компонентами доступа тоже не нужна. Нужен модуль данных.
    -ну и наименования форм конечно.
    Можно говорить о том, что проект исключительно мой и как хочу, так и делаю, тогда вопрос - а почему тогда он тут? И почему я должен пробираться сквозь мысли автора чтобы решить его проблему? 
    - последнее, ваш архив весит 30+ МБайт. Мой - 25 КБайт. Для чего мне все эти остальные файлы?
    CagortaModified.7z
  20. Like
    krapotkin получил реакцию от Legit Coder в How to display / Select only one TListViewItem from "OnItemClick" event?   
    Test.7z
  21. Like
    krapotkin получил реакцию от Legit Coder в How to display / Select only one TListViewItem from "OnItemClick" event?   
    это методы, которые нужно написать
    я старался, чтобы по названиям было понятно, что они должны делать
    если смотреть на вашу картинку, то очевидно, что список показывается только тогда, когда мы нажали на кнопку, этим должен заняться метод ShowSelectionList()
    после выбора, скорее всего, нужно будет убрать с экрана этот список, т.е. нужен еще один метод типа HideSelectionList().
    если список все время на экране, то эти методы не нужны  
     
    UpdateValueLabels() как следует из названия - отражает то, что у нас хранится в переменных FirstValue и SecondValue, в соответствующие места на экране, в первую и вторую метку
  22. Like
    krapotkin получил реакцию от gonzales в Свой APK updater. Использование Fileprovider   
    У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. 
    Автоматически возникает вопрос обновления. Если в  первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"...
    Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер.
    Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT,
    Вот то что получилось  в результате.
    Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой.
    Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing

    после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path
    файл, показанный на рисунке, создается автоматически самой делфи.

    теперь остается отгадать, какой путь реально подставится вместо "."
    Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик.
    Оказалось все проще (?)
    st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!!  (For.Unbelievably.Creative.Knowers!)
    Потом все просто. FApkUri передаем в интент и запускаем 
    итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания)
    procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь.
    Всем удачи.
    UPD.
    Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

     
     
     
     
     
  23. Like
    krapotkin получил реакцию от Legit Coder в How to display / Select only one TListViewItem from "OnItemClick" event?   
    я не знаю, откуда вы берете текст, который размещается в ListView но он же должен где-то храниться
    вот оттуда его берём в методе UpdateLabels
     
    TForm3 = class(TForm) ... SelectedList : TList<integer>; ... end; ........ procedure TForm3.FormCreate(Sender : TObject); begin   SelectedList := TList<integer>.Create; end; procedure TForm3.FormDestroy(Sender : TObject); begin   FreeAndNil(SelectedList); end; procedure TForm3.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin   if SelectedList.Count = 2 then exit;   case Selected Count of     0 : begin       SelectedList.Add(AItem.Index);       UpdateLabels();     end;     1 : begin       if SelectedList[0] <> AItem.Index then         SelectedList.Add(AItem.Index);       UpdateLabels();     end;   end; end; procedure TForm3.UpdateLabels(); begin   if SelectedList.Count > 0 then     label1.text := varIDontKnowWhereYourTextStored[ SelectedList[0] ]   else      label1.text := '';   if SelectedList.Count > 1 then     label2.text := varIDontKnowWhereYourTextStored[ SelectedList[1] ]   else      label2.text := '';  end;  
  24. Like
    krapotkin отреагировална alex25ru в Как запустить собственное приложение из другого приложения?   
    Правильный вопрос, уточню, вижу что ввел в заблуждение.
    Вот эта часть статична:
        НовВз.ИмяКласса = "com.embarcadero.firemonkey.FMXNativeActivity";
    А вот эта нет:
    НовВз.Приложение = "com.embarcadero.IntentReceiver
    Выделенное жирным, это имя моего проекта в Delphi. Игрался с Intent'ами.
    Но ко всему описанному выше нужно учитывать информацию указанную в Version Info - package и label.

  25. Like
    krapotkin получил реакцию от gonzales в Как отоловить нажатие на чекбокс в итеме?   
    Потому что текст итема тоже задан компонентом и его нужно найти и сделать ему Margin
    либо сделать то же самое - полностью забить на то что там уже есть, оставить их пустыми и сделать все компоненты свои, в коде
    и по мне так это самое быстрое и самое управляемое решение ))
×
×
  • Создать...