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

AngryOwl

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

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

  • Посещение

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

    45

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

  1. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  2. Like
    AngryOwl получил реакцию от dnekrasov в Как не показывать главное окно до полной его отрисовки?   
    Мне это видится примерно так:
    Отключите автоматическое создание форм.
    Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.
    Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).
    На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма
    и скройте Splash-форму.
     
    З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!
  3. Like
    AngryOwl отреагировална ENERGY в Создать БД с помощью SQLite   
    C++ 
     
  4. Like
    AngryOwl отреагировална Rusland в Создать БД с помощью SQLite   
    Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
  5. Like
    AngryOwl отреагировална bigjorj в Создать БД с помощью SQLite   
    Например так:
    procedure CreateArhivTables(CreateDatabaseName: string); var TableToCreate: TFDQuery; begin TableToCreate := TFDQuery.Create(nil); TableToCreate.ConnectionName := CreateDatabaseName; try TableToCreate.SQL.Clear; TableToCreate.SQL.Add('create table if not exists Marks(' +' Mark text primary key, ' +' CheckData text);'); TableToCreate.ExecSQL; end;  
  6. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Как заполнить эллипс?   
    для заливки используется 
    Canvas.Fill.Color := цвет; Canvas.FillEllipse();  
  7. Like
    AngryOwl получил реакцию от dnekrasov в Конфликт Hint и BorderStyle   
    Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
    Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
    Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
    Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
    Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
  8. Like
    AngryOwl отреагировална sviat9440 в Форма не сворачивается при клике на иконке в панели задач   
    Вроде нашел решение проблемы.
     
    FMX.Platform.Win.zip
  9. Like
    AngryOwl получил реакцию от Winexcel в Локализация приложений   
    Друзья!
    Я тут в одной теме выложил юнит для локализации приложений и демо-пример к нему, а также приложение облегчающее создание и редактирование ресурсов для локализации (файлов с переводами на разные языки).
    Потом подумал - может стоит вынести это в отдельную тему?
    Данная проблема (локализации приложений) возникла уже давно. На заре XE2. Потом были все версии, вплоть до текущей. Но лично меня текущие решения так и не  устраивали. Мне нужно было простое и удобное редактирование сразу всех языков приложения, и чтобы быстро работало.
    Тогда и были созданы этот юнит и приложения, с которыми я решил с вами поделиться. Создано это было для себя, для упрощения локализации собственных приложений. Поэтому никакой "красоты" кода прошу не искать - ее там нет. Местами вообще кому-то покажется "кривым"... )
    Очень жаль, что у меня критически мало времени для общения на данном ресурсе, а потому я в некотором смысле извиняюсь - мог бы выложить этот код давно.
    Тем-более, что он очень простой. Все что в нем используется, и как используется, думаю, всем будет доступно и понятно.
     
    Итак.
    Приложение Test_Translator - это дело пример с, непосредственно, самим юнитом uTranslatorFM.pas
    В uTranslatorFM.pas вы увидите, что локализация осуществлена за счет использования INI-файлов, а сам "перевод" осуществляется простым перебором компонент на форме.
    Стоит отметить, что перевод осуществляется использованием свойства компонент HelpContext (integer), а у компонент, что не имеют этого свойства - используется свойство Tag.
    На первый взгляд может показаться неудобным. А если приложение большое - что-то может забыться. Однако, лично я очень быстро привык к такому использованию. И поверьте  - приложение, в котором я использую этот юнит, очень большое! )))
    Кроме того, если есть компоненты, которые не имеют этих свойств, или которые могут менять значение перевода самостоятельно, либо могут быть динамическими - можно использовать нулевой HelpContext, но при этом придавать им значения "вручную".
    Например: если требуется у компонента TLabel динамически менять значение в ходе выполнения программы, подставляя нужные "подстроки" (грубо - используя, например, Format(...)), то можно написать в программе
    Label1.Text := Format( AppTranslator.GetValue(_код_, _значение_по_умолчанию_), [_подставляемое_значение_]); где
    _код_ - это значение, которое будет считываться из INI-файла (например 100)
    _значение_по_умолчанию_ - значение строки по умолчанию, на тот случай, если данный текст отсутствует в INI-файле, или файла с таким переводом не существует (этот параметр не обязателен)
    _подставляемое_значение_ - в данном случае это просто пример, допустим - ход выполнения процесса (например 85%)
    А строка в INI-файле может быть такая:
    (файл lang.ru)
    100=Процесс выполнения %d%%
    (файл lang.en)
    100=The progress %d%%
    и также другие языки.
    Думаю тут, в примере, все элементарно и понятно.
    Все работает на любой платформе!
    Как вы будете подключать файлы к приложению - ваше дело. Можно скачивать с инета, можно встроить в качестве ресурсов, задеплоить в проект и т.д.
    Лично я встраиваю в качестве ресурсов (Win) и деплою (Mac и Android). У меня свои причины и аргументы.
    Файлы:
    Lang.ru
    Lang.en
    и другие, это INI-файлы соответствующих переводов где строки с переводами имеют одинаковые индексы
    LangList.ini - вспомогательный файл (разберетесь))
    language.rc - файл для создания ресурса (Win)
     
    С приложением SLLanguage все немного и сложнее и проще, одновременно...
    Не вижу смысла его описывать - оно просто позволяет редактировать описанные выше ресурсы (файлы языков).
    Часть его кода откуда-то позаимствовано (не помню уже).
     
    Для чего все это я отдельно решил написать, в отдельную тему?
    Предлагаю всем пользоваться данным кодом - кому как заблагорассудится! Исправлять, дополнять и делится мыслями и идеями.
    Возможно кто-то решит создать компонент.
    Ну вот вроде все, друзья!
    Если что - спрашивайте! Отвечу по мере возможности.
    P.S. К модераторам - поправьте, если что, - вдруг не в ту тему закинул.
    SLLanguage.zip
    Test_Translator.zip
    P.P.S. Забыл уточнить - дело-пример делал под XE10, а приложение для создания ресурсов под XE7. Не сложно поправить - кому под что нужно.
  10. Like
    AngryOwl отреагировална AliZairov в CrossVCL Beta XE3-Berlin   
    Hi. New tools for Delphi IDE. Using CrossVcl you focus only on your VCL application and CrossVcl makes it cross-platform.
    This is beta software only for testing purpose. CrossVcl on early stage of development, what are to test in this release:

    * Installation process (CrossVcl creates copy and patches existing on your machine Vcl and Rtl sources, all original sources stay unmodified)
    * Upgrading simple or new Vcl project to macOS (Right Click on Project in Project Inspector)
    * Compilation and deploying of simple project

    Please do not create bug-report if you can't compile or launch big Vcl projects or any third-party controls at this stage.

    Bug reports and suggestions welcome at:
    https://bitbucket.org/crossvcl/crossvcl/issues

    We help you on:
    http://stackoverflow.com/questions/tagged/crossvcl

    Google+:
    https://plus.google.com/109334532832375082802

    Facebook:
    https://www.facebook.com/crossvcl

    Twitter:
    https://twitter.com/VclCross
    Home
  11. Like
    AngryOwl отреагировална krapotkin в Частичная прозрачность   
    png с дыркой вне конкуренции...
  12. Like
    AngryOwl отреагировална ENERGY в Частичная прозрачность   
    Самый простой вариант - нарисовать в обычном графическом редакторе нужный прямоугольник с дыркой и сохранить его в png.
    Сложный вариант копать сторону TPath - - по факту это SVG формат, векторная графика. Можно сделать вот как на видео (обвести иконки, создать path и закинуть SVG данные вTPath). 
    Только вот я не знаю в какой программе это делать, если узнаете подскажите тоже в этой теме.
     
     
     http://www.webdelphi.ru/2012/04/firemonkey-2/
     
     
     
  13. Like
    AngryOwl отреагировална Andrey Efimov в opendialog для папок   
    Так не устраивает?
    procedure TFormMain.sbSelectFolderClick(Sender: TObject); var PathFolder: string; begin if SelectDirectory('Выбор папки...', '', PathFolder) then ePathFolder.Text := PathFolder; end; SelectDirectory
  14. Like
    AngryOwl отреагировална Andrey Efimov в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    Ссылка: http://delphifmandroid.blogspot.ru/2016/02/alarmmanager-rad-studio.html
    Автор: Ефимов Андрей
    Описание: [AlarmManager] Автозапуск приложения в назначенное время
  15. Like
    AngryOwl отреагировална Kitty в krapotkin и Равиль Зарипов   
    Даже не знаю или в правильный раздел форума пишу. Я, например, хочу поблагодарить в своей теме - krapotkin и Равиль Зарипов за очень полезные ответы. Реально помогают решить вопросы. Спасибо.
    Хотя все они паскалисты, все же удается иногда получить код на С++ со стороны. Очень в этом помогает автор Indy rlebeau, например эту статью: Статья 
    он переводит в С++ тут: C++  и никто бы другой не помог. В этом плане тяжело, без него и никак вопрос не решить.
    А этот форум это симбиоз ума и решений! Спасибо Ярославу за реализацию и хоты бы одного спеца по С++ как по Дельфи и - вот оно счастье.
    Спасибо!
     
     
  16. Like
    AngryOwl получил реакцию от Rusland в FMX TTaskbar   
    Самое простое решение ("на коленке"):
    uses ... {$IFDEF MSWINDOWS} System.Win.ComObj, Winapi.ShlObj, {$ENDIF} ... //------------------------------------------------- type TTaskBarState = record name : string; value : byte; end; TFMXTaskBar = class(TPersistent) private fTaskBarList : ITaskBarList3; fTaskBarState : integer; fTaskBarProgress : integer; fAlertState : Boolean; procedure setTaskBarState(newState:integer); procedure setTaskBarProgress(newValue : integer); procedure setAlertState(const Value: Boolean); protected public property AlertState: Boolean read fAlertState write setAlertState; property TaskBarState : integer read fTaskBarState write setTaskBarState; property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress; constructor Create; destructor Destroy; override; end; //------------------------------------------------- const taskStates : array [0..4] of TTaskBarState = ( (name: 'TBPF_NOPROGRESS'; value: TBPF_NOPROGRESS), (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE), (name: 'TBPF_NORMAL'; value: TBPF_NORMAL), (name: 'TBPF_ERROR'; value: TBPF_ERROR), (name: 'TBPF_PAUSED'; value: TBPF_PAUSED)); //------------------------------------------------- var MainTaskBar: TFMXTaskBar; //------------------------------------------------- { TFMXTaskBar } constructor TFMXTaskBar.Create; var tbList : ITaskBarList; hr : HRESULT; begin tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList; hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList); if hr <> S_OK then begin fTaskBarList := nil; tbList._Release; end; end; destructor TFMXTaskBar.Destroy; begin inherited; end; procedure TFMXTaskBar.setAlertState(const Value: Boolean); begin if assigned(fTaskBarList) then if fAlertState <> Value then begin fAlertState := Value; if Value then begin setTaskBarState(3); // TBPF_ERROR setTaskBarProgress(100); end else begin setTaskBarState(0); setTaskBarProgress(0); end; end; end; procedure TFMXTaskBar.setTaskBarProgress(newValue: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100); end; procedure TFMXTaskBar.setTaskBarState(newState: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value); end; //------------------------------------------------- initialization MainTaskBar := TFMXTaskBar.Create; finalization if Assigned(MainTaskBar) then FreeAndNil(MainTaskBar);  
  17. Like
    AngryOwl отреагировална RoschinSpb в Уничтожение фрейма при нажатии на кнопку   
    В качестве послесловия.
    Деструктор объекта не может быть вызван внутри метода этого объекта (самоубийства запрещены). Всегда можно поставить точку останова на вызов метода Free/FreeAndNil. И внимательно посмотреть стек вызова, если где-то в стеке вызова присутствует разрушаемый объект, то это не правильно. Сложности добавляет то, что это не обязательно приводит возникновению AV, вполне может быть, что у вас всё будет работать без ошибок, а на другом компьютере, или на другой платформе с ошибками.
    Release на самом деле приводит к отложенному удалению не внутри вызывающего метода, т.е. объект просто помечается как готовый к удалению.
  18. Like
    AngryOwl получил реакцию от Rusland в Уничтожение фрейма при нажатии на кнопку   
    у фрейма:
    private fOnCloseInfo : TNotifyEvent; protected procedure DoOnCloseInfo; dynamic; public { Public declarations } /// <summary> Обработчик события закрытия фрейма </summary> property OnCloseInfo : TNotifyEvent read fOnCloseInfo write fOnCloseInfo; end; procedure TframeInfo.DoOnCloseInfo; begin // Если обработчик назначен, то запускаем его. if Assigned(fOnCloseInfo) then fOnCloseInfo(Self); end; при инициализации фрейма (не важно где и как - когда создается):
    frameInfo.OnCloseInfo := fmMain.DoOnCloseInfo; при нажатии на кнопку:
    DoOnCloseInfo; в главной (или любой другой форме, которая будет отрабатывать нажатие кнопки во фрейме):
    // можно в любой секции, смотря что нам нужно procedure DoOnCloseInfo(Sender: TObject); procedure TfmMain.DoOnCloseInfo(Sender: TObject); begin if Assigned(frameInfo) then FreeAndNil(frameInfo); end; типа так...
  19. Like
    AngryOwl получил реакцию от rareMax в FMX TTaskbar   
    Самое простое решение ("на коленке"):
    uses ... {$IFDEF MSWINDOWS} System.Win.ComObj, Winapi.ShlObj, {$ENDIF} ... //------------------------------------------------- type TTaskBarState = record name : string; value : byte; end; TFMXTaskBar = class(TPersistent) private fTaskBarList : ITaskBarList3; fTaskBarState : integer; fTaskBarProgress : integer; fAlertState : Boolean; procedure setTaskBarState(newState:integer); procedure setTaskBarProgress(newValue : integer); procedure setAlertState(const Value: Boolean); protected public property AlertState: Boolean read fAlertState write setAlertState; property TaskBarState : integer read fTaskBarState write setTaskBarState; property TaskBarProgress : integer read fTaskBarProgress write setTaskBarProgress; constructor Create; destructor Destroy; override; end; //------------------------------------------------- const taskStates : array [0..4] of TTaskBarState = ( (name: 'TBPF_NOPROGRESS'; value: TBPF_NOPROGRESS), (name: 'TBPF_INDETERMINATE'; value: TBPF_INDETERMINATE), (name: 'TBPF_NORMAL'; value: TBPF_NORMAL), (name: 'TBPF_ERROR'; value: TBPF_ERROR), (name: 'TBPF_PAUSED'; value: TBPF_PAUSED)); //------------------------------------------------- var MainTaskBar: TFMXTaskBar; //------------------------------------------------- { TFMXTaskBar } constructor TFMXTaskBar.Create; var tbList : ITaskBarList; hr : HRESULT; begin tbList := CreateComObject(CLSID_TaskBarList) as ITaskBarList; hr := tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList); if hr <> S_OK then begin fTaskBarList := nil; tbList._Release; end; end; destructor TFMXTaskBar.Destroy; begin inherited; end; procedure TFMXTaskBar.setAlertState(const Value: Boolean); begin if assigned(fTaskBarList) then if fAlertState <> Value then begin fAlertState := Value; if Value then begin setTaskBarState(3); // TBPF_ERROR setTaskBarProgress(100); end else begin setTaskBarState(0); setTaskBarProgress(0); end; end; end; procedure TFMXTaskBar.setTaskBarProgress(newValue: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressValue(ApplicationHWND, newValue, 100); end; procedure TFMXTaskBar.setTaskBarState(newState: integer); begin if assigned(fTaskBarList) then fTaskBarList.SetProgressState(ApplicationHWND, taskStates[newState].value); end; //------------------------------------------------- initialization MainTaskBar := TFMXTaskBar.Create; finalization if Assigned(MainTaskBar) then FreeAndNil(MainTaskBar);  
  20. Like
    AngryOwl отреагировална kami в Уничтожение фрейма при нажатии на кнопку   
    Нет, не пойдет. Потому что DoOnCloseInfo по прежнему вызывается из внутренностей TButton.Click. Если ваш код отрабатывает на Windows - это ваша недоработка, а не показатель правильности. Причины я изложил выше. А на мобильных платформах с фреймом визуально просто ничего не произойдет. Причины опять-таки изложил выше.
    И в таком виде тоже не пойдет.
    Потому что Synchronize и Queue, будучи вызванными из главного потока, моментально передают управление в метод, а не дожидаются очередного витка выборки сообщений у Application. В таком виде вы просто добавляете несколько вложенных вызовов, увеличивая занятость стека. Не меняя при этом концепцию работы.
  21. Like
    AngryOwl отреагировална egorea1999 в Быстродействие при использовании TCrititcalSection и TThread   
    Как-то вы поступили очень грубо
    В ваших целях достаточно было воспользоваться директивами препроцессора:
    http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsmemoryallocsizes_xml.html
     
    type TTh = class(TThread) protected procedure Execute; override; end; implementation procedure Do; var I: Integer; begin for I := 1 to 5000 do TTh.Create(False); end; { TTh } {$M 16384, 65535} procedure TTh.Execute; begin while True do Sleep(50); end;  
  22. Like
    AngryOwl отреагировална dnekrasov в [Windows] Глобальный хук на клавиши возможно ли FMX   
    Легче всего, по моему мнению, сделать так:
    ... FWnd := AllocateHWnd(WindowProc); ... procedure WindowProc(var AMsg: TMessage); begin case AMsg.Msg of WM_HOTKEY: case TWMHotKey(AMsg).hotkey of 1: ...; 2: ...; ... end; end; end; ... RegisterHotkey(FWnd, ...); // как обычно в VCL ... UnregisterHotkey(...); // как обычно в VCL ...  
  23. Like
    AngryOwl отреагировална Error в FMX TTaskbar   
    Самое очевидное, посмотреть как реализован TTaskBar и сделать аналог для FMX, или сильно урезанный аналог с необходимым вам функционалом.
  24. Like
    AngryOwl отреагировална Andrey Efimov в Возможна работа с паролем в Tzipfile?   
    По ссылке, в первом посте, я как раз упоминал Zip4J, более того даже пример выкладывал. Но Zip4J подходит для андроида.
    Про Winsoft, опять же с того момента, когда писал заметку, ничего не изменилось, всё также не понятно за что платить им, если они используют в своём компоненте только эту либу, проще скачать её и добавить в проект самостоятельно. Пример использования можно глянуть тут Расширенные возможности работы с zip файлами, бесплатно и без СМС (заметка негодования, так что можно не читать, просто скачать пример
     
    p.s. Тут похоже ТС'у желательно найти универсальную либу, но я таких не встречал.
  25. Like
    AngryOwl отреагировална Error в ErrorSoft TurboUpdate - Автообновление ваших Windows приложений   
    Выложена альфа версия ErrorSoft TurboUpdate - библиотека для легкого добавления автообновления в ваши FMX и VCL приложения под Windows.
    Совместимость - Delphi Seattle и выше.
    Описания пока нет, но в репозитории есть примеры для ознакомления.
    Лицензирование - для OpenSource и не коммерческого использования данная библиотека абсолютно бесплатна, допустимо изменение и т.д.
    Для коммерческого применения - пока нет решения.
    https://github.com/errorcalc/TurboUpdate
    Перед использованием необходимо установить необходимые Packages:
    TurboUpdateFmxOnly.groupproj - FMX only. TurboUpdateGroup.groupproj - VCL + FMX, зависит от ErrorSoftVclComponents(https://github.com/errorcalc/FreeEsVclComponents). Это ранняя альфа, необходимы ваши отзывы, критика и т.д.
×
×
  • Создать...