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

Slym

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

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

  • Посещение

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

    39

Сообщения, опубликованные Slym

  1. DeviceToken должен получаться в отдельном потоке
    т.е. в примере PushServiceRegister вынеси в отдельный поток, и крути его до получения токена т.к. не сразу получается...

  2. HTTPAnalyzer показывает:

    POST / HTTP/1.1
    Connection: Keep-Alive
    Content-Type: application/x-www-form-urlencoded; charset=utf-8
    User-Agent: Embarcadero URI Client/1.0
    Host: www.yandex.ru
    Content-Length: 148
    
    nOwnerOrganizMode=1&cRegNumber=%D1%81-5%2F1&cBegRegDate=22.05.2029&cFIO=%D1%81%D0%B5%D1%80%D0%B3&cDocContent=%D0%B9%D1%86%D1%83qwe%D0%B9%D1%86%D1%83

    Обилие %D0 - показывают что уходит UNICODE, а кодирование цифр и английского одним символом указывает что это UTF8... и заголовки этому соответствуют
    Проблема на клиенте отсутствует... копай сервис
     

  3. Post(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil;
          const AEncoding: TEncoding = nil;

     

    cResponce := NetHTTPClient1.Post('https://сайт/сервис', ASource,nil, TEncoding.UTF8) .ContentAsString(TEncoding.UTF8);

    и смотрим заголовок application/x-www-form-urlencoded; charset=???

  4. как в iOS создать превью (Thumbnail) большой картинки и не занять всю память...
    Тестирую на 11Мб jpg, 14К*9К = 126MPx = 500МБ битмап, взято с запасом против 48Мpx камер
    Целевое разрешение 120*90
    В лоб загрузка и отрисовка превью - дорого по памяти -можно вылететь, особенно в несколько потоков
    в андроид есть TJBitmapFactory.JavaClass.decodeFile(Options.inSampleSize) и оно в несколько потоков делает превью
    в иос инет тыкает в CGImageSourceCreateThumbnailAtIndex (kCGImageSourceCreateThumbnailWithTransform и kCGImageSourceThumbnailMaxPixelSize ) из ImageIO
    заголовков iOSapi.ImageIO - нет, но прикрутил правкой Macapi.ImageIO  - поправил фреймворк на libImageIO = '/System/Library/Frameworks/ImageIO.framework/ImageIO';
    но не работает, а отладка на теле недоступна т.к. сборка на удаленном маке.

    код сыпет ImgRef = nil, т.е. CGImageSourceCreateThumbnailAtIndex - не отрабатывает, либо заголовки мною криво накручены либо 126MPx не подъемны для iOS

    uses
      iOSapi.CocoaTypes, iOSapi.CoreGraphics, Macapi.CoreFoundation,
      iOSapi.ImageIO{переделанный Macapi.ImageIO}, Macapi.Helpers,
    
    class function TPhotoProxy.LoadInThumb(const Filename:string; Surface:TBitmapSurface; const PrefferedSize:TSize):boolean;
    var
      Path: CFStringRef;
      Url: CFURLRef;
      ImgSourceRef: CGImageSourceRef;
      ImgRef: CGImageRef;
      Dict: CFDictionaryRef;
      Keys: array [0..10] of Pointer;
      Value: array [0..10] of Pointer;
      IntValue: Cardinal;
    begin
      Result := False;
      Path := CFStringCreateWithCString(nil, MarshaledAString(UTF8Encode(Filename)), kCFStringEncodingUTF8);
      try
        Url := CFURLCreateWithFileSystemPath(nil, Path, kCFURLPOSIXPathStyle, False);
        try
          ImgSourceRef := CGImageSourceCreateWithURL(Url, nil);
          if ImgSourceRef = nil then
            raise Exception.Create('ImgSourceRef = nil');
          try
            Keys[0] := CFSTR('kCGImageSourceCreateThumbnailWithTransform');
            Value[0] := kCFBooleanTrue;
            Keys[1] := CFSTR('kCGImageSourceCreateThumbnailFromImageAlways');
            Value[1] := kCFBooleanTrue;
            Keys[2] := CFSTR('kCGImageSourceThumbnailMaxPixelSize');
            if PrefferedSize.cx > PrefferedSize.cy then
              IntValue := Trunc(PrefferedSize.cx)
            else
              IntValue := Trunc(PrefferedSize.cy);
            Value[2] := CFNumberCreate(nil, kCFNumberSInt32Type, @intValue);
            Dict := CFDictionaryCreate(nil, @Keys[0], @Value[0], 3, nil, nil);
            try
              ImgRef := CGImageSourceCreateThumbnailAtIndex(ImgSourceRef, 0, Dict);
              if ImgRef = nil then
                raise Exception.Create('ImgRef = nil');
              try
                Result := ImageToSurface(ImgRef, Surface, MaxInt);
              finally
                CGImageRelease(ImgRef);
              end;
            finally
              CFRelease(Dict);
            end;
          finally
            CFRelease(ImgSourceRef);
          end;
        finally
          CFRelease(Url);
        end;
      finally
        CFRelease(Path);
      end;
    end;

    к то чем поможет?

  5. 8 часов назад, Tumaso сказал:

    Что, серьезно?)

    Также серьезно как и TObject(nil).Free; //no problem
    Это работает! Поверь и проверь.
    В любом вызове метода объекта передается первым параметром self, и достаточно сделать в самом начале if self=nil then exit; - и проблемы нет
    так делает TJSONValue.FindValue, так делает TObject.Free
    пример из генофонда:
     

    procedure TObject.Free;
    begin
    // under ARC, this method isn't actually called since the compiler translates
    // the call to be a mere nil assignment to the instance variable, which then calls _InstClear
    {$IFNDEF AUTOREFCOUNT}
      if Self <> nil then
        Destroy;
    {$ENDIF}
    end;

     

  6. Данный артефакт я тоже ловил на лабелах - лечится именно восстановлением фона. (хотя эм могла гденить еще косячнуть)
    Во всех формах надо убрать фон (возможно ты используешь несколько форм)...
    В чистом проекте артефакт есть? сделай полный билд, передерни эм делфи, кофе попей... 

  7. function Proc(const Answerreqest:string):boolean;
    var
      JSON,AItem: TJSONValue;
      JRequest, JDistance: TJSONObject;
      JArray: TJSONArray;
      I: integer;
    begin
      JSON := TJSONObject.ParseJSONValue(Answerreqest);
      //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil :) JPath работает через FindValue - а он сам проверяет на nil
      try
        if JSON.TryGetValue<TJSONObject>('request',JRequest) then
          TabbedForm.memo3.Lines.Add('JRequest: ' + JRequest.ToString);

        if JSON.TryGetValue<TJSONObject>('distance',JDistance) then
        begin
          TabbedForm.memo3.Lines.Add('JDistance: ' + JDistance.ToString);
          TabbedForm.memo3.Lines.Add('price_1: ' + JDistance.GetValue<string>('price_1',''));
          if JDistance.TryGetValue<TJSONArray>('SomeArray',JArray) then
          begin
            TabbedForm.memo3.Lines.Add('count: ' + JArray.Count.ToString);
            for I := 0 to JArray.Count - 1 do
            begin
              AItem := JArray.Items;

              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_id','') + ',' +
                                         AItem.GetValue<string>('obj_acc_id','') + ',' +
                                         AItem.GetValue<string>('obj_cat_id',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_title',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_descr',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_address',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_url',''));
            end;
          end;
        end;
      finally
        JSON.Free;
      end;
      result:=true;
    end;

  8. 5 часов назад, Александр2010 сказал:

          aJSArray := aJSObject.GetValue('distance') as TJSONArray;     // дальше хочу полчить хоть 1 элемент json но даже не ругается просто  request

    ни одного TJSONArray в ответе нет
    так же нет ничего из этого:

    TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                    aJSObjArr.GetValue('obj_cat_id').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value);

    бросай те вы уже эти  as TJSONArray as TJSONObject - где проверки на существование? жесткого приведения требует только разве что TJSONArray, а остальное выше TJSONValue приводить не обязательно.
    используйте нотацию TJSONValue.GetValue<string>('obj_title','').- не найдено встанет значение по умолчанию... не нравится возьми TryGetValue
    даже jpath(указание пути названий узлов) работает JSONValue.GetValue<integer>('
    request.people_count,0)  - даже с массивами...
    касаемо массивов - можно указать тип искомой ноды SONValue.GetValue<TJSONArray>('
    request.distance',nil)

  9. Под андроид идет опция AUTOREFCOUNT - все объекты имеют счетчик ссылок...
    любое присваивание - это +/- ссылки, даже Free не честное:
    procedure TObject.Free;
    begin
    // under ARC, this method isn't actually called since the compiler translates
    // the call to be a mere nil assignment to the instance variable, which then calls _InstClear
    {$IFNDEF AUTOREFCOUNT}
      if Self <> nil then
        Destroy;
    {$ENDIF}
    end;
    т.е. Free ничего не делает!!!  - экземпляр остается в зомбирежиме (ты его убил а оно ходит) пока счетчик до 0 не до тикает.
    TObject(TreeItem);  - пытается найти методы подсчета ссылок (Это же объект!) и не находит т.к. это не объект вовсе.
    TTreeItem = record меняем на TTreeItem = class, честно создаем и не забываем убить, хотя под AUTOREFCOUNT - оно само должно помереть если циклической ссылочности нет.

  10. аяяй! Совсем разленились try юзать, все на RefCounting надеетесь...
    ну-ну... а под вендой мемлики плодятся :) (если файла нет -  Surf куда?)
    не-не... переделать! а то студенты накопипастят...
     

    procedure TBitmapAsyncLoader.LoadImageAsync(const AFilePath:string; Callback: TProc);
    begin
      TTask.Run(
        procedure
        var ABitmapSurface : TBitmapSurface;
        begin
          ABitmapSurface:=TBitmapSurface.Create;
          try
            if TBitmapCodecManager.LoadFromFile(AFilePath, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) and assigned(Callback) then
              TThread.Synchronize(nil, Callback);
          finally
            ABitmapSurface.Free;
          end;
        end);
    end;



     

  11. ну в общем воркеры имеются... например TTask и запускаются в пуле...
    и можно запускать много тасков и они из общего пула не вылезут и делать к примеру так:
    данный код не бест и может ломать пикчу, и поэтому вопрошаю кто как... пользую TBitmap а не Surface что тоже не оптимально, но обратно совместимо с vcl (в дефайн обернуть?)

    procedure LoadImageAsync(const Name:string; Callback: TProc<TBitmap>);
    begin
      TTask.Run(
        procedure
        var Bitmap:TBitmap;
        begin
          Bitmap:=TBitmap.Create;
          try
            Bitmap.LoadFromFile(ImagePath+Name);
            TThread.Synchronize(nil,
              procedure
              begin
                Callback(Bitmap);
              end);
          finally
            Bitmap.Free;
          end;
        end);
    end;
      
    procedure TmainForm.FormShow(Sender: TObject);
    begin
      LoadImageAsync('logo1.png',
        procedure(Bitmap:TBitmap)
        begin
          Image1.Bitmap.Assign(Bitmap);
          Image1.Invalidate;
        end);
      LoadImageAsync('logo2.png',
        procedure(Bitmap:TBitmap)
        begin
          Image2.Bitmap.Assign(Bitmap);
          Image2.Invalidate;
        end);
      LoadImageAsync('logo3.png',
        procedure(Bitmap:TBitmap)
        begin
          Image3.Bitmap.Assign(Bitmap);
          Image3.Invalidate;
        end);
    end;
    

     

  12. Доп вопрос в тему: Как вы с fs загружаете картинки?
    по тутору андрюши любой доступ к fs желательно поточить, а тут еще и декод... а декод можно параллелить на кучи ядер смартфона
    но все поголовно не заморачиваются и тупо LoadFromFile в главном потоке. как правильно? на косяки TBitmap в потоке тоже нарывался прозрачность портит/чернит
    1. допустим есть форма и TImage на ней, и в него надо положить logo.png
    2. тоже самое но 10-20 images (параллельный декод)
     

  13. Не делайте слепое приведение типов...
     

    var JObj:TJSONObject;
    begin
      JObj:=TJSONObject(TJSONObject.ParseJSONValue('0'));
      try
        try
          if assigned(JObj) then
            JObj.AddPair('Access','violation');
        except
          ShowMessage('Surprise MF!: '+JObj.ClassName);
        end;
      finally
        JObj.Free;
      end;
    end;

    ParseJSONValue возвращает TJSONValue, и необходима или проверка типа или использование только в рамках TJSONValue чего в большинстве случаев вполне достаточно.

  14. procedure TForm2.Button1Click(Sender: TObject);
    var Iters:integer;
    begin
      Iters:=100000000;
      TThread.CreateAnonymousThread(
        procedure
        var
        i:integer;
        a:real;
        begin
         for i := 0 to Iters do
         begin
           a:=i/3;
           if i mod 1000000 = 0  then
           begin
             TThread.Queue(nil,
              procedure
              begin
                ProgressBar1.Value:=ProgressBar1.Value+1;
              end);
           end;
          end;
        end).Start;
    end;
    

    и не надо никаких доп классов...
    еще есть TTask... тоже полезно

  15. Procedure TServerConnectionTH.RecieveData();
    // сюда приходя данные со сканера
    //Data - это данные в виже TBytes
    //str - строка со считанным штрихкодом
    var
      Intent: JIntent;
      str:String;
    begin
      str:=TEncoding.UTF8.GetString(Data);
      Form1.DisplayR.Lines.Add(Str);
      Form1.DisplayR.GoToTextEnd;
      Intent := TJIntent.Create;
      Intent.setAction(StringToJString('com.google.android.c2dm.intent.RECEIVE'));
      Intent.putExtra(StringToJString('text'),StringToJString('1')); 
      Intent.putExtra(StringToJString('title'),StringToJString('1C')); 
      Intent.putExtra(StringToJString('data'),StringToJString(str)); 
      TAndroidHelper.Context.sendBroadcast(Intent);
    end;

     

×
×
  • Создать...