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

Шамсуддин

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

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

  • Посещение

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

    2

Активность репутации

  1. Like
    Шамсуддин отреагировална krapotkin в Material design shadow   
    Столкнулся с необходимостью генерировать тень в соответствии с material design guide 
    дополнительное условие - тень нужна не привязанная к контролу,  т.е. просто прицепить TShadowEffect нельзя
    интернет сказал мне, что одной тени недостаточно, стал ставить эксперименты с двумя.
    эмпирически подобрал алгоритм и параметры, которые дают довольно близкий к гайду результат
    1. https://material.io/design/environment/light-shadows.html#shadows

    2. мой скриншот

    положил сюда https://bitbucket.org/vkrapotkin/vkshadowgenerator
    Механизм работы понятен из приложенного примера.
    В принципе можно применять те же параметры и к обычным TShadowEffect
     
  2. Thanks
    Шамсуддин отреагировална slav_z в Работа с атрибутами текста   
    Как сделать текст с подобными атрибутами? Очень просто!
    (Цвет текста не работает в 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.  
  3. Like
    Шамсуддин получил реакцию от Ingalime в Замена текста в Word и OpenDocument   
    Доброго времени суток!
    Сделал простенький компонент для замены текста в документах Word (docx) и OpenDocument (odt). Особенностью данного компонента является отсутствие необходимости какого-либо дополнительного ПО типа MS Office или OpenOffice и использует только встроенные библиотеки. В связи с чем он может работать на различных платформах (но ещё не проверял  ).
    DocumentProcessing.zip
    Как использовать:
    uses DocumentProcessing; ... procedure TForm2.Button1Click(Sender: TObject); var Document: TDocumentProcessor; begin Document:= TDocumentProcessor.Create(Self); Document.FilePath:= 'D:\test.docx'; Document.Open(TDocumentKind.dkDocx); Document.ReplaceText('Familiya', 'Cat'); Document.Save; Document.Open('D:\test.odt', TDocumentKind.dkOdt); Document.ReplaceText('Familiya', 'Cat', [rfReplaceAll]); Document.Save; end;  
    Немного о принципе работы:
    Проблемы:
     
  4. Thanks
    Шамсуддин получил реакцию от Barbanel в Замена текста в Word и OpenDocument   
    Доброго времени суток!
    Сделал простенький компонент для замены текста в документах Word (docx) и OpenDocument (odt). Особенностью данного компонента является отсутствие необходимости какого-либо дополнительного ПО типа MS Office или OpenOffice и использует только встроенные библиотеки. В связи с чем он может работать на различных платформах (но ещё не проверял  ).
    DocumentProcessing.zip
    Как использовать:
    uses DocumentProcessing; ... procedure TForm2.Button1Click(Sender: TObject); var Document: TDocumentProcessor; begin Document:= TDocumentProcessor.Create(Self); Document.FilePath:= 'D:\test.docx'; Document.Open(TDocumentKind.dkDocx); Document.ReplaceText('Familiya', 'Cat'); Document.Save; Document.Open('D:\test.odt', TDocumentKind.dkOdt); Document.ReplaceText('Familiya', 'Cat', [rfReplaceAll]); Document.Save; end;  
    Немного о принципе работы:
    Проблемы:
     
  5. Like
    Шамсуддин отреагировална Владимир Б. в TInstructor - Step-By-Step инструкция   
    Собственно понадобился подобный компонент для FMX, но готового решения найти не смог - пришлось ваять свой.
     
    Использовать проще простого:
    var scenaries: TDictionary<TFmxObject, string>; begin scenaries := TDictionary<TFmxObject, string>.Create; scenaries.Add(btn_1, '1 Button'); scenaries.Add(btn_2, '2 Button'); scenaries.Add(btn_3, '3 Button'); scenaries.Add(rctngl, 'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'#13#10'Rectangle'); scenaries.Add(pnl_1, 'Panel Panel Panel Panel Panel Panel Panel Panel Panel Panel'#13#10'Panel'); scenaries.Add(nil, 'Msg without target control!'); try instructor.LoadSteps(scenaries); finally FreeAndNil(scenaries); end;  
    Репозиторий GitHub: https://github.com/ange007/TInstructor/

  6. Thanks
  7. Like
    Шамсуддин получил реакцию от krapotkin в Как убить кнопку кликнув на нее саму   
    Перепроверил 3 раза на андроид.
    Первый раз без Sleep:
    TTask.Run(procedure begin TThread.Synchronize(nil, procedure begin FBackgroundLayout.Free; //FBackgroundLayout - родительский элемент end); end); Получил Access violation сразу при нажатии на кнопку.

    Второй раз так:
    TTask.Run(procedure begin Sleep(100); TThread.Synchronize(nil, procedure begin FBackgroundLayout.Free; end); end); При первом нажатии исключений нет, но FBackgroundLayout не удаляется(визуально) и соответственно на кнопку можно нажать ещё раз после чего сразу получаем AV, оно и понятно.
     Третий раз, уже основываясь на ваших сообщениях, о том, что нужно везде удалять ссылки, сделал так:
    TTask.Run(procedure begin Sleep(100); TThread.Synchronize(nil, procedure begin FBackgroundLayout.Parent.RemoveObject(FBackgroundLayout); FBackgroundLayout.Free; FBackgroundLayout:= nil; end); end); И теперь все работает.
     
    В моём случае, необходимости удаления подобным образом не было, поскольку ссылки на тот объект я в своём коде не хранил, а потому способ с DisposeOf работал. Но думаю, третий вариант использовать всё же лучше.
     
    UPD. Сделал четвертую проверку, перечитав ваше сообщение ещё раз) . Убрал поток:
    FBackgroundLayout.Parent.RemoveObject(FBackgroundLayout); FBackgroundLayout.Free; FBackgroundLayout:= nil; //Ну или FreeAndNil(FBackgroundLayout) И оно заработало! И без каких-либо ошибок.
     
    UPD 2. Теперь точно всё) Я вспомнил зачем создавал поток и ставил Sleep. Дело в том, что в Windows приложении, если при нажатии на кнопку удалить его сразу, то не будет сообщения о том, что произошло "MouseUp" кнопки, в связи с чем, рамки приложения (т.е. кнопки сворачивание, закрыть и т.д.) не реагируют на нажатия мыши до того, пока не нажмете на "нажимаемый" элемент в самом приложении. И потому 4 вариант не подходит для Windows приложений.
  8. Thanks
    Шамсуддин отреагировална krapotkin в Как убить кнопку кликнув на нее саму   
    нет никакой подстраховки)). не надо чудесизировать исполнение программы
    обработчик работает в главном потоке, и наша задача - дать ему с гарантией завершиться! исключительно для этого мы вызываем Synchronize() из другого потока
    программа придет туда не абы когда а только после выполнения всех текущих работ основного потока. То же самое можно достигнуть в windows сделав postMessage()
    Ну и создание объекта подчиняется тем же условиям. Если он РЕАЛЬНО не удалился, то самостоятельно убив его через DisposeOf, мы получим с большой вероятностью AV из-за того, что где-то ссылка на него еще есть!
     
  9. Thanks
    Шамсуддин отреагировална krapotkin в Как убить кнопку кликнув на нее саму   
    Если правильно все было сделано, то арк работает ровно так же как и ранее. Создал объект - удали ссылки на него и сделай free. Ровно как и всегда
  10. Thanks
    Шамсуддин отреагировална FAN в Получить файлы reg_ibtogo.txt или reg_iblite.txt   
    Файлы устанавливаются tools-getit-iblite
    http://blog.marcocantu.com/blog/2018-july-iblite-package-with-license-file.html
  11. Thanks
    Шамсуддин отреагировална AngryOwl в Отпечатки пальцев   
    Посмотрите в сторону "оберток". Например тут. Там есть файл android.hardware.fingerprint.pas (и не только). Вроде бы, есть все, что нужно. А уж как все это использовать - это другой вопрос, смотрите примеры.
  12. Like
    Шамсуддин отреагировална Brovin Yaroslav в [DX10.1][Android][TMultiView] Как убрать белую полоску у TMutiView?   
    В Токио в TMultiView имеет специальное свойство, которое позволяет настроить цвет этой линии или скрыть ее совсем.
    TMultiView.BorderOptions  
  13. Like
    Шамсуддин отреагировална AngryOwl в Не происходит событие отжатия кнопки мыши   
    Можно. Используйте события не OnClick или OnItemClick и т.д., а событие OnMouseUp у самого TListBox.
    Типа так:
    procedure TfmMain.lbxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var LI : TListBoxItem; p : TPointF; begin if Assigned(Sender as TListBox) then begin LI := TListBox(Sender).ItemByPoint(X, Y); if Assigned(LI as TListBoxItem) then begin LI.IsSelected := True; TTask.Run(procedure begin if Button = TMouseButton.mbLeft then Do_какая-то_процедура(LI.Index) // просто пример else if Button = TMouseButton.mbRight then TThread.Synchronize(nil, procedure begin p := MessageEvent.GetMousePos; PopupMenu1.Popup(p.X, p.Y); // для вызова контекстного меню выделенного ListBoxItem end); end); end; end; end; P.S. Отмечу, что использовал TTask и TThread.Synchronize далеко не случайно!
    Во-первых TTask.Run запустит ваш обработчик нажатия на выделенный элемент в отдельном потоке, что не будет "тормозить" "выделение" самого ListBoxItem и вообще), а во-вторых - "внутри" вызванного потока сделал синхронизацию с основным потоком, при выводе контекстного меню для ListBoxItem, так как это гарантирует корректную работу с GUI в FMX.
  14. Like
    Шамсуддин отреагировална POV в Максимальный размер для компонентов   
    Алигн не помеха Маржину. 
    procedure TForm1.FormResize(Sender: TObject); begin   if (Form1.ClientWidth > 500) then     Memo1.Margins.Right := Form1.ClientWidth-500   else     Memo1.Margins.Right := 0 end;  
  15. Like
    Шамсуддин отреагировална kami в Многодокументое приложение   
    Кто вам такое сказал?
    Всё зависит от дизайна приложения. Фрейм делается, если какой-либо участок интерфейса:
    а) используется в нескольких местах, дабы не дублировать код и dfm
    б) если он занимает не всю форму, а ее часть и при этом обладает законченной или разветвленной логикой.
  16. Like
    Шамсуддин отреагировална Brovin Yaroslav в Использование двух стилей в приложении...   
    Зависит от системы, НО в FireMonkey можно сделать свой стиль рамки окна для Windows и в том числе разместить в шапке окна свои компоненты.
  17. Like
    Шамсуддин отреагировална kami в Многодокументое приложение   
    Фреймы с разделением логики работы между ними спасут отца русской демократии.
×
×
  • Создать...