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

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

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

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

  • Посещение

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

    100

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

  1. Погуглил по фразе "macos vmware amd", выдало кучу решений, вот к примеру https://hackintosher.com/guides/how-to-install-macos-sierra-on-a-ryzen-pc-virtual-machine-vmware/ . Откуда информация о несовместимости проца AMD?
  2. Значит нужно: 1. Сертификат разработчика. С этим все ясно. 2. Любой телефон с 64 битной ОС. 3. Устройство с MacOS. Тут конечно вопросы есть. Машин с Интелом нет в принципе, железа куча, но везде AMD. Мне кажется проще будет купить Mac mini типа такого https://www.dns-shop.ru/product/9054c969697c3120/nettop-apple-mac-mini-mgem2rua/characteristics/ , потом продать как станет не нужен. Хватит такого комплекта на ближайшие 2-3 года? Не ожидается никаких хитрых изменений? А то Эппл новое правило выкатит и все это превратится в тыкву.
  3. Присоединяюсь к вопросу. Тоже хочу окучить и яблочные устройства. Было бы замечательно получить советы и инструкции. Особенно в плане минимальных вложений.
  4. Вот как то так: uses ......... Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ....... procedure TForm1.FormCreate(Sender: TObject); Var DownloadManager : JObject; begin DownloadManager:=SharedActivityContext.getSystemService(TJContext.JavaClass.DOWNLOAD_SERVICE); if DownloadManager <> nil then begin Используем... end; end; Вот как именно использовать - тут можно голову сломать, может кто и подскажет На java это делается вот так примерно: DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); Uri uri = Uri.parse("http://www.example.com/myfile.mp3"); DownloadManager.Request request = new DownloadManager.Request(uri); request.setTitle("My File"); request.setDescription("Downloading"); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationUri(Uri.parse("file://" + folderName + "/myfile.mp3")); downloadmanager.enqueue(request); Подозреваю что вам придется самостоятельно описать класс (интерфейс) DownloadService.
  5. http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.SysUtils.QuotedStr Возможно : "Примечание. При работе с многобайтовыми системами символов ( MBCS) вместо этого используйте AnsiQuotedStr ." ?
  6. Или в среде, меню Run, Parameters, поле Parameters - добавьте туда -cleaninstall, при запуске на устройстве будет производиться чистая установка.
  7. Ну а в тему - если это винда, то можете попробовать открыть ссылку на файл с помощью ShellExecute, если андроид, то запустить активити как тут https://stackoverflow.com/questions/49200962/delphi-10-2-how-can-i-open-a-url-in-androids-web-browser-from-my-application (вместо TJIntent.JavaClass.ACTION_VIEW можете попробовать использовать другие экшены). В ios не подскажу...
  8. Надо отвечать 42 ? https://ru.wikipedia.org/wiki/Ответ_на_главный_вопрос_жизни,_вселенной_и_всего_такого А автору топика совет - хотите получить ответ, задавайте вопросы правильно и подробно. Какая платформа? Что такое "стандартный загрузчик"? И так далее...
  9. Сейчас только увидел в тексте " и для Android", сорри. Вы кусок кода отправки/получения покажите, может кто увидит в чем проблема.
  10. Выдернул из рабочего проекта кусок, надеюсь вам поможет. Процедура SendCommand(Var ASendingData : TSendingData), в блокирующем режиме посылает текст на сервер и получает результат. unit UnitExcavatorWinTCPThread; interface uses classes, SysUtils, System.Types, System.Generics.Collections, System.Win.ScktComp, UnitExcavatorThread, UnitExcavatorTypes; type TExcavatorWinTCPThread = class(TExcavatorThread) protected FClientSocket : TClientSocket; CStream : TWinSocketStream; procedure CreateNetwork; override; procedure DestroyNetwork; override; procedure SendCommand(Var ASendingData : TSendingData); override; public end; implementation procedure TExcavatorWinTCPThread.CreateNetwork; begin FClientSocket:=TClientSocket.Create(Nil); FClientSocket.Host:=FExcavatorInstance.Host; FClientSocket.Port:=FExcavatorInstance.PortTCP; FClientSocket.ClientType:=TClientType.ctBlocking; CStream:=TWinSocketStream.Create(FClientSocket.Socket, FTimeouts.ConnectTimeout); end; procedure TExcavatorWinTCPThread.DestroyNetwork; begin if Assigned(CStream) then FreeAndNil(CStream); if Assigned(FClientSocket) then FreeAndNil(FClientSocket); end; procedure TExcavatorWinTCPThread.SendCommand(Var ASendingData : TSendingData); Var AReaded, ACount : integer; ABuffer : TBytes; ACommand, AStringBuffer : AnsiString; ACommandIdString : String; ADone : Boolean; begin ACommandIdString:='"id":' + ASendingData.CommandId.ToString; ASendingData.Error:=False; ACommand:=AnsiString(ASendingData.Value) + #10; ASendingData.Value:=''; if Not FClientSocket.Active then try FClientSocket.Open; except on E:Exception do begin ASendingData.Error:=True; ASendingData.Value:=E.Message; exit; end; end; if FClientSocket.Active then begin try // Считываем из буфера все что там есть. while CStream.WaitForData(CStream.TimeOut) do AStringBuffer:=FClientSocket.Socket.ReceiveText; except end; try FClientSocket.Socket.SendText(ACommand); except on E:Exception do begin ASendingData.Error:=True; ASendingData.Value:=E.Message; exit; end; end; try ADone:=False; ACount:=0; repeat if CStream.WaitForData(CStream.TimeOut) then ASendingData.Value:=ASendingData.Value + FClientSocket.Socket.ReceiveText; if ASendingData.Value.Contains('"id":1') then break; if ASendingData.Value.Contains(ACommandIdString) then break; Inc(ACount); if ACount > 2 then break; until ADone; except on E:Exception do begin ASendingData.Error:=True; ASendingData.Value:=E.Message; exit; end; end; end else begin ASendingData.Error:=True; ASendingData.Value:='Not connected'; end; end; end.
  11. Посмотрите в идущих в комплекте примерах: Тут \Object Pascal\Multi-Device Samples\Device Sensors and Services\App Tethering\ : MediaPlayer PhotoWall И тут \Object Pascal\RTL\Tethering\ : BDShoppingList DesktopBeaconCast DesktopCast MediaPlayer PhotoWall А в общих чертах как то так: Вы получаете на "сервере" данные ни где нибудь, а в событии procedure TForm1.TetheringAppProfile1ResourceReceived(const Sender: TObject; const AResource: TRemoteResource); Переменная AResource - все что вам нужно. Там и полученные данные AResource.Value определенного типа AResource.Value.DataType. И профиль отправителя AResource.Profile позволяющий точно его идентифицировать.
  12. Я уперся рогом и все таки смог найти решение для вас. Гугль любит разработчиков, и обычно оставляет им возможность пользоваться сервисами бесплатно. И в этот раз чутьё не подвело. Вот решение: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.JSON, System.Net.HTTPClient, System.NetEncoding; type TForm1 = class(TForm) Memo1: TMemo; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } function GoogleTranslate(const AValue : String) : String; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormShow(Sender: TObject); Var S : String; begin S:=GoogleTranslate('Hello world!'); Memo1.Lines.Add(S); end; function TForm1.GoogleTranslate(const AValue : String) : String; const ConstSourceLang = 'en'; ConstTargetLang = 'ru'; var AResponce : IHTTPResponse; FHTTPClient : THTTPClient; AAPIUrl : String; begin AAPIUrl:='https://translate.googleapis.com/translate_a/single?client=gtx&sl=' + ConstSourceLang + '&tl=' + ConstTargetLang + '&dt=t&q=' + TNetEncoding.URL.Encode(AValue); FHTTPClient:=THTTPClient.Create; FHTTPClient.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Result:='Translate Error : '; AResponce:=FHTTPClient.Get(AAPIUrl); if Not Assigned(AResponce) then begin Result:=Result + 'unknow.'; Exit; end; if AResponce.StatusCode <> 200 then begin Result:=Result + AResponce.StatusText; end; try Result:=TJSONArray(TJSONArray(TJSONArray(TJSONObject.ParseJSONValue(AResponce.ContentAsString)).Items[0]).Items[0]).Items[0].Value; except Result:=Result + 'error parse JSON.'; Exit; end; end; end. Подправил код, сделал покрасивее и убрал deprecated encode.
  13. Вот сделал аналог на THTTPClient: function TForm1.GoogleTranslate(const AValue : String) : String; const ConstGoogleUrl = 'http://translate.google.ru/translate_a/t'; var ASource: TStringList; AResponce : IHTTPResponse; FHTTPClient : THTTPClient; begin FHTTPClient:=THTTPClient.Create; FHTTPClient.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Result:='Translate Error : '; ASource:=TStringList.Create; ASource.Add('client=x'); ASource.Add('text=' + AValue); ASource.Add('hl=en'); ASource.Add('sl=en'); ASource.Add('tl=ru'); AResponce:=FHTTPClient.Post(ConstGoogleUrl, ASource); if Not Assigned(AResponce) then begin Result:=Result + 'unknow.'; Exit; end; if AResponce.StatusCode <> 200 then begin Result:=Result + AResponce.StatusText; end; Result:=AResponce.ContentAsString; end; Получаю вполне очевидный ответ: Конечно подбор HTTP Headers и других параметров может и обманет не надолго сервис, но на это надеяться не стоит. В Гугле работают отнюдь не дураки, и вряд ли они создавали свой сервис перевода (с отличным API кстати) просто так. Сервис платный (20 долларов США за 1 000 000 символов , но с пробным бесплатным периодом. Если вы хотите 100% работающее решение, то лучше воспользоваться им https://translate.google.com/intl/ru/about/forbusiness.html
  14. В это операционке уже есть встроенный FTP сервер. Кривой, но работать будет. Включить его и настроить очень просто.
  15. Вот, по моему мнению, самый просто и быстрый способ: Устанавливаете на сервере FTP сервер. К примеру SlimFTPd (http://www.whitsoftdev.com/slimftpd/), его можно запустить как сервис. Не забываете настроить папку, пользователя (с паролем) и остальное. Там все просто. В своем приложении отправка файла на FTP сервер займет у вас несколько строчек: IdFTP:=TIdFTP.Create; IdFTP.Host:=Host; IdFTP.Username:=ALogin; IdFTP.Password:=APassword; IdFTP.Passive:=True; IdFTP.TransferType:=ftBinary; IdFTP.ReadTimeout:=ConstFTPTimeout; IdFTP.TransferTimeout:=ConstFTPTimeout; try IdFTP.Connect; except on E : Exception do begin Error:=True; ErrorMessage:=E.Message; end; end; AFilePathLocal:='Путь к файлу который хотите отправить'; AFilePathRemote:='/Download/'; if TFile.Exists(AFilePathLocal) then try IdFTP.Put(AFilePathLocal, AFilePathRemote); except on E : Exception do begin Error:=True; ErrorMessage:=E.Message; end; end; IdFTP.Disconnect; IdFTP.Free; Вот как то так. P.S. Не верно написал путь для отправки. Исправил AFilePathRemote:='ftp://192.168.0.150/Download/'; на AFilePathRemote:='/Download/';
  16. Давайте определимся что из себя представляет ваш "Серверный ПК". Операционная система? Если у вас к нему доступ? Можете ли вы управлять им по своему усмотрению?
  17. Добавлю что есть десяток других, менее затратных способов выполнить вашу задачу. Начиная от загрузки по HTTP или FTP, заканчивая использованием облачных хранилищ.
  18. В Андроид нет встроенных средств работы по протоколу NetBIOS/NetBEUI. Вам придется реализовать его самостоятельно с нуля.
  19. Я думаю тут вы самый опытный по вопросу UWP-приложений ? Так что маловероятно кто то поможет. Может стоит задать этот вопрос на англоязычном форуме Эмбаркадеро? Мне эта тема тоже очень интересна, даже купил у Микрософта сертификат разработчика, но руки не доходят заняться. Очень бы хотелось от вас увидеть статью по размещению приложений в Microsoft Store. С пошаговыми инструкциями и скриншотами. Заранее благодарю!
  20. Заметил что у подсветки особенно активно съезжает крыша если в листинге есть вызовы анонимных процедур. Там вообще все в гирлянду превращается. А компилятор при этом говорит что все хорошо.
  21. Вот может кто из гуру сделает дельфи обертку для кода https://developer.android.com/reference/android/app/Activity#dispatchKeyEvent(android.view.KeyEvent) У меня ума не хватает.
  22. Создатели FMX решили что таких кнопок не бывает. Поэтому перехватить их не просто. Я когда то начинал разбираться, но плюнул. Попробуйте запустить отладку на устройстве и пошагово может найдете где эти кнопки режутся в недрах FMX. А еще можно читать поступающие данные непосредственно с устройства ввода, нужно только найти нужное, они в папке /dev/*
  23. Тогда посмотрите какие разрешения вы устанавливаете приложению (Your app uses hardware features (such as a touchscreen or camera) that are not available on TV) . Может вы требуете что то, что нет физически на приставке.
  24. unit SharedGlobals; interface const ConstMyConstant = 30; type TMyType = record AValue : String; end; var MyVariable: Boolean=False; function MyFunction(AValue : String) : String; implementation function MyFunction(AValue : String) : String; begin end; end. И использование этого: unit Unit1; interface uses SharedGlobals, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } АMyType : TMyType; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin АMyType.AValue:=ConstMyConstant; MyFunction(АMyType.AValue); end; end.
×
×
  • Создать...