slav_z
-
Постов
233 -
Зарегистрирован
-
Посещение
-
Победитель дней
33
Сообщения, опубликованные slav_z
-
-
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; Release; end;
Попробуйте закрывать всплывающее окно так.
-
2 часа назад, #WAMACO сказал:
Также изначально удивился данной поднятой темой ("убийство кнопки по клику самой себя"), но подумал, может есть какой случай, что это нужно...
сам НИКОГДА так не делаю! понятно, что это зло! :))
в FMX очень удобно делать модальные диалоги поверх всей формы. прозрачный layout сверху (по клику закрывается модальная форма - просто разрушается layout со всем содержимым - 1 случай) конкретное содержимое кладется на него там, конечно, можно расположить кнопку закрытия диалога и все остальное... по нажатию на эту кнопку также разрушается layout - 2 случай. кнопка разрушается через разрушение своего Owner-а. Но это тоже самое что и разрушить кнопку по нажатию на саму себя.
-
1 час назад, #WAMACO сказал:
Owner - отвечает за жизненный цикл объекта
Parent - отвечает за расположение в иерархии объектов
отсюда и плясать надо...
Owner - отвечает за разрушение "своих" объектов при собственном разрушении.
Parent отвечает за прорисовку "своих" объектов. Какая еще иерархия объектов? визуальная иерархия - да... было бы неплохо что бы эта иерархия отвечала и за выравнивание объектов - но нет... не знаю когда в delphi будет нормальное выравнивание... может еще лет 20 подождать...
-
54 минуты назад, #WAMACO сказал:
просто, например, есть кнопка, Owner будет форма, а Parent - панель.
если ничего не трогать, то при разрушении формы, разрушится и кнопка, а при разрушении панели, на которой кнопка,
кнопка продолжит жить!
но не в FMX !!! в FMX Parent (панель) при своем разрушении разрушит и кнопку. Вот это неправильно.
-
45 минут назад, Brovin Yaroslav сказал:
А есть вообще понимание:
- Что такое Овнер для компонентов в делфи?
- Какую роль он играет в дизайнере и в рантайме?
Я бы сформулировал вопрос по-другому. Чем отличается Owner и Parent? Для чего нужен тот и другой. Почему это разные объекты? Ярослав, дайте пожалуйста четкое пояснение как разработчик FMX. Я думаю многим здесь это будет интересно.
-
разработчики FMX по каким-то неведомым причинам сделали так, что визуальный контейнер при своем уничтожении так же разрушает и те компоненты, которые отображает (достаточно было просто обнулить Parent). такого никогда не было в VCL. это плохо и неправильно. это работа Owner а не Parent.
Поробуйте создать элемент Create(Owner) и указать какой-нибудь посторонний Parent не принадлежащий Owner. При разрушении получите AV (сначала элемент будет разрушен Parent-ом а затем то же самое попытается сделать и Owner... нет там никаких нотификаций и подписок).
я постараюсь далее не вступить в спор... но ничего не обещаю...
-
-
будет. но вместо := 'frame_'+i.toString; можно просто "обнулить" имя :='';
-
18 минут назад, krapotkin сказал:
С пустым именем может вообще не пустить. Точно помню...
напугать получилось... дай пять! да не... нет проблем с этим...
-
4 минуты назад, #WAMACO сказал:
сделай "генератор имен" компонентов! и при создании назначай!
да нет смысла... это сложнее чем назначить пустое имя при создании.
F:=TFrameClass.Create(Self); F.Name:=''; ...
-
59 минут назад, kami сказал:
помнится, отвечал уже кому-то на форуме. Для динамически создаваемых компонентов просто не указывайте имя. Не нужно оно им. Тогда эта проблема отпадает сама собой.
я про TFrame.. конечно всяким TLable и т.п. имя назначать ни к чему... Фреймы получают имя в designtime и создаются (динамически) с этим именем.
-
-
но есть еще проблема:
Если сразу после Release попытаться создать элемент заново (TFrame), то будет ошибка дублирования имени компонента (старый компонент еще жив в списке компонентов родителя).Поэтому кроме Parent := nil (убрать элемент с экрана) еще необходимо Name := '';
короче... жуть какая-то.
-
17 часов назад, Brovin Yaroslav сказал:
@kami все правильно написал. Используйте просто ForceQueue. А внутри либо отлинкуйте контрол от родителя и вызовите Free, либо брутально дергайте DisposeOf.
P.S. документация http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.ForceQueue
Намного проще оставить в покое метод Release.
-
FreeAndNil() не подойдет... проблема в том, что после вызова OnClick() далее еще происходят вызовы методов самого объекта (см. исходники FMX.Forms) и если разрушить объект на OnClick, то будет AV (не каждый раз - а как повезет... ).
-
отдельный поток для "убийства" объекта? брутально!
вот как сделано в 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;
-
сделай так чтобы элемент мог принимать фокус ввода CanFocus:=True и обработку нажатия клавиш Ctrl+C.
-
да не... я лучше выложу так.. пилите сами... там не долго все это добавить...
класс от TFrame. там не TLayout а TText чтобы можно было настраивать шрифт в designtime.
короче ничего сложного.
-
в 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;
-
выделение только построчное (одна строка или несколько). Выделение по символам - это сложнее. тоже можно, но в 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.
-
100$ ? да лаааадно... ща сделаю...
-
Метод Release объявлен "устаревшим" (10.2.3). Всех поздравляю. Взамен разработчики ничего не предлагают. Теперь корректно разрушить элемент по щелчку на нем не получится. Достаем костыли.
-
-
Как сделать текст с подобными атрибутами? Очень просто!
(Цвет текста не работает в 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.
Всплывающее сообщение при его закрытии разворачивает приложение
в Сворачивание, разворачивание и FullScreen
Опубликовано
ээээ... прррр... всем успокоиться... сейчас не 90-е... так уже не делают...
вопрос был "показывается основное окно при закрытии всплывающего"... тут все дело в том что при закрытии любого окна ищется другое подходящее окно и активируется... смотрите исходники FMX (unit FMX.Forms; procedure TCommonCustomForm.Close;)