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

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

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

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

  • Посещение

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

    80

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

  1. И сделайте лучше как я предложил - отдельно преобразование класса, отдельно получение данных. Тут invalid class type cast скорее ошибка TListViewItem (ListView1.Items.Item), а не AsCurrency. Вы никак не ускоряете код записывая его одной строкой, но ухудшаете читабельность и усложняете поиск ошибок.
  2. Да, последняя строчка моего сообщения как раз об этом:
  3. Все тоже самое что и VLC, только чуток по другому: procedure TForm1.FillListView; var AItem : TListViewItem; begin AItem :=Listview.Items.Add; AItem.Data['Text1']:='Яблоки';//товар AItem.Data['Cost']:=100;//цена AItem :=Listview.Items.Add; AItem.Data['Text1']:='Груши';//товар AItem.Data['Cost']:=120;//цена AItem :=Listview.Items.Add; AItem.Data['Text1']:='Дыни';//товар AItem.Data['Cost']:=80;//ценаend; end; procedure TForm1.ProcessingListView; var I : Integer; AItem : TListViewItem; ASum : Currency; begin ASum:=0; for I := 0 to ListView.Items.Count - 1 do begin AItem:=(ListView.Items.Item[I] as TListViewItem); ASum:=ASum + AItem.Data['Cost'].AsCurrency; end; Label1.Text:=CurrToStr(ASum); end; Обратите внимание - цену присваиваем как число, а не как строку (не за чем лишние преобразования делать) AItem.Data['Cost']:=120;//цена Вторую процедуру можно было без AItem : TListViewItem; сделать, но для наглядности я сделал именно так.
  4. На будущее - при создании темы указывайте все исходные данные (как минимум вашу версию среды), что бы люди не давали вам советы, а потом уже узнали советы для какой версии среды они вам нужны. Я поставил Берлин и попробовал - ничего не получилось, результат такой же как у вас. Разбираться времени нет. Вот вам варианты: 1. Постарайтесь избавится от http и перейти на https. В наше время почти не возможно найти сайт http, даже самые отсталые госслужбы перешли на https на своих порталах. Если это ваш сервер, то я могу проконсультировать по способам перевода его на https. 2. Перейдите на Delphi 10.3.2. 3. Сделайте на каком нибудь другом сервере прокладку между запросами приложения по https и запросами к вашему серверу по http.
  5. Хм. Вот тут не подскажу. 10.1 лениво ставить. Закиньте суда свой AndroidManifest.template.xml (уже отредактированный). И кстати, попробуйте прогнать его онлайн валидатором xml
  6. Я разобрался в чем дело: Вместо TMapAccess.Write используйте TMapAccess.ReadWrite. TMapAccess.Write по какой то причине затирает если не все, то некоторые последние изменения канваса. В доке http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Graphics.TBitmap.Map не нашел упоминания о таком поведении.
  7. Вы где то ошиблись. Или в левой кодировке сохранили файл, или еще что. На тестовом проекте добавил - все отлично собралось. Вот мой AndroidManifest.template.xml <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:resizeableActivity="false" <!-- Вот сюда я добавил строчку --> android:usesCleartextTraffic="true"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  8. К сожалению начиная с Токио, Эмбаркадера почти полностью поломала TBitmap. Его поведение стало неадекватным. Вместо сохранения можете делать var BitmapSurface : TBitmapSurface; ... BitmapSurface:=TBitmapSurface.Create; BitmapSurface.Assign(Image1.Bitmap); BitmapSurface.Free; Эта манипуляция в процедуре сохранения, как раз и помогает от затирания канваса. Почему это работает я не понял. Не забывайте так же проверять удалось ли заблокировать канвас. Вот я накидал пример: procedure TForm1.Button1Click(Sender: TObject); var Bitmap : Tbitmap; BitmapData : TBitmapData; I: integer; J: integer; Distance: integer; Surf: TBitmapSurface; begin Bitmap := Tbitmap.Create; Bitmap.CreateFromFile('D:\2012643.jpg'); if Bitmap.Canvas.BeginScene then try Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Blue; Bitmap.Canvas.DrawEllipse(TRectF.Create(10, 10, 20, 20), 1); finally Bitmap.Canvas.EndScene; end; Surf:=TBitmapSurface.Create; Surf.Assign(Bitmap); Surf.Free; if Bitmap.Map(TMapAccess.Write, BitmapData) then try Distance:=10; for I := 0 to Round(BitmapData.Width / Distance) - 1 do for J := 0 to Bitmap.Height - 1 do begin begin AlphaColorToPixel(TAlphaColorRec.Red, @PAlphaColorArray(BitmapData.Data) [J * (BitmapData.Pitch div PixelFormatBytes[Bitmap.PixelFormat]) + Distance * I], Bitmap.PixelFormat); end; end; finally Bitmap.Unmap(BitmapData); end; Image1.Bitmap.Assign(Bitmap); end;
  9. Вот тут рецепт, в манифест добавьте поля, https://stackoverflow.com/questions/51902629/how-to-allow-all-network-connection-types-http-and-https-in-android-9-pie
  10. Возможно вы отправляете запрос на http вместо https ? Запросы без шифрования теперь запрещены по умолчанию. Но это можно обойти - тут в нескольких недавних темах это обсуждалось.
  11. Вам удалось решить проблему для камеры? Перелопатил весь интернет, но похоже Эмба не озаботилась этим вопросом. Пока присобачил костыль из говна и палок - в AppEvent определяю что приложение стало не активным TApplicationEvent.WillBecomeInactive, значит вылез диалог спрашивания разрешений, После этого по событию TApplicationEvent.BecameActive (диалог завершен), проверяю что приходит от камеры в FCamera.OnSampleBufferReady - если черный-черный ничего, то можно подумать что разрешение не было дано )))))))) От этого костыля у меня кровь из глаз....
  12. На ваш вопрос я не могу дать ответа. Но зачем вам использовать OkHttp? Может достаточно стандартных возможностей?
  13. Ответил мне автор JVEsuite, дай бог ему здоровья! Эпл успешно прожевал приложение и загрузил сборку.
  14. "А.Ван" это что? Трудно понимать ход мыслей человека коверкающего не сложные слова. Видимо имеется ввиду Android One? Я вас разочарую - получением рута и удалением софта от производителя вы не получите чистый андроид. Вы получите все тот же андроид который установил (и возможно неким образом модифицировал) производитель устройства. Ну и конечно не будет никаких обновлений версий и ежемесячных обновлений безопасности. Не знаю что у вас за проблемы с уведомлениями и разрешениями на рутованных и превращенных в "А.Ван" устройствах. На Android One уведомления отлично работаю, разрешения работают согласно документации. Почему вы считаете что я нахваливаю Android One? Я всего лишь рекомендую. И откуда у вас сведения что телефон с Android One "не сможет"? Судя по вашей ненависти к Xiaomi и Android One, вы никогда не пробовали ни то, ни другое. Откуда тогда этот бесценный опыт? Громкие, безапелляционные заявления признак небольшого ума... Из всего зоопарка моих устройств, Mi A1 служит мне дольше всех, третий год. С ним я получил бесценный опыт попробовав 7, 8 и теперь уже 9 андроид. Видите, мое заявление "не один год" основывается на личном продолжительном опыте, а не на эмоциях и ненависти к чему либо. И не смешите про "симметричный ответ" На мою короткую, обоснованную и не навязчивую рекомендацию автору топика, вы расписали тут целую теорию заговора, целью которой видимо является уничтожение человечества. P.S. Кстати к седьмому классу мы успешно подготовились. Школьная форма для дочери куплена. Тетради, ручки, карандаши и линейки тоже. Удивительно как быстро растут дети, только вроде в первый класс пошла, а тут раз и уже седьмой на носу.
  15. При публикации приложения iOS получаю ошибку при использовании JVEsuite : Кто нибудь сталкивался с подобным? Как победить?
  16. Вот кусок кода из боевого приложения, достаточно разрешения на доступ к камере, больше никаких разрешений не надо. Надеюсь вам поможет. 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;
  17. Нет, дойдет, поясните пожалуйста: Проект Android One был представлен в 2014, а Орео вышел в 2017, поэтому в строке "Build.VERSION_CODES.O" буква "О" означает Орео - вот для меня ход ваших мыслей неясен совсем, что это значит? Что Нибиру прилетит в четверг? Ну я рад за вас ))) Аргументы закончились? Теперь оскорбления? Заметьте, даже готовясь к шестому классу (если честно, то к седьмому), я не позволяю себе оскорблять вас и обижать заявляя что вам не дадут выучить стишок ( Вот это было очень обидно.
  18. Ну вот в этом вся Эмбаркадера ( Типа нам кнопки больше 221 точно не понадобятся. Ощущение что они не среду разработки делают, а какое то прикладное приложение для не очень умных пользователей. Спасибо за информацию!
  19. Поищите на этом форуме тему про высоту текста в ListView, задача один в один ваша. P.S. Вот нашел для вас ссылку
  20. Завтра буду отправлять запрос, по результатам отпишусь...
  21. "Android One" это не печенье Орео, это Источник https://ru.wikipedia.org/wiki/Android_One Форум присылает копии сообщений, даже если вы потом впопыхах его редактируете, все видят исходное сообщение: Удивительно как по моей фразе "Просто покупайте любой Xiaomi c Android One (чистый андроид)" вы определили что я печатал ее с умным видом (одновременно думая - он у меня есть, он самый лучший) Еще у меня есть HTC, Samsung, Dexp. На них я тоже тестирую приложения. И это меня не коробит, в отличие от вас. О! А еще у меня есть телефон на iOS, марки Apple. Вообщем я сочувствую вам... P.S. С интересом послушаю удивительную историю возникновения вашей ненависти к Xiaomi, думаю это будет захватывающе! Типа робот-пылесос Xiaomi оторвал вам ногу, или беспроводные наушники Xiaomi приказывают вам делать плохие вещи, или просто авторитетный пятиклассник сказал вам что Xiaomi гавно?
  22. Вы понимаете что такое "Android One" ? Погуглите. Вы несете какую то ересь. Утверждаете что приложение будет работать только на том устройстве, на котором вы его разрабатывали. Это бред. Если приложение работает на одном устройстве, то оно будет работать и на 99% остальных. Если у вас какая то ненависть к определенному производителю, то не вздумайте заходить на этом форуме в раздел разработки для iOS и macOS - там все запускают приложения на устройствах Apple! Ужас какой! ))) Вот вопрос уважаемого автора темы: А вот в чем вы меня обвиняете: Заметьте что кроме вас тут никто не бросается обвинениями, все уважают мнение друг друга и до последнего времени форуме была дружеская обстановка. Так что предлагаю начать сначала, просто держите своих тараканов при себе и мы подружимся )))
  23. Пояснение в сообщении которое вы частично процитировали - читать сначала. Ссылки на issue и темы форумов приводить не буду, все вкладки уже позакрывал. Там что то связанное с Canvas и его реализацией в FMX...
  24. По результатам проб и тестов - не пытыйтесь использовать мой хелпер на длинных ListView или ListView содержимое которого может неожиданно изменится - нарветесь на AV. Я не нашел простого способа проверить существование самого себя и родителей. По Bitmap.LoadFromFile(ImagePath+Name) - загляните в исходники Эмбаркадеро, там все делается через TBitmapSurface : procedure TBitmap.LoadFromFile(const AFileName: string); var Surf: TBitmapSurface; begin TMonitor.Enter(Self); try Surf := TBitmapSurface.Create; try if TBitmapCodecManager.LoadFromFile(AFileName, Surf, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then Assign(Surf) else raise EBitmapLoadingFailed.CreateFMT(SBitmapLoadingFailedNamed, [AFileName]); finally Surf.Free; end; finally TMonitor.Exit(Self); end; end; Добавил к хелперу procedure LoadFromFileAsync(const AFilePath : String; const ASize : TControlSize = nil); overload; procedure LoadFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage); overload; constructor CreateFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage = nil); overload; Сам хелпер и и архив с демо-проектом (загружает 1000 картинок в ListView, параллельно изменяя их размер, картинки в комплекте) : unit BitmapAsyncLoader; interface uses System.Net.HttpClient, System.Net.URLClient, System.SysUtils, System.Types, System.Classes, System.Threading, FMX.Graphics, FMX.Surfaces, FMX.Types, FMX.ListView.Types; type TBitmapAsyncLoader = class helper for TBitmap private function ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; procedure SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); procedure StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); procedure StartLoadFromFileThread(const AFilePath : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); public procedure LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); overload; procedure LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); overload; constructor CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); overload; procedure LoadFromFileAsync(const AFilePath : String; const ASize : TControlSize = nil); overload; procedure LoadFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage); overload; constructor CreateFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage = nil); overload; end; implementation type THTTPClientListener = class class procedure HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); end; var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromFileAsync(const AFilePath : String; const ASize : TControlSize = nil); var AWidth, AHeight : Integer; begin if Assigned(ASize) then begin AWidth:=Round(ASize.Width); AHeight:=Round(ASize.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartLoadFromFileThread(AFilePath, AWidth, AHeight); end; procedure TBitmapAsyncLoader.LoadFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage); var AWidth, AHeight : Integer; begin if Assigned(AListItemImage) then begin AWidth:=Round(AListItemImage.Width); AHeight:=Round(AListItemImage.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartLoadFromFileThread(AFilePath, AWidth, AHeight, AListItemImage); end; constructor TBitmapAsyncLoader.CreateFromFileAsync(const AFilePath : String; const AListItemImage : TListItemImage = nil); begin Create; LoadFromFileAsync(AFilePath, AListItemImage); end; constructor TBitmapAsyncLoader.CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); begin Create; LoadFromURLAsync(AURL, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); var AWidth, AHeight : Integer; begin if Assigned(AListItemImage) then begin AWidth:=Round(AListItemImage.Width); AHeight:=Round(AListItemImage.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); var AWidth, AHeight : Integer; begin if Assigned(ASize) then begin AWidth:=Round(ASize.Width); AHeight:=Round(ASize.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight); end; function TBitmapAsyncLoader.ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; begin if (AWidth <> -1) and (AHeight <> -1) then begin try Result:=TBitmapSurface.Create; Result.StretchFrom(ABitmapSurface, AWidth, AHeight, ABitmapSurface.PixelFormat); finally ABitmapSurface.Free; end; end else Result:=ABitmapSurface; end; procedure TBitmapAsyncLoader.SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); begin TThread.Synchronize(Nil, procedure begin Assign(ABitmapSurface); ABitmapSurface.Free; if Assigned(AListItemImage) then AListItemImage.Invalidate; end ); end; procedure TBitmapAsyncLoader.StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); begin AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except exit; end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then begin ABitmapSurface:=ResizeBitmapSurface(ABitmapSurface, AWidth, AHeight); SynchronizeAssignFromBitmapSurface(ABitmapSurface, AListItemImage); end; end; end, AURL ); end; procedure TBitmapAsyncLoader.StartLoadFromFileThread(const AFilePath : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); begin TTask.Run( procedure var ABitmapSurface : TBitmapSurface; begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromFile(AFilePath, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then begin ABitmapSurface:=ResizeBitmapSurface(ABitmapSurface, AWidth, AHeight); SynchronizeAssignFromBitmapSurface(ABitmapSurface, AListItemImage); end; end ); end; class procedure THTTPClientListener.HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); begin Accepted:=True; end; initialization AHTTPClient:=THTTPClient.Create; AHTTPClient.OnValidateServerCertificate:=THTTPClientListener.HTTPClientValidateServerCertificate; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end. BitmapAsyncLoader.7z
×
×
  • Создать...