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

Лидеры


Популярный контент

Показан контент с высокой репутацией за 24.01.2020 во всех областях

  1. 3 балла
    slav_z

    Срабатывает OnClick на ListBox при скроллинге

    в OnClick элемента списка сделайте проверку: procedure TForm1.ListBoxItemClick(Sender: TObject); begin if not ListBox.AniCalculations.Moved then DoItemClick; end;
  2. 3 балла
    krapotkin

    Не подключается Huawei

    Короче, действуем примерно так. Я надеюсь, что базовые действия - скачать google latest adb driver - мы уже провели, но наш No- или Brand- name телефон недоступен Тогда 1) идем в диспетчер устройств, находим там наше невстающее устройство, кликаем дважды, и на закладке Сведения выбираем свойство ИД оборудования. Копируем себе что-то типа 2) идем к файлам того самого драйвера, открываем android_winusb.inf находим разделы [Google.NTx86] и [Google.NTamd64] и вписываем туда, прямо в оба ;galaxy tab a 2019 %SingleAdbInterface% = USB_Install, USB\VID_04E8&PID_6866 %CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_6866&MI_01 3) делаем обновить драйвер, выбираем вариант Вручную, и указываем тот модифицированный файл если не берет автоматом, то "Выбрать из списка уже установленных..." --> "Есть диск" --> "Да, мне пофиг что он не подписан" 4) The End
  3. 3 балла
    Приложение для получения информации расчётным путём об углах: - вертикальной плоскости; - в горизонтальной плоскости; - объёмный; - эквивалентный в шарнирах карданных валов на основе сделанных замеров на собранном автобусе, троллейбусе, грузовике. Может пригодиться работникам сервисных служб, лицам эксплуатирующим грузовую или пассажирскую автомобильные техники, лицам неконструкторских служб. Особенно в случае нахождения в месте недоступном к интернету и компьютеру. Работает на устройствах под OS Android. Существует и более расширеная версия для OS Windows. Пожалуйста, с предложениямии и пожеланиями обращайтесь к разработчику: Кирееву Олегу по тел. +375 29 676 13 84 или пишите на kireevoleg1966@gmail.com. Буду рад Вашему любому отзыву. С Уважением. UgolKardZamer_v4.rar
  4. 2 балла
    Может кому пригодится. вот решение. procedure TfrmSendEmail.SendEmail(); {$IF DEFINED(ANDROID)} var lIntent: JIntent; lJRecipient: TJavaObjectArray<JString>; lURI: Jnet_Uri; lJFile: JFile; lFileName: string; lFilePath: string; {$ENDIF} begin {$IF DEFINED(ANDROID)} lJRecipient:= TJavaObjectArray<JString>.Create(1); lJRecipient.Items[0]:= StringToJString(eEmail.Text); lFileName:= AttachFileName; lFilePath:= System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetSharedDownloadsPath, lFileName); lIntent:= TJIntent.Create; lIntent.setType(StringToJString('application/excel')); lIntent.setAction(TJIntent.JavaClass.ACTION_SEND); lIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); lIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, lJRecipient); lIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(eSubject.Text)); lIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(mEmailMessage.Text)); lJFile:= TJFile.JavaClass.init(StringToJString(lFilePath)); lURI:= TAndroidHelper.JFileToJURI(lJFile); lIntent.setData(lURI); lIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((lURI as ILocalObject).GetObjectID)); TAndroidHelper.Activity.startActivity(lIntent); {$ENDIF}
  5. 2 балла
    Рабочий код: procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; uri : Jnet_Uri; bitmap: JBitmap; surface: TBitmapSurface; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if (ResultCode = TJActivity.JavaClass.RESULT_OK) and Assigned(Intent) then begin try uri:=Intent.getData; bitmap := TJImages_Media.JavaClass.getBitmap(SharedActivity.getContentResolver, uri); surface := TBitmapsurface.Create; JBitMapToSurface(bitmap,surface); Image1.Bitmap.Assign(surface); finally surface.Free; end; end;
  6. 2 балла
    OnePeople

    не работает в Андроид TTabTransition.Slide

    SetActiveTabWithTransitionAsync
  7. 1 балл
    Slym

    NetHTTPClient Compression?

    Это "не стандартное" поведение, обычно клиент не сжимает, но RFC это не запрещает... но проверь поймет ли сервер твой запрос я использую deflate, gzip это тотже deflate столько с заголовками и CRC и заморочек в связи с этим больше... function CompressData(const Data:TBytes):TBytes; var Source, Dest:TBytesStream; begin Dest:= TBytesStream.Create; try Source:=TBytesStream.Create(Data); try ZCompressStream(Source, Dest, zcMax); finally Source.Free; end; Dest.Size:=Dest.Size; result:=Dest.Bytes; finally Dest.Free; end; end; //AHTUNG! Non standart Request Header (with standart Name)! If truble - Rename то X-Content-Encoding var Params:TBytes; if length(Params)>MinCompressionSize then begin Params:=CompressData(Params); NetHeaders.Value['Content-Encoding']:='deflate'; end;
  8. 1 балл
    Alialioglu2016

    Application Loader

    Загрузчик приложений больше не используется на новой Mac OS X. Для этого вы должны использовать приложение Transporter. Transporter
  9. 1 балл
    slav_z

    Срабатывает OnClick на ListBox при скроллинге

    OnTap лучше не используйте, я бы сделал на обычный OnClick... перед вызовом действий, связанных с элементами списка (ваши ShowMessage 1, ShowMessage 2 ), просто проверьте "а не прокручивается ли сейчас listbox (scrollbox)" с помощью ListBox.AniCalculations.Moved...
  10. 1 балл
    Ответ положительный, но без танцев с бубном, как я уже писал, не обошлось. Приложение писал для себя, теперь живет у меня на iPhone 6s с iOS 13.3.
  11. 1 балл
    POV

    [IOS]Эфект сердца

    Ну эффект линзы примени. и его параметры меняй. Чтобы с дисторсией было.
  12. 1 балл
    krapotkin

    [IOS]Эфект сердца

    http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Filter.Effects.TAffineTransformEffect не оно?
  13. 1 балл
    krapotkin

    Material design shadow

    Столкнулся с необходимостью генерировать тень в соответствии с material design guide дополнительное условие - тень нужна не привязанная к контролу, т.е. просто прицепить TShadowEffect нельзя интернет сказал мне, что одной тени недостаточно, стал ставить эксперименты с двумя. эмпирически подобрал алгоритм и параметры, которые дают довольно близкий к гайду результат 1. https://material.io/design/environment/light-shadows.html#shadows 2. мой скриншот положил сюда https://bitbucket.org/vkrapotkin/vkshadowgenerator Механизм работы понятен из приложенного примера. В принципе можно применять те же параметры и к обычным TShadowEffect
  14. 1 балл
    krapotkin

    TBitmapData

    Считалось, что до RIO TBitmap НЕ потокобезопасен. В RIO рапортовали, что справились с этим. Не помню, проверял кто или нет Но TBitmapSurface был потокобезопасен уже тогда. Возможно, стоит готовить данные там, а потом просто отдавать в Bitmap https://stackoverflow.com/questions/37602538/delphi-tbitmap-to-string-via-tbitmapsurface-and-back-to-tbitmap https://stackoverflow.com/questions/51523321/how-to-draw-fmx-surface-tbitmapsurface-on-fmx-graphics-tbitmap/51526855
  15. 1 балл
    slav_z

    Как добавить jar файл в проект

    Теперь после сборки ваш класс java будет добавлен в файл classes.dex (да! файл classes.dex ниоткуда не копируется, он собирается из файлов которые указаны в этом списке (см.картинку) поэтому его можно легко дополнить собственными классами java или убрать ненужные системные). Остается вопрос компиляции файла исходников java в jar-файл, но тут уж каждый сам за себя...
  16. 1 балл
    Есть такая библиотека https://github.com/amarildolacerda/KernowSoftwareFMX То, что на скриншотах - это компонент ksVirtualListView. Его работа показана в примере https://github.com/amarildolacerda/KernowSoftwareFMX/tree/master/Samples/Action Buttons Но мне не понравилось как он работает. Там ЭкшнБаттоны не тянутся за свайпом, а сами появляются поняв, что свайп сделан. На IOS такое поведение не очень ожидаемо. Но в целом работает очень даже миленько.
  17. 1 балл
    Попробуйте так title = dm->qExpContent->FieldByName("title")->AsWideString; introtext = dm->qExpContent->FieldByName("introtext")->AsWideString; fulltext = dm->qExpContent->FieldByName("fulltext")->AsWideString;
  18. 1 балл
    Коллеги, я опубликовал на сайте FGX свое приложение. Можете «щупать». https://forum.fgx-native.com/topic/76-медицинская-программа-для-оценки-взаимодействия-препаратов/
  19. 1 балл
    Евгений Корепов

    Работа с камерой - Rad 10.3

    Вот кусок кода из боевого приложения, достаточно разрешения на доступ к камере, больше никаких разрешений не надо. Надеюсь вам поможет. FScanCamera : TCameraComponent; FScanManager - не обращайте внимания, это распознавание QR кодов. ImageCamera : TImage; - картинка на форме где отображаются кадры с камеры Работа начинается с ScanStart() {$IFDEF MOBILE} // *************************************************************** // ****** Сканирование QR кода ****** // *************************************************************** procedure TFormMain.ScanStart(); var AppEventSvc: IFMXApplicationEventService; APermissionCamera : String; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(AppEventSvc)) then AppEventSvc.SetApplicationEventHandler(AppEvent); FScanFrameTake := 0; CButtonScan.Text:='Отменить сканирование'; {$IFDEF IOS} ScanStarting(); {$ENDIF IOS} {$IFDEF ANDROID} APermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA); PermissionsService.RequestPermissions([APermissionCamera], CameraPermissionRequestResult, ExplainReason); {$ENDIF ANDROID} end; procedure TFormMain.ScanStop(); begin if Assigned(FScanCamera) then begin if FScanCamera.Active then FScanCamera.Active:=False; FScanCamera.Free; end; { if Assigned(FScanManager) then begin FScanManager.Free; end; } FScanInProgress := false; LayoutCamera.Height:=0; CButtonScan.Text:='Сканировать QR-код'; end; {$IFDEF ANDROID} procedure TFormMain.CameraPermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); begin if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then begin ScanStarting(); end else TDialogService.ShowMessage('Сканирование QR-кода не возможно, требуемое разрешение не было дано') end; procedure TFormMain.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); begin TDialogService.ShowMessage('Приложению нужен доступ к камере для сканирования QR-кода ...', procedure(const AResult: TModalResult) begin APostRationaleProc; end) end; {$ENDIF ANDROID} procedure TFormMain.ScanStarting(); begin FScanInProgress := false; if Not Assigned(FScanManager) then FScanManager:= TScanManager.Create(TBarcodeFormat.QR_CODE, nil); if Not Assigned(FScanCamera) then FScanCamera:=TCameraComponent.Create(Self); FScanCamera.OnSampleBufferReady:=ScanCameraSampleBufferReady; FScanCamera.Quality := FMX.Media.TVideoCaptureQuality.MediumQuality; FScanCamera.Active := false; FScanCamera.Kind := FMX.Media.TCameraKind.BackCamera; FScanCamera.FocusMode := FMX.Media.TFocusMode.ContinuousAutoFocus; FScanCamera.Active := True; LayoutCamera.Height:=LayoutCamera.Width; end; { procedure TFormMain.btnStopCameraClick(Sender: TObject); begin end; } procedure TFormMain.ScanCameraSampleBufferReady(Sender: TObject; const ATime: TMediaTime); begin TThread.Synchronize(TThread.CurrentThread, GetImageCamera); end; procedure TFormMain.GetImageCamera; var scanBitmap: TBitmap; ReadResult: TReadResult; begin FScanCamera.SampleBufferToBitmap(ImageCamera.Bitmap, True); if (FScanInProgress) then exit; { This code will take every 4 frame. } Inc(FScanFrameTake); if (FScanFrameTake mod 4 <> 0) then exit; scanBitmap := TBitmap.Create(); scanBitmap.Assign(ImageCamera.Bitmap); ReadResult := nil; // There is bug in Delphi Berlin 10.1 update 2 which causes the TTask and // the TThread.Synchronize to cause exceptions. // See: https://quality.embarcadero.com/browse/RSP-16377?jql=project%20%3D%20RSP%20AND%20issuetype%20%3D%20Bug%20AND%20affectedVersion%20%3D%20%2210.1%20Berlin%20Update%202%22%20AND%20status%20%3D%20Open%20ORDER%20BY%20priority%20DESC TTask.Run( procedure begin try FScanInProgress := True; try ReadResult := FScanManager.Scan(scanBitmap); except on E: Exception do begin TThread.Synchronize(nil, procedure begin LabelAPIKey.Text := 'Ключ доступа : ' + E.Message; end); exit; end; end; TThread.Synchronize(nil, procedure begin if (ReadResult <> nil) then begin if ProcessingAPIKeyHex(ReadResult.Text) then begin ScanStop(); end; end; end); finally ReadResult.Free; scanBitmap.Free; FScanInProgress := false; end; end); end; { Make sure the camera is released if you're going away. } function TFormMain.AppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin case AAppEvent of TApplicationEvent.WillBecomeInactive, TApplicationEvent.EnteredBackground, TApplicationEvent.WillTerminate: if Assigned(FScanCamera) then FScanCamera.Active := false; end; Result:=True; end;
  20. 1 балл
    sinuke

    [Android] Прозрачный StatusBar в RAD 10.3 Rio

    Привет Вчера была выпущена финальная версия RAD Studio 10.3 Rio, в которой много нововведений для Андройд. Но вот про статусбар снова "забыли". Хотя не совсем, добавили файлик styles-v21.xml, который превносит новую материальную тему на устройствах под управлением Android 5.0 и выше вместо устаревшей Holo. Но все равно свойство формы SystemStatusBar так и не реализовали. Поэтому при запуске статус бар будет окрашен в унылый серый цвет (см. скриншот). Для того, чтобы сделать статусбар прозрачным и поместить под него содержимое формы, то достаточно сделать несколько несложных шагов: 1. Убираем из деплоймента (Project -> Deployment) файл styles-v21.xml (можно просто снять галочку рядом с именем файла) 2. Добавить в деплоймент проекта новый файл styles-v21.xml (styles-v21.zip) и прописать ему путь res\values-v21\ 3. В результате получится следующий вид P.S. В новом файле по сравнению со стандартным добавилась строчка <item name="android:windowTranslucentStatus">true</item>, которая и отвечает за прозрачный статусбар P.P.S. Чтобы определять размер статус бара, все также можно воспользоваться решеним ZuBy - http://blog.rzaripov.kz/2016/12/android-ios.html P.P.P.S. Тестовый проектик - StatusBar.zip
  21. 1 балл
    gonzales

    Пуши в IOS

    Так а в чем конкретно проблема? В коде есть OnReceiveNotificationEvent - вызывается когда придет пуш. Соответственно вместо ShowMessage(aText); пишите вызов новой формы. Если она уже создана, то просто FormB.visible:=true;, если не создана, то вызов конструктора, (примерно так FormB:=TForm.Create;, соответственно конструктор должен быть описан)
  22. 1 балл
    S_007

    Предупреждение MessageDlg

    Получилось так Добавить в uses FMX.DialogService TDialogService.MessageDialog('Уверены?', TMsgDlgType.mtConfirmation, mbYesNo, TMsgDlgBtn.mbNo, 0, procedure(const AResult: TModalResult) begin if (AResult = mrYes) then begin // end; end); Max еще раз Спасибо!
  23. 1 балл
    rareMax

    Предупреждение MessageDlg

    FMX.Dialogs procedure ShowMsgYesNo; begin { Show a multiple-button alert that triggers different code blocks according to your input } TDialogService.MessageDialog('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], System.UITypes.TMsgDlgBtn.mbYes, 0, // Use an anonymous method to make sure the acknowledgment appears as expected. procedure(const AResult: TModalResult) begin case AResult of { Detect which button was pushed and show a different message } mrYES: ShowMessage('You chose Yes'); mrNo: ShowMessage('You chose No'); end; end); end;
  24. 1 балл
    Равиль Зарипов (ZuBy)

    CloudFlare [IPV6]

    Доброго времени суток! Для тех, кто не может опубликовать приложение в AppStore Если приложение посылает запросы на сервер и у Вас на сервере нет поддержки IPV6, Apple не опубликует приложение! Что нужно для успешной публикации: Получить у Вашего хостера IPV6 адрес (примерно такой вид имеет ipv6 адрес) 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d Если нет root-доступа к серверу, то можно воспользоваться сервисом https://cloudflare.com Если есть root-доступ, то ознакомьтесь с инструкцией Мы рассмотрим самый частый вариант, без root-доступа, через сервис CloudFlare Не буду расписывать регистрацию, там все просто Нажимаем +Add Site, вписываем адрес Вашего сайта (домен), как только система проверит конфигурацию Вашего текущего DNS, она предложит изменить NS-сервера В кабинете хостера Вам нужно будет сменить NS-сервара, на те которые выдал CloudFlare В CloudFlare -> раздел DNS Нужно будет дописать запись типа AAAA с Вашим ipv6 адресом Все поддомены которые есть также прописать через запись типа CNAME Чтобы работало FTP нужно отключить HTTP Proxy (CDN) Теперь FTP протокол будет доступен по IPv4, не по домену Ждём обновления DNS и проверяем правильность конфигурации Результат примерно такой должен быть Что нужно сделать в Delphi / C++: Выкидываем TidHTTP (Indy) и переписываем на TNetHTTPClient Приложу пример запроса и обработки ответов, учтен баг с получением контента на IOS TmyAPI.zip или https://github.com/rzaripov1990/FMX.HTTP.Request
  25. 1 балл
    Дмитрий Ш.

    [Android] Шифрование

    в дополнение преидущего поста, нашел бесплатное решение для Delphi у китайских коллег QDAC3 uses qaes, NetEncoding; procedure TForm1.InitEncrypt(var AES: TQAES); var AKeyType: TQAESKeyType; const AInitVector: TQAESBuffer = (49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 65, 66, 67, 68, 69, 70); // 1234567890ABCDEF begin AKeyType := kt128; AES.AsCBC(AInitVector, 'HJORNYCZJXJBUGOA', AKeyType); end; procedure TForm1.DecryptClick(Sender: TObject); var AES: TQAES; ABytes: TBytes; begin InitEncrypt(AES); MemoText.Lines.Clear; MemoText.Lines.Add(AES.Decrypt(TNetEncoding.Base64.DecodeStringToBytes(MemoQAES.Lines.Text))); end; procedure TForm1.EncryptClick(Sender: TObject); var AES: TQAES; ABytes: TBytes; begin InitEncrypt(AES); AES.Encrypt(Trim(MemoText.Lines.Text), ABytes); MemoQAES.Lines.Clear; MemoQAES.Lines.Add(TNetEncoding.Base64.EncodeBytesToString(ABytes)); end; проверка в GoLang и PHP работает, главное использовать вектор один
  26. 1 балл
    Дмитрий Ш.

    [Android] Шифрование

    Удалось зашифровать и дешифровать текст в трех ЯП Delphi, PHP, GoLang PHP. Используется phpseclib v1.0.7 <?php // phpseclib 1.0.7 // http://phpseclib.sourceforge.net set_include_path('phpseclib'); include('Crypt/AES.php'); $my_key = 'HJORNYCZJXJBUGOA'; $my_iv = '1234567890ABCDEF'; $text = 'Проверка UTF8 текста'; $cipher = new Crypt_AES(); // CRYPT_AES_MODE_CBC $cipher->setKeyLength(128); $cipher->setKey($my_key); $cipher->setIV($my_iv); echo base64_encode($cipher->encrypt($text)).PHP_EOL; Delphi. Использую TMS Cryptography Pack uses CryptBase, AESObj, MiscObj; function AesEncryption:String; var AES: TAESEncryption; begin AES := TAESEncryption.Create(nil); try AES.AType := atCBC; AES.KeyLength := kl128; AES.OutputFormat := base64; AES.Key := 'HJORNYCZJXJBUGOA'; AES.IVMode := AESObj.userdefined; AES.IV := '1234567890ABCDEF'; result := AES.Encrypt('Проверка UTF8 текста'); finally AES.Free; end; end; GoLang. Все родное. Запустить в песочнице package main import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) func PKCS5Padding(src []byte, blockSize int) []byte { padding := blockSize - len(src)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(src, padtext...) } func PKCS5UnPadding(src []byte) []byte { length := len(src) unpadding := int(src[length-1]) return src[:(length - unpadding)] } func AesEncryption(key, iv, plainText []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData := PKCS5Padding(plainText, blockSize) blockMode := cipher.NewCBCEncrypter(block, iv) cryted := make([]byte, len(origData)) blockMode.CryptBlocks(cryted, origData) return cryted, nil } func AesDecryption(key, iv, cipherText []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockMode := cipher.NewCBCDecrypter(block, iv) origData := make([]byte, len(cipherText)) blockMode.CryptBlocks(origData, cipherText) origData = PKCS5UnPadding(origData) return origData, nil } func main() { originalText := "Проверка UTF8 текста" fmt.Println(originalText) mytext := []byte(originalText) key := []byte("HJORNYCZJXJBUGOA") iv := []byte("1234567890ABCDEF") cryptoText, err := AesEncryption(key, iv, mytext) if err != nil { fmt.Println(err) } fmt.Println(base64.StdEncoding.EncodeToString(cryptoText)) decryptedText, _ := AesDecryption(key, iv, cryptoText) fmt.Println(string(decryptedText)) } К сожалению бесплатной либы для Delphi, чтоб работало в WIN и Android не нашел.
  27. 1 балл
    Alex7wrt

    9-Patch PNG FMX Generator

    Сделал небольшую программу-генератор 9-patch заставок. Достаточно выбрать цвет фона, логотип и его видимый размер, и программа сгенерирует 9-patch для всех необходимых в FMX размеров. Примеры Рисунок: Полученные 9-Patch png: Рисунок: Полученные 9-Patch png: Исходники: 9Patch Generator.zip
  28. 1 балл
    Ra72

    Срабатывает OnClick на ListBox при скроллинге

    Помогло, только для срабатывания OnTap пришлось на Item-ах установить HitTest=true. Думал скроллинг не будет работать, но нет, - работает. Выделение элемента только не работает, но оно мне не нужно.
  29. 1 балл
    FAN

    Amazon и Delphi

    Видео - Amazon Web Services Programming Статья: Один год бесплатного облачного хостинга https://klen.github.io/aws.html
  30. 1 балл
    Ссылка: http://yaroslavbrovin.ru/category/fmx_ru/graphics_ru/ Автор: Ярослав Бровин Статья рассказывает о том, как сделать скриншот любого контрола FireMonkey. Так же немного расскрывает общий процесс отрисовки компонентов.
  31. 1 балл
    спасибо оперативную помощь я только начал изучать среду разработки ))
  32. 1 балл
    Brovin Yaroslav

    Включение своих файлов в приложение

    Добрый вечер, Тут есть два способа: Работа с Deployment менеджером. Он довольно подробно описан на Embarcadero Doc Wiki: http://docwiki.embarcadero.com/RADStudio/XE5/en/Deployment_Manager Работа через менеджер ресурсов и их получение через ResourceStream. Этот способ описал MyDelphiPw в сообщении выше тут. 1. Deployment Manager Специальная настройка проекта, которая позволяет указать, какие файлы нужно включить в состав пакета (Андроид) или бандла (iOS). Суть его работы простая, вы указываете какие файлы с вашего компьютера нужно перенести на устройство (в какое место). А далее работаете с ними из приложения так, как при обычной работе с файлами под Windows. На мобильных платформах нужно учесть специфику возможных местоположений файла. Пакет/Бандл (приложение) не допускает изменения внутренних файлов, потому что подписывается сертификатом. Поэтому теоретически при изменении файлов приложения, вы нарушаете целостность подписи. Именно по этому файлы внутри пакета/бандла доступны только на ЧТЕНИЕ. Однако, мобильные платформы предлагают широкий круг специальных мест для хранения (временные папки, песочницы, документы, карточка памяти и тд) изменяемых файлов (например файл локальной базы данных, или настройки в ini файле и тд). Описание всех вариантов местоположений с описанием путей есть в записе TPath (RTL): http://docwiki.embarcadero.com/RADStudio/XE5/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms. Общие действия для использования менеджера развертывания такие: 1. Открываем менеджер развертывания: Системное Меню -> Project -> Deployment. 2. Выбираем в верхнем выпадающем меню платформу и конфигурацию сборки. 3. Нажимаем кнопку добавить файл и выбираем нужный файл. 4. Указываем местоположение файла, куда он должен поместиться после развертывания приложения на устройстве. Тут есть особенность, если файл нужен только на чтение, то пути менять не надо. Если возможна ситуация, когда файл может быт изменен, то файл нужно поместить под iOS в Startup\Documents\ (регистр важен) Под Андроид в assets\internal (регистр важен) - для внутреннего доступа из пакета приложения или assets - для внешнего доступа 5. Получаем пути к расположению файлов: Под iOS: TPath.Combine(TPath.GetDocumentsPath, 'filename') Под Андроид: TPath.Combine(TPath.GetDocumentsPath, 'filename') { Внутренний доступ} TPath.Combine(TPath.GetSharedDocumentsPath, 'filename') { Внешний доступ } Полезные ссылки Подробное руководство по добавлению файлов для iOS: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_iOS_App#Loading_and_Deploying_Files Подробное руководство по добавлению файлов для Android: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App#Loading_and_Deploying_Files
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...