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

slav_z

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

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

  • Посещение

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

    33

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

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

    SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);

    ээээ... прррр... всем успокоиться... сейчас не 90-е... так уже не делают...

    вопрос был "показывается основное окно при закрытии всплывающего"...  тут все дело в том что при закрытии любого окна ищется другое подходящее окно и активируется...  смотрите исходники FMX (unit FMX.Forms; procedure TCommonCustomForm.Close;)

  2. 2 часа назад, #WAMACO сказал:

    Также изначально удивился данной поднятой темой ("убийство кнопки по клику самой себя"), но подумал, может есть какой случай, что это нужно...

    сам НИКОГДА так не делаю! понятно, что это зло! :))

    в FMX очень удобно делать модальные диалоги поверх всей формы. прозрачный layout сверху (по клику закрывается модальная форма - просто разрушается layout со всем содержимым  - 1 случай) конкретное содержимое кладется на него там, конечно, можно расположить кнопку закрытия диалога и все остальное...  по нажатию на эту кнопку также разрушается layout - 2 случай. кнопка разрушается через разрушение своего Owner-а. Но это тоже самое что и разрушить кнопку по нажатию на саму себя.

  3. 1 час назад, #WAMACO сказал:

    Owner - отвечает за жизненный цикл объекта

    Parent - отвечает за расположение в иерархии объектов

    отсюда и плясать надо...

    Owner - отвечает за разрушение "своих" объектов при собственном разрушении.

    Parent отвечает за прорисовку "своих" объектов. Какая еще иерархия объектов? визуальная иерархия - да...  было бы неплохо что бы эта иерархия отвечала и за выравнивание объектов - но нет... не знаю когда в delphi будет нормальное выравнивание... может еще лет 20 подождать...

  4. 54 минуты назад, #WAMACO сказал:

    просто, например, есть кнопка,  Owner будет форма, а Parent  - панель.

    если ничего не трогать, то при разрушении формы, разрушится и кнопка, а при разрушении панели, на которой кнопка,

    кнопка продолжит жить!

    но не в FMX !!! в FMX Parent (панель) при своем разрушении разрушит и кнопку. Вот это неправильно.

  5. 45 минут назад, Brovin Yaroslav сказал:

    А есть вообще понимание:

    1. Что такое Овнер для компонентов в делфи?
    2. Какую роль он играет в дизайнере и в рантайме?

    Я бы сформулировал вопрос по-другому. Чем отличается Owner и Parent? Для чего нужен тот и другой. Почему это разные объекты? Ярослав, дайте пожалуйста четкое пояснение как разработчик FMX. Я думаю многим здесь это будет интересно.

  6. разработчики FMX по каким-то неведомым причинам сделали так, что визуальный контейнер при своем уничтожении так же разрушает и те компоненты, которые отображает (достаточно было просто обнулить Parent). такого никогда не было в VCL. это плохо и неправильно. это работа Owner а не Parent.

    Поробуйте создать элемент Create(Owner) и указать какой-нибудь посторонний Parent не принадлежащий Owner. При разрушении получите AV (сначала элемент будет разрушен Parent-ом а затем то же самое попытается сделать и Owner...  нет там никаких нотификаций и подписок).

    я постараюсь далее не вступить в спор...  но ничего не обещаю...

  7. 59 минут назад, kami сказал:

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

    я про TFrame..  конечно всяким TLable и т.п. имя назначать ни к чему... Фреймы получают имя в designtime и создаются (динамически) с этим именем.

  8. но есть еще проблема:
    Если сразу после Release попытаться создать элемент заново (TFrame), то будет ошибка дублирования имени компонента (старый компонент еще жив в списке компонентов родителя).

    Поэтому кроме Parent := nil (убрать элемент с экрана) еще необходимо Name := '';

    короче...  жуть какая-то.

  9. 17 часов назад, Brovin Yaroslav сказал:

    @kami все правильно написал. Используйте просто ForceQueue. А внутри либо отлинкуйте контрол от родителя и вызовите Free, либо брутально дергайте DisposeOf.

    P.S. документация http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.ForceQueue

    Намного проще оставить в покое метод Release.

  10. FreeAndNil() не подойдет... проблема в том, что после вызова OnClick() далее еще происходят вызовы методов самого объекта (см. исходники FMX.Forms) и если разрушить объект на OnClick, то будет AV (не каждый раз - а как повезет... ).

  11. отдельный поток для "убийства" объекта? брутально!

    вот как сделано в 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;

     

  12. в 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;
    

     

  13. выделение только построчное (одна строка или несколько). Выделение по символам - это сложнее. тоже можно, но в 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

  14. image.png.1fbb6d5d08e9b1bec7874491eea83dcf.png

    Как сделать текст с подобными атрибутами? Очень просто!

    (Цвет текста не работает в 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.

     

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