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

ramir

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

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

  • Посещение

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

  1. Ну что цепляться к этой подсветке. Не будут они ничего делать, т.к. это писалось давным давно (еще на J#), и видимо, никто разобраться уже не может :)
    Еще раз посмотрите роадмап - запилят поддержку LSP, тогда и спрашивайте о корректной работе error insight...


     

  2. Конечно, имелось ввиду выделение и освобождение памяти в разных "местах". И без ...ShareMem будет N менеджеров.

    Ничего зазорного не вижу, если из DLL получаем динамический массив. Я привел пример Delphi/Builder. В dll выделили, в приложении освободили.

    Только надо четко понимать как это работает и применять, если нет более простого решения.

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

    Каким образом соотносятся выделение памяти в модуле и использование borlndmm.dll ?

    Самым прямым. Чтобы менеджер памяти единый был. Тогда можно спокойно использовать GetMem/FreeMem и т.п.

    Например, приложение может быть, на Delphi, а DLL на Builder-e, внутри которой нужно динамические массивы создавать.

    Конечно, если используются различные среды, то дельфовые строки и стандартные процедуры выделения/освобождения памяти использовать не стоит.

    ТС свой сценарий использования dll не описал, поэтому можно пофантазировать...

  4. Вообщето, удаление в новой версии published св-в и методов - это крутое BC.

    И чтото в What new про это ничего не нашел, даже мелким шрифтом.

    Да, поведение на десктопе и мобильной платформе разное, ну тогда может вообще забыть про него, типа все равно ничего дельного сделать нельзя?

  5. В Berlin-e в объявлении published у класса Grid пропала часть обработчиков. Поэтому и возникла указанная ошибка - при открытии формы не находятся обработчики. Явный косяк разработчиков, ну мы не об этом.

    У меня нет исходников, поэтому я не могу точно сказать, что там за рефакторинг был проведен. В VCL, например, такие обработчики у базового класса в секции protected объявлены.

     Т.е. если в базовом классе они в секции public, то в моем примере класс TStringGrid = class(FMX.Grid.TStringGrid) не нужен.

  6. Конечно это... не очень хорошее отношение к продукту, блин.Пока лучше не Siettlle оставаться.

    Можно попробовать такой финт ушами. Перед формой где используется грид прописать класс

      TStringGrid = class(FMX.Grid.TStringGrid)..., и в нем прописать обработчики, а вформе назначить их вручную
    Т.е. получим нечто следующее:

    uses
      System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
      System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Layouts, FMX.Grid;
    
    type
      TStringGrid = class(FMX.Grid.TStringGrid)
      published
        property OnDblClick;
        //...
      end;
    
      TForm5 = class(TForm)
        StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid1DblClick(Sender: TObject);
      private
        procedure SubscribeControlsEvents;
      public
      end;
    
    var
      Form5: TForm5;
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      SubscribeControlsEvents;
    end;
    
    procedure TForm5.StringGrid1DblClick(Sender: TObject);
    begin
    //
    end;
    
    procedure TForm5.SubscribeControlsEvents;
    begin
      StringGrid1.OnDblClick := StringGrid1DblClick;
    end;

     

  7. Общее впечатление на текущий момент (программирую пока только под Windows):

    Задумка богатая (типа WPF), но реализация...

    Уровень создания пользовательского интерфейса на уровне Delphi1-3 :), вон хинты только в Siettle появились. Зато радуют спецэффекты (подсведтки, анимация и т.п.).

    Grid. Мда. Я бы не рискнул его использовать в приложении где актуальна интенсивная работа с БД. VCL-кий грид и то круче (не говоря про всякие EhLib и т.п.)

    Одно отсутствие кэширования как в соответствующем DB-avere компоненте. А редактировать непосредственно в нем (по моему) просто невозможно.

    Постоянно нужно быть готовым ко всяким чудесам (например).

    Но не смотря на это воспользовался FMX в серьезном проекте. Понравилась работа прежде всего с 3D графикой. Не хотелось заморачиваться с OpenGL(DirectX), сторонними библиотеками.

    Поэтому мое мнение, если приложение под Win и основная работа с базами - лучше VCL. И при этом стараться максимально разделять визуальную часть от обработки данных. Тогда, если потребуется, можно будет и FMX задействовать, например мобильное приложение как составная часть большой системы

     

  8. В модальном окне срабатывает Action по ShortCut- у другого окна

    Наткнулся на неожиданную проблему.
    В диалоговом окне по ShortCut срабатывает Action другой формы. Например, вызвал окно по ShowModal, случайно (или не очень) нажал Ctrl-O и на тебе - окно выбора файла из главного окна.

    Изучение метода TCommonCustomForm.KeyDown привело к такому коду

    ...
          // 5. perform key in all ActionLists in Childrens
          TraverseChildren(self);
          // 6. perform key in all main menus and ActionLists in other forms
          OtherForms(True);
          OtherForms(False);
    ...
      procedure OtherForms(IsMain: boolean);
      var
        I, J: integer;
        F: TCommonCustomForm;
      begin
        if Done then Exit;
        for I := 0 to Screen.FormCount - 1 do
        if (Screen.Forms[I] <> self) and
           (Screen.Forms[I].Visible) and
           (IsMain xor (Screen.Forms[I] <> Application.MainForm)) then
        begin
          F := Screen.Forms[I];
          for J := F.ChildrenCount - 1 downto 0 do
          begin
            if F.Children[J] is TMainMenu then
              TMainMenu(F.Children[J]).DialogKey(Key, Shift);
            if Key = 0 then
            begin
              Done := True;
              Exit;
            end;
          end;
          TraverseChildren(F);
          if Done then Exit;
        end;
      end;

    т.е. если ShortCut в активном оокне не отработал ищется по всем другим формам.
    Не знаю, для чего это нужно, но в модальном окне такое поведение вызывает мягко говоря недоумение.

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

    Может всетаки есть какой то нормальный споcоб обойти проблему?

    PS. В Berline похоже такаяже хрень.

  9.   TMainWorkPlaceRemoteControlForm = class(TForm)
      private
    ...
        FAlphaBlend: Boolean;
        FAlphaBlendValue: Byte;
        FTransparentColor: Boolean;
        FTransparentColorValue: TColor;
        procedure SetAlphaBlend(const Value: Boolean);
        procedure SetAlphaBlendValue(const Value: Byte);
        procedure SetLayeredAttribs;
        procedure SetTransparentColor(const Value: Boolean);
        procedure SetTransparentColorValue(const Value: TColor);
      public
    ...
        property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend  default False;
        property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue default 255;
        property TransparentColor: Boolean read FTransparentColor write SetTransparentColor default False;
        property TransparentColorValue: TColor read FTransparentColorValue write SetTransparentColorValue;
      end;
    
    implementation
    
    
    
    type
      TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF;
        bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
    
    var
      SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;
    
    
    constructor TMainWorkPlaceRemoteControlForm.Create(AOwner: TComponent);
    begin
    //
      FUIAdapter := TFMXUIAdapter.Create(Self);
      @SetLayeredWindowAttributes := GetProcAddress(GetModuleHandle(User32), 'SetLayeredWindowAttributes');
    end;
    
    procedure TMainWorkPlaceRemoteControlForm.SetAlphaBlend(const Value: Boolean);
    begin
      if FAlphaBlend <> Value then
      begin
        FAlphaBlend := Value;
        SetLayeredAttribs;
      end;
    end;
    
    procedure TMainWorkPlaceRemoteControlForm.SetAlphaBlendValue(const Value: Byte);
    begin
      if FAlphaBlendValue <> Value then
      begin
        FAlphaBlendValue := Value;
        SetLayeredAttribs;
      end;
    end;
    
    procedure TMainWorkPlaceRemoteControlForm.SetLayeredAttribs;
    const
      cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
      cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
    var
      AStyle: Integer;
    begin
      if not (csDesigning in ComponentState) and
        (Assigned(SetLayeredWindowAttributes))  then
      begin
    
        AStyle := GetWindowLong( WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE);
        if FAlphaBlend or FTransparentColor then
        begin
          if (AStyle and WS_EX_LAYERED) = 0 then
            SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
          SetLayeredWindowAttributes(WindowHandleToPlatform(Handle).Wnd, ColorToRGB(FTransparentColorValue), FAlphaBlendValue,
            cUseAlpha[FAlphaBlend] or cUseColorKey[FTransparentColor]);
        end
        else
        begin
          SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle and not WS_EX_LAYERED);
          RedrawWindow(WindowHandleToPlatform(Handle).Wnd, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
        end;
      end;
    end;
    
    procedure TMainWorkPlaceRemoteControlForm.SetTransparentColor(const Value: Boolean);
    begin
      if FTransparentColor <> Value then
      begin
        FTransparentColor := Value;
        SetLayeredAttribs;
      end;
    end;
    
    procedure TMainWorkPlaceRemoteControlForm.SetTransparentColorValue(const Value: TColor);
    begin
      if FTransparentColorValue <> Value then
      begin
        FTransparentColorValue := Value;
        SetLayeredAttribs;
      end;
    end;
    
    

    Под Windows можно так попробовать.

    Правда будет влиять на прозрачность всего окна (с содержимым)

  10. Судя по последней дорожной карте через год 

     

     RAD Studio, Delphi and C++Builder Roadmap - March 2014 

    Features and Technologies After 2014

    ...

    • Linux server support for DataSnap and WebBroker, including RTL and database access 

    Хорошо бы хоть так. Хотя не понимаю, почему бы это не сделать еще год назад - и OSx и Android и так суть Linux.

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