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

Vizit0r

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

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

  • Посещение

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

  1. доброго времени суток!

    выполняю скрипт 'do shell script "installer-pkg /Users/alex/Library/Containers/stealth/Data/Public/ Stealth.pkg -target /" with administrator privileges' (код ниже). Долго и нудно пытался выяснить, почему на девелоперской машине то работает, то нет, а у обычного пользователя всегда нет. Пришел к тому, что при установленном приложении в /Applications скрипт не срабатывает вообще, запроса пароля нет, при этом в словаре errorInfo нет ключа NSAppleScriptErrorNumber, eventResult = nil. причина не ясна вообще. На девелоперской  же машине, оно нормально выкидывает окно запроса пароля, при отмене обрабатывает ошибку, при вводе пароля - не задумываясь обновляет stealth.app в scratch-dir от paserver'а, а не в /Applications. 

    Естественно, что из того же ScriptEditor этот же скрипт отлично обновляет приложение, установленное в /Applications.

    Есть четкое ощущение, что это маковские заморочки с правами, подскажите, куда копать?

    Приложение подписанное обоими сертификами, но не нотаризовано, ибо x32. Delphi Rio, MacOs Mojave 10.14.3

    P.S. Собственно, для чего это всё: По согласию пользователя качается файл обновления (.pkg) с сайта, обновляется (желательно в тихом режиме, программа перезапускается).  Запуск обновления  в ручном режиме я давно сделал, но хотелось бы делать это в автомате, а от пользователя только ввод пароля.

    Код:

    function runProcessAsAdministrator(const scriptPath: string; Parameters: array
    of string; out OutputText : String) : Boolean;
    var
      appleScript : NSAppleScript;
      I : Integer;
      eventResult : NSAppleEventDescriptor;
      errorInfo : NSDictionary;
      cb_ptr : Pointer;
      errorNumber : NSNumber;
      allArgs,fullScriptLine : String;
      scriptExecLine : NSString;
      arr : NSArray;
    begin
      if Length(Parameters) > 0 then
      begin
        for I := 0 to Length(Parameters)-1 do
          allArgs := allArgs + Parameters[i] + ' ';
        allArgs := allArgs.TrimRight;
      end;     
      fullScriptLine := scriptPath + ' ' + allArgs;
      scriptExecLine := StrToNSStr('do shell script "' + fullScriptLine +'" with administrator privileges');
      appleScript := TNSAppleScript.Wrap(TNSAppleScript.Alloc.initWithSource(scriptExecLine));
      eventResult := TNSAppleEventDescriptor.Alloc;
      eventResult := appleScript.executeAndReturnError(@cb_ptr);
      errorInfo := TNSDictionary.Wrap(cb_ptr);
    
      Result := Assigned(eventResult);
      if Result then
        OutputText := NSStrToStr(eventResult.stringValue)
      else
      begin
        if Assigned(errorInfo) then
        begin
          cb_ptr := errorInfo.valueForKey(NSAppleScriptErrorNumber);
          if Assigned(cb_ptr) then
          begin
            errorNumber := TNSNumber.Wrap(cb_ptr);
            if errorNumber.intValue = -128 then
              OutputText := 'The administrator password is required to do this.'
            else
              OutputText := NSStrToStr(TNSString.Wrap(cb_ptr));
          end
          else  //debug purpose only!!!
          begin
            i := errorInfo.count; //if we have real error - here will be 5, else 4
            cb_ptr := errorInfo.allKeys;//if Dict is empty, this pointer will be zero
            if Assigned(cb_ptr) then
            begin
              arr := TNSArray.Wrap(cb_ptr); //result looks like incorrect
              i := arr.Count;    //this will return AV always!
              for I := 0 to arr.Count - 1 do
                OutputText:= NSStrToStr(TNSString.Wrap(arr.objectAtIndex(i)));
            end;
          end;
        end;
      ShowMessageMultiplatform('Returnval =  ' + Boolean.ToString(Result,TUseBoolStrs.True) + sLineBreak
                             + 'OutText = ' + OutputText);
      end;
    end;

     

  2. Тестовый пример - вычитываю во временый битмап картинку из файла. Потом временный битмап рисую на полотне битмапа от Image1. Потом еще рисую на полотне, например эллипс. На этом этапе все хорошо.

    А дальше достаточно сделать Image1.Bitmap.Map - Unmap, и все, изображение пустое. Если писать через BitmapData напрямую в пикселы - оно показывается на экране.

    При этом каким-то странным образом эффект стирания битмапа убирается путем вызова Image1.Bitmap.SaveToFile перед вызовом Map-Unmap,

    Исходники пытался читать, причины не нашел.

    Кто в курсе, подскажите - что я делаю не так?

    P.S. Если читать из файла напрямую в Image1.Bitmap - то при Map-Unmap затираются только изменения полотна, а загруженный рисунок остается. Явно какие-то недокументированные особенности вызова Map-Unmap..

    P.P.S. Зло где-то в районе вызова 

      if H.FAccess in [TMapAccess.ReadWrite, TMapAccess.Write] then
        SharedDevice.CopyResource(H.Texture, H.FMapBuffer);
     

    при Unmap.

     

    Осталось придумать, как это побороть и совместить рисование на полотне с прямым доступом к пикселам.

    procedure TForm2.Button1Click(Sender: TObject);
    var Bmp1 : Tbitmap;
        BitmapData : TBitmapData;
    begin
      Bmp1 := Tbitmap.Create;
      Bmp1.CreateFromFile('c:\123.bmp');
    
      Image1.Bitmap.Width := Bmp1.Width;
      Image1.Bitmap.Height := Bmp1.Height;
    
      Image1.Bitmap.Canvas.BeginScene;
      Image1.Bitmap.Canvas.DrawBitmap(Bmp1,TRectF.Create(0,0,Bmp1.Width,Bmp1.Height),
                                    TRectF.Create(0,0,Image1.Bitmap.Width,Image1.Bitmap.Height), 1);
      Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red;
      Image1.Bitmap.Canvas.DrawEllipse(TRectF.Create(10, 10,
                                      20,20), 1);
      Image1.Bitmap.Canvas.EndScene;
    
    //  Image1.Bitmap.SaveToFile('c:\0001.bmp');    //если это закомментировать, то
      //при вызове Map-Unmap в Image будет пусто
      Image1.Bitmap.Map(TMapAccess.Write,BitmapData);
    //  здесь была работа с пикселами напрямую - замена цветов в нескольких точках.
      Image1.Bitmap.Unmap(BitmapData);
      Bmp1.Free;
    //  BMPTest(Image1.Bitmap);
    end;
    


     

  3. Добрый вечер.

     

    есть MultiView. 

    есть TabControl с Align = Client.

    есть Panel с Align = Bottom, растянута на часть экрана,  где-то треть.

    При этом MultiView при показе (когда выезжает слева) - отображается только на той части экрана, где TabControl, и не показывается на части, занятой Panel.

    В какую сторону стоит копать, чтобы добиться сдвигания этой нижней панели при выезде MultiView?

    Менять Align у нижней панели нельзя, иначе вся структура окна уплывет.

    Screenshot_2.jpg

  4. да легко

    комментарии и мысли по теме - внутри исходника.

    Цитата

    и для чего использовать ScanLine? и где вы его вообще взяли?) он в VCL версии был

    P := BitmapData.GetScanline(Y); - это VCL? 

    Битмап вычитывается из файла, попутно преобразовывается из 15б формата в 32, но это отношения к теме не имеет.

    Project2.rar

  5. Delphi Seattle, Android 5.0.1

    Формирую картинку через ScanLine. На выходе полученный битмап рисуется на полотне TImage, на котором перед этим был нарисован Rect.

    GlobalBitmap - формированный tbitmap.

               with ObjectPreviewImage.Bitmap.Canvas do
                begin
                  BeginScene;
                  Clear(TAlphaColorRec.White);
                  DRect := TRectF.Create(0, 0, GlobalBitmap.Width + 8, GlobalBitmap.Height + 8);
                  DrawRect(DRect, 0, 0, AllCorners,
                           StealthForm.ObjectPreviewImage.AbsoluteOpacity);
    
                  DRect := TRectF.Create(0, 0, GlobalBitmap.Width, GlobalBitmap.Height);
                  DrawBitmap(GlobalBitmap,DRect,
                     TRectF.Create(2, 2, GlobalBitmap.Width + 2, GlobalBitmap.Height + 2), 1);
                  EndScene;
                end;

     

    Проблема собственно в чем - в андроидной версии слева и внизу рамка "съедается". В Win32 версии все отлично. На прилагаемых скриншотах это четко видно.

    Документацию читал, гугл гуглил.

     

    Что я делаю не так? Или это неизвестные подводные камни андроидного рисования на полотне?

     

    P.S. Картинка одинаковая, цвет к определенной области применяется не верно. Походу тоже андроидные приколы. Но с этим я уже разберусь.

    P.P.S. Уже разобрался с цветом - под андроидом Blue и Red в пикселе надо поменять местами. А насчет канвы - не получается никак.

    Pandr1.jpg

    win1.jpg

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