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

AngryOwl

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

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

  • Посещение

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

    45

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

  1. 6 минут назад, Равиль Зарипов (ZuBy) сказал:

    У TBitmap есть такой метод, посмотрите его

    
    function TBitmap.EqualsBitmap(const Bitmap: TBitmap): Boolean;
    var
      MyMap, BitmapMap: TBitmapData;
      I: Integer;
    begin
      if IsEmpty or Bitmap.IsEmpty then
      begin
        Result := IsEmpty and Bitmap.IsEmpty;
        Exit;
      end;
      Result := (Width = Bitmap.Width) and (Height = Bitmap.Height) and (PixelFormat = Bitmap.PixelFormat);
      if Result then
      begin
        if Map(TMapAccess.Read, MyMap) then
        try
          if Bitmap.Map(TMapAccess.Read, BitmapMap) then
          try
            for I := 0 to Height - 1 do
              if not CompareMem(MyMap.GetScanline(I), BitmapMap.GetScanline(I), MyMap.BytesPerLine) then
              begin
                Result := False;
                Exit;
              end;
          finally
            Bitmap.Unmap(BitmapMap);
          end;
        finally
          Unmap(MyMap);
        end;
      end;
    end;

     

    Интересно!

    Т.е., как я понимаю, идея такова - перед тем как начать сравнивать (искать "пустой" битмап), создаем прототип "пустого" битмапа (нужного размера, так как знаем - с чем надо будет сравнивать), а дальше уже каждое изображение сравниваем с данным прототипом?

    Гуд. Попробую. Спасибо!

  2. 1 минуту назад, enatechno сказал:

    Полностью согласен. panelstyle - это и есть только один TRectangle. StyleEditor не позволяет его сделать Visible=false. Но можно менять Opacity. Если нужна невидимая панель, то лучше использовать обычный TLayout, который вообще не использует стиль.
    Работа с background в TGroupbox зависит от платформы. Посмотрите в редакторе стилей на дефолтный groupboxstyle:
    - для платформы Windows: текст, используемый для заголовка группы, расположен на объекте background. Если Вы будете менять видимость или прозрачность background, то текст тоже будет невидимым/прозрачным.
    - для платформы Android: текст расположен на отдельном layout. В этом случае изменение видимости/прозрачности background не влияет на отображение текста заголовка.

     Согласен.

    Я, например, делаю либо свой стиль для нужного компонента, либо делаю копию (например от стиля Android), если хочу чтобы выглядело абсолютно одинаково везде.

    Можно оставить родной стиль для TPanel, сделав свой стиль, типа panelopacitystyle (и потом задав его вашим панелям, которым требуется именно прозрачность), в котором вы можете изголяться со стилем как вашей душе будет угодно. Заполнять панели чем угодно, хоть картинками... При этом, в чем прелесть, - можно программно менять стиль из приложения при необходимости (например, - реакция на какие-либо события).

  3. 3 часа назад, Rusland сказал:

    enatechno, есть Panel, зашел в Edit Default Style, сделал Rectangle Visible=false, сохранил. Панель не стала прозрачной. Снова захожу в Edit Default Style - у Rectangle Visible=true. Почему?

    Если не ошибаюсь, то у стандартного стиля для Panel - TRectangle - это и есть весь стиль ))) Потому и не может быть Visible=False )

    Так уберите у него заливку, сделав ее прозрачной. И все.

  4. 12 минут назад, Равиль Зарипов (ZuBy) сказал:

    1) Какие размеры у битмапа?

    2) Как и кто заполняет или не заполняет Bitmap

    1. Размеры: 320*240, 640*480, 640*360 и др.

    2. Заполняет битмапы декодер (в потоках формируется битмап, который копируется, в итоге, в конечный битмап, который и нужно проверить). НЕ заполняться он не может, в нем всегда есть изображение. Другой вопрос, что весь битмап может быть абсолютно "пустым"-черным.

  5. 2 часа назад, ENRGY сказал:

    А зачем вам подряд все пиксели перебирать. Можно по диагонали перебрать к примеру 20-30 пикселей (5%-10% из всех пикселей из этой диагонали-линии).

    Я об этом думал. Однако, возможно есть другое решение? Более "правильное"...

    Может можно как-то быстро обработать фрагмент памяти, в котором находится битмап, а не бегать циклом по пикселям, сравнивая цвета.

    Потому и задал такой вопрос - возможно кто-то знает как это сделать.

  6. Привет, друзья!

    Подскажите - как, с максимально возможной скоростью, определить отсутствие изображения как такового в TBitmap?

    Т.е. - есть TBitmap. Он либо заполнен изображением (картинка), либо он - абсолютно черный прямоугольник.

    Каким способом можно узнать - что в нем именно изображение? Т.е. - НЕ абсолютно черный прямоугольник...

    И определить это нужно "мгновенно" (условно выражаясь).

    Заранее всем благодарен за участие!

    P.S. Варианты типа того что ниже - не предлагать)) Хотелось бы что-то "побыстрее"! Еще раз спасибо!

    function IsBitmapEmpty(Bmp: TBitmap): Boolean;
    var
      X, Y   : Integer;
      BmpData: TBitmapData;
      yAddr  : Integer;
      AlphaCount : integer;
    begin
      Result := False;
      try
        AlphaCount := 0;
        Bmp.Map(TMapAccess.Read, BmpData);
        for Y := 0 to Bmp.Height div 2 do
          begin
            YAddr := Y * Bmp.Height;
            for X := 0 to Bmp.Width - 1 do
              if (PAlphaColorArray(BmpData.Data)^[YAddr + X] <> TAlphaColorRec.Null) and
                 (PAlphaColorArray(BmpData.Data)^[YAddr + X] <> TAlphaColorRec.Black) then
                begin
                  inc(AlphaCount);
                  Break;
                end;
            if AlphaCount > 0 then
              Break;
          end;
      finally
        Bmp.Unmap(BmpData);
        Result := AlphaCount = 0;
      end;
    end;

     

  7. 1 минуту назад, Menkos1 сказал:

    я уже писал, просто создаем пустую форму и на ней одну кнопку для теста - на этом все, нету никаких стилей, нету никаких дебагеров и прочего

    Еще раз повторю - не крупный проект а пустая/чистая созданная форма.!

    "Пустая и чистая" форма - вовсе не "пустая". В FMX приложении есть ресурсы. Откройте приложение в редакторе ресурсов (например Restorator 2007 или любой другой) и вы увидите содержимое бинарника. Так-что "пустая/чистая форма" - это в VCL, в FMX иначе.

  8. 2 минуты назад, Menkos1 сказал:

    я до сих пор не понял.

    и каким образом XE3 - работает все отлично и запускается моментально.

    а на XE6 и XE10.1 с задержкой в 2 секунды.

    Какой стиль используется в XE3 и в 6-10 ?

    Если свой не подгружаете, то, думаю, - по умолчанию. Какой объем бинарника получается при компиляции Release в XE3, и какой в 10?

    Думаю дело может быть в ресурсах, используемых приложением.

  9. 40 минут назад, AlexShaman сказал:

    Создаю файл в Paint (для теста), сохраняю в bmp 32bit 1680x373

    tmpIcon.PixelFormat := vcl.Graphics.TPixelFormat.pf32bit;

    tmpIcon.Width := 1680;

    tmpIcon.Height:= 373;

    Какие еще надо установить значения до

    tmpIcon.LoadFromStream(tmpStream); ?

    Вас не смущает "размер" вашей "иконки"? :)

    Вы в нее решили фотку запилить? Сделайте для теста 32*32

  10. Мне это видится примерно так:

    Отключите автоматическое создание форм.

    Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.

    Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).

    На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма

    и скройте Splash-форму.

     

    З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!

  11. 3 часа назад, kami сказал:

    Нет, не пойдет. Потому что DoOnCloseInfo по прежнему вызывается из внутренностей TButton.Click. Если ваш код отрабатывает на Windows - это ваша недоработка, а не показатель правильности. Причины я изложил выше. А на мобильных платформах с фреймом визуально просто ничего не произойдет. Причины опять-таки изложил выше.

    И в таком виде тоже не пойдет.

    Потому что Synchronize и Queue, будучи вызванными из главного потока, моментально передают управление в метод, а не дожидаются очередного витка выборки сообщений у Application. В таком виде вы просто добавляете несколько вложенных вызовов, увеличивая занятость стека. Не меняя при этом концепцию работы.

    Согласен!

  12. 3 минуты назад, kami сказал:

    так не пойдет

    На Windows - получим тот же AV, ибо по нажатию на кнопку вызовется DoOnCloseInfo, по завершению которой фрейма уже не будет. А во внутренностях TControl по завершению вызова OnClick еще идет обращение к себе.

    На мобильной платформе - ничего не случится, потому что ARC и фрейм еще присутствует у своего родителя, простое за nil-ивание ссылки ничего не даст.

     

    Правильный выход - непосредственно в обработчике кнопки сделать fr.Release;

    Именно так и пойдет! И под виндой и в других платформах )

    Во-первых - DoOnCloseInfo лишь вызовет обработчик этого события в главной форме.

    Разве что - только добавить синхронизацию

    procedure TframeInfo.DoOnCloseInfo;
    begin
      if Assigned(fOnCloseInfo) then
        TThread.Synchronize(nil, procedure
        begin
          fOnCloseInfo(Self);
        end);
    end;
  13. у фрейма:

      private
        fOnCloseInfo : TNotifyEvent;
      protected
        procedure DoOnCloseInfo; dynamic;
      public
        { Public declarations }
        /// <summary> Обработчик события закрытия фрейма </summary>
        property OnCloseInfo : TNotifyEvent read fOnCloseInfo write fOnCloseInfo;
      end;
    
    procedure TframeInfo.DoOnCloseInfo;
    begin
      // Если обработчик назначен, то запускаем его.
      if Assigned(fOnCloseInfo) then
        fOnCloseInfo(Self);
    end;

    при инициализации фрейма (не важно где и как - когда создается):

    frameInfo.OnCloseInfo := fmMain.DoOnCloseInfo;

    при нажатии на кнопку:

    DoOnCloseInfo;

    в главной (или любой другой форме, которая будет отрабатывать нажатие кнопки во фрейме):

    // можно в любой секции, смотря что нам нужно
    procedure DoOnCloseInfo(Sender: TObject);
    
    
    procedure TfmMain.DoOnCloseInfo(Sender: TObject);
    begin
      if Assigned(frameInfo) then
        FreeAndNil(frameInfo);
    end;

    типа так...

  14. При нажатии на кнопку отправить сообщение главной форме, а в обработчике этого сообщения, на который главная форма (условно, можно вообще любую форму) подписана - удалять соответственно этот фрейм.

  15. Самое простое решение ("на коленке"):

    uses
      ...
      {$IFDEF MSWINDOWS}
      System.Win.ComObj,
      Winapi.ShlObj,
      {$ENDIF}
      ...
    //-------------------------------------------------
    type
      TTaskBarState = record
        name : string;
        value : byte;
      end;
    
      TFMXTaskBar = class(TPersistent)
      private
        fTaskBarList : ITaskBarList3;
        fTaskBarState : integer;
        fTaskBarProgress : integer;
        fAlertState : Boolean;
        procedure setTaskBarState(newState:integer);
        procedure setTaskBarProgress(newValue : integer);
        procedure setAlertState(const Value: Boolean);
      protected
      public
        property AlertState: Boolean read fAlertState write setAlertState;
        property TaskBarState : integer read fTaskBarState write setTaskBarState;
        property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress;
        constructor Create;
        destructor Destroy; override;
      end;
    //-------------------------------------------------
    
    const
      taskStates : array [0..4] of TTaskBarState = (
                (name: 'TBPF_NOPROGRESS';    value: TBPF_NOPROGRESS),
                (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE),
                (name: 'TBPF_NORMAL';        value: TBPF_NORMAL),
                (name: 'TBPF_ERROR';         value: TBPF_ERROR),
                (name: 'TBPF_PAUSED';        value: TBPF_PAUSED));
    //-------------------------------------------------
    var
      MainTaskBar: TFMXTaskBar;
    //-------------------------------------------------
    
    { TFMXTaskBar }
    
    constructor TFMXTaskBar.Create;
    var
      tbList : ITaskBarList;
      hr : HRESULT;
    begin
      tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList;
      hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList);
      if hr <> S_OK then
      begin
        fTaskBarList := nil;
        tbList._Release;
      end;
    end;
    
    destructor TFMXTaskBar.Destroy;
    begin
    
      inherited;
    end;
    
    procedure TFMXTaskBar.setAlertState(const Value: Boolean);
    begin
      if assigned(fTaskBarList) then
        if fAlertState <> Value then
        begin
          fAlertState := Value;
    
          if Value then
          begin
            setTaskBarState(3);       // TBPF_ERROR
            setTaskBarProgress(100);
          end else
          begin
            setTaskBarState(0);
            setTaskBarProgress(0);
          end;
        end;
    end;
    
    procedure TFMXTaskBar.setTaskBarProgress(newValue: integer);
    begin
      if assigned(fTaskBarList) then
        fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100);
    end;
    
    procedure TFMXTaskBar.setTaskBarState(newState: integer);
    begin
      if assigned(fTaskBarList) then
        fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value);
    end;
    //-------------------------------------------------
    
    initialization
      MainTaskBar := TFMXTaskBar.Create;
    
    finalization
      if Assigned(MainTaskBar) then
        FreeAndNil(MainTaskBar);

     

  16. Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.

    Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".

    Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.

    Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?

  17. В Designmode разместите кнопки "как видите" их на форме (как они должны быть расположены), а потом левой кнопке поставьте Align = None и Anchors[akLeft,akBottom], а правой Align = None и Anchors[akRight,akBottom]. Думаю, что этого будет достаточно.

    P.S. Ну и как все будет закончено с их расположением, поставьте им Locked = True (дабы не сместить их ненароком)

  18. Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!

    Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...

    Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.

    Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.

    Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))

  19. 6 минут назад, Равиль Зарипов (ZuBy) сказал:

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

    • копируем в проект и открываем FMX.Forms.pas
    • Ctrl+F -> procedure TCommonCustomForm.SetShowHint(const Value: Boolean);

     

    
    procedure TCommonCustomForm.SetShowHint(const Value: Boolean);
    begin
      FShowHint := Value;
      ReleaseLastHinted;
    
      // ZuBy ***
      if (not(csDesigning in ComponentState)) then
      begin
        FreeAndNil(FSharedHint);
        FSharedHint := THint.CreateNewInstance(Handle);
      end;
      // *** ZuBy
    end;
    • сохраняем
    • в событии OnCreate, OnShow пишем
    
    ShowHint := true;
    • Готово!

     

    Работает!

    А то, что это "костыль" - пофигу! Если бы он был одним единственным... А так - это решение вполне устраивает!

    Спасибо!

  20. 1 минуту назад, Vitaldj сказал:

    Не только BorderStyle, но еще что то. А что, я так и не выяснил. Потому что в моем проекте, нет BorderStyle в none, но хинты так и не отображаются!

    Думаю, что еще и свойство Transparency, при определенных условиях.

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