slav_z

Пользователи
  • Публикаций

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

  • Посещение

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

    4

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

  1. в FMX очень удобно делать модальные диалоги поверх всей формы. прозрачный layout сверху (по клику закрывается модальная форма - просто разрушается layout со всем содержимым - 1 случай) конкретное содержимое кладется на него там, конечно, можно расположить кнопку закрытия диалога и все остальное... по нажатию на эту кнопку также разрушается layout - 2 случай. кнопка разрушается через разрушение своего Owner-а. Но это тоже самое что и разрушить кнопку по нажатию на саму себя.
  2. Owner - отвечает за разрушение "своих" объектов при собственном разрушении. Parent отвечает за прорисовку "своих" объектов. Какая еще иерархия объектов? визуальная иерархия - да... было бы неплохо что бы эта иерархия отвечала и за выравнивание объектов - но нет... не знаю когда в delphi будет нормальное выравнивание... может еще лет 20 подождать...
  3. но не в FMX !!! в FMX Parent (панель) при своем разрушении разрушит и кнопку. Вот это неправильно.
  4. Я бы сформулировал вопрос по-другому. Чем отличается Owner и Parent? Для чего нужен тот и другой. Почему это разные объекты? Ярослав, дайте пожалуйста четкое пояснение как разработчик FMX. Я думаю многим здесь это будет интересно.
  5. разработчики FMX по каким-то неведомым причинам сделали так, что визуальный контейнер при своем уничтожении так же разрушает и те компоненты, которые отображает (достаточно было просто обнулить Parent). такого никогда не было в VCL. это плохо и неправильно. это работа Owner а не Parent. Поробуйте создать элемент Create(Owner) и указать какой-нибудь посторонний Parent не принадлежащий Owner. При разрушении получите AV (сначала элемент будет разрушен Parent-ом а затем то же самое попытается сделать и Owner... нет там никаких нотификаций и подписок). я постараюсь далее не вступить в спор... но ничего не обещаю...
  6. замени TFrame13.Create(nil) на TFrame13.Create(Self) только ради бога не спрашивай зачем... проверка на дублирование имени выполняется родителем... а он у тебя nil.
  7. будет. но вместо := 'frame_'+i.toString; можно просто "обнулить" имя :='';
  8. напугать получилось... дай пять! да не... нет проблем с этим...
  9. да нет смысла... это сложнее чем назначить пустое имя при создании. F:=TFrameClass.Create(Self); F.Name:=''; ...
  10. я про TFrame.. конечно всяким TLable и т.п. имя назначать ни к чему... Фреймы получают имя в designtime и создаются (динамически) с этим именем.
  11. теперь все понятно. спасибо.
  12. но есть еще проблема: Если сразу после Release попытаться создать элемент заново (TFrame), то будет ошибка дублирования имени компонента (старый компонент еще жив в списке компонентов родителя). Поэтому кроме Parent := nil (убрать элемент с экрана) еще необходимо Name := ''; короче... жуть какая-то.
  13. Намного проще оставить в покое метод Release.
  14. FreeAndNil() не подойдет... проблема в том, что после вызова OnClick() далее еще происходят вызовы методов самого объекта (см. исходники FMX.Forms) и если разрушить объект на OnClick, то будет AV (не каждый раз - а как повезет... ).
  15. отдельный поток для "убийства" объекта? брутально! вот как сделано в 10.2.3 : procedure TFmxObject.Release; begin if not (csDestroying in ComponentState) then begin if (Application <> nil) and (Action <> nil) then Application.UnregisterActionClient(Self); Parent := nil; TThread.ForceQueue(nil, procedure begin Self.DisposeOf; end); end; end;
  16. Как сделать текст с подобными атрибутами? Очень просто! (Цвет текста не работает в XE8) Вот весь код: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.TextLayout; type TForm1 = class(TForm) Button1: TButton; Text1: TText; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} type TTextAccess = class(TText); procedure ClearTextAttribute(Text: TText); begin TTextAccess(Text).Layout.ClearAttributes; end; procedure AddTextAttribute(Text: TText; Pos,Length: Integer; FontStyles: TFontStyles; FontColor: TAlphaColor); var Font: TFont; begin Font:=TFont.Create; Font.Assign(Text.Font); Font.Style:=FontStyles; TTextAccess(Text).Layout.AddAttribute( TTextRange.Create(Pos,Length), TTextAttribute.Create(Font,FontColor)); end; procedure TForm1.Button1Click(Sender: TObject); begin AddTextAttribute(Text1,10,17,[TFontStyle.fsBold],claRed); AddTextAttribute(Text1,34,8,[TFontStyle.fsUnderline],claBlue); AddTextAttribute(Text1,47,8,[TFontStyle.fsStrikeOut],claGreen); Text1.Repaint; end; end.
  17. slav_z

    TMemo для вывода лога тормозит

    сделай так чтобы элемент мог принимать фокус ввода CanFocus:=True и обработку нажатия клавиш Ctrl+C.
  18. slav_z

    TMemo для вывода лога тормозит

    да не... я лучше выложу так.. пилите сами... там не долго все это добавить... класс от TFrame. там не TLayout а TText чтобы можно было настраивать шрифт в designtime. короче ничего сложного. LogViewSource.zip
  19. в XE8 как раз и было реализовано через помещение в объект TPurgatory. (удален из 10) он как раз и помещал объект к себе в список и удалял "чуть позже" по таймеру (через 10 мс). unit FMX.Types; type TPurgatory = class (TComponent) public const TimerInterval: Integer = 10; private FInstanceList: TList<Pointer>; FTimerHandle: TFMXHandle; FPlatformTimer: IFMXTimerService; procedure StartTimer; procedure StopTimer; procedure TimerProc; procedure UpdateTimer; protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Clear; procedure Add(const Instance: TFmxObject); procedure Remove(const Instance: TFmxObject); function Contains(const Instance: TFmxObject): Boolean; end;
  20. slav_z

    TMemo для вывода лога тормозит

    выделение только построчное (одна строка или несколько). Выделение по символам - это сложнее. тоже можно, но в 100$ не влезет. посмотрите во вложении EXE. если устроит, то выложу исходники (лично или прям сюда) и только потом 100$ если все устроит. если не устроит - тогда все отдам бесплатно (сюда). Использование: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, Frame.Log; type TForm5 = class(TForm) LogFrame1: TLogFrame; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form5: TForm5; implementation {$R *.fmx} procedure TForm5.FormCreate(Sender: TObject); begin LogFrame1.ReleasedItems:=False; // не удалять "старые" строки end; procedure TForm5.Button2Click(Sender: TObject); begin LogFrame1.Add('One item'); LogFrame1.ScrollTo(MaxInt); end; procedure TForm5.Button3Click(Sender: TObject); begin LogFrame1.Clear; end; procedure TForm5.Button4Click(Sender: TObject); begin LogFrame1.CopyToClipboard; end; procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin LogFrame1.BeginUpdate; try for I:=0 to 100000 do LogFrame1.Add('Item '+I.ToString); finally LogFrame1.EndUpdate; end; LogFrame1.ScrollTo(MaxInt); end; end. LogViewExe.zip
  21. slav_z

    TMemo для вывода лога тормозит

    100$ ? да лаааадно... ща сделаю...
  22. Метод Release объявлен "устаревшим" (10.2.3). Всех поздравляю. Взамен разработчики ничего не предлагают. Теперь корректно разрушить элемент по щелчку на нем не получится. Достаем костыли.
  23. http://fire-monkey.ru/topic/5437-работа-с-атрибутами-текста/
  24. slav_z

    TMemo для вывода лога тормозит

    возьмите TVertScrollBox, положите в него TLayout (align=top) храните строки в TStringList, вычисляйте высоту TLayout при добавлении строк. на событие TLayout.OnPaint рисуйте нужный диапазон строк (Canvas.FillText) опираясь на позицию Viewport скроллбокса. все будет летать.
  25. slav_z

    Win+G (режим игры)

    У меня для приложений написанных на FireMonkey не вызывается меню игры windows. Для VCL все в порядке. XE8. Если у кого есть решение этой проблемы, поделитесь пожалуйста. (комбинация клавиш Win+G при запущенном приложении)