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

ramir

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

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

  • Посещение

Весь контент ramir

  1. Ну что цепляться к этой подсветке. Не будут они ничего делать, т.к. это писалось давным давно (еще на J#), и видимо, никто разобраться уже не может Еще раз посмотрите роадмап - запилят поддержку LSP, тогда и спрашивайте о корректной работе error insight...
  2. Конечно, имелось ввиду выделение и освобождение памяти в разных "местах". И без ...ShareMem будет N менеджеров. Ничего зазорного не вижу, если из DLL получаем динамический массив. Я привел пример Delphi/Builder. В dll выделили, в приложении освободили. Только надо четко понимать как это работает и применять, если нет более простого решения.
  3. Самым прямым. Чтобы менеджер памяти единый был. Тогда можно спокойно использовать GetMem/FreeMem и т.п. Например, приложение может быть, на Delphi, а DLL на Builder-e, внутри которой нужно динамические массивы создавать. Конечно, если используются различные среды, то дельфовые строки и стандартные процедуры выделения/освобождения памяти использовать не стоит. ТС свой сценарий использования dll не описал, поэтому можно пофантазировать...
  4. Кроме работ со строками может потребоваться и память выделять в DLL... Если и приложение и DLL на Delphi то лучше использовать SimpleShareMem Тогда никаких borlndmm.dll не требуется.
  5. https://community.embarcadero.com/blogs/entry/feature-and-bug-fix-list-for-rad-studio-10-1-berlin-subscription-update-2-anniversary-edition
  6. О, извиняюсь, проглядел, прописано . Но все равно. Круто.
  7. Вообщето, удаление в новой версии published св-в и методов - это крутое BC. И чтото в What new про это ничего не нашел, даже мелким шрифтом. Да, поведение на десктопе и мобильной платформе разное, ну тогда может вообще забыть про него, типа все равно ничего дельного сделать нельзя?
  8. Да. Триал. А переходить на новую версию видимо можно только после выхода update (особенно, если существующий проект уже достаточно большой).
  9. В Berlin-e в объявлении published у класса Grid пропала часть обработчиков. Поэтому и возникла указанная ошибка - при открытии формы не находятся обработчики. Явный косяк разработчиков, ну мы не об этом. У меня нет исходников, поэтому я не могу точно сказать, что там за рефакторинг был проведен. В VCL, например, такие обработчики у базового класса в секции protected объявлены. Т.е. если в базовом классе они в секции public, то в моем примере класс TStringGrid = class(FMX.Grid.TStringGrid) не нужен.
  10. А Вы уверены что у базового класса OnDblClick, например, не в protected?
  11. Конечно это... не очень хорошее отношение к продукту, блин.Пока лучше не 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;
  12. Общее впечатление на текущий момент (программирую пока только под Windows): Задумка богатая (типа WPF), но реализация... Уровень создания пользовательского интерфейса на уровне Delphi1-3 :), вон хинты только в Siettle появились. Зато радуют спецэффекты (подсведтки, анимация и т.п.). Grid. Мда. Я бы не рискнул его использовать в приложении где актуальна интенсивная работа с БД. VCL-кий грид и то круче (не говоря про всякие EhLib и т.п.) Одно отсутствие кэширования как в соответствующем DB-avere компоненте. А редактировать непосредственно в нем (по моему) просто невозможно. Постоянно нужно быть готовым ко всяким чудесам (например). Но не смотря на это воспользовался FMX в серьезном проекте. Понравилась работа прежде всего с 3D графикой. Не хотелось заморачиваться с OpenGL(DirectX), сторонними библиотеками. Поэтому мое мнение, если приложение под Win и основная работа с базами - лучше VCL. И при этом стараться максимально разделять визуальную часть от обработки данных. Тогда, если потребуется, можно будет и FMX задействовать, например мобильное приложение как составная часть большой системы
  13. В модальном окне срабатывает 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 похоже такаяже хрень.
  14. 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 можно так попробовать. Правда будет влиять на прозрачность всего окна (с содержимым)
  15. в VCL для использования справки в формате CHM подключал модуль HtmlHelpViewer, который реализовывал IHelpSystem
  16. На Code Central есть ряд примеров, например http://cc.embarcadero.com/Item/29800
  17. Судя по последней дорожной карте через год Хорошо бы хоть так. Хотя не понимаю, почему бы это не сделать еще год назад - и OSx и Android и так суть Linux.
×
×
  • Создать...