-
Постов
394 -
Зарегистрирован
-
Посещение
-
Победитель дней
45
Активность репутации
-
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 - обводка
-
AngryOwl получил реакцию от dnekrasov в Как не показывать главное окно до полной его отрисовки?
Мне это видится примерно так:
Отключите автоматическое создание форм.
Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.
Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).
На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма
и скройте Splash-форму.
З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!
-
-
AngryOwl отреагировална Rusland в Создать БД с помощью SQLite
Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
-
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;
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Как заполнить эллипс?
для заливки используется
Canvas.Fill.Color := цвет; Canvas.FillEllipse();
-
AngryOwl получил реакцию от dnekrasov в Конфликт Hint и BorderStyle
Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз!
Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ...
Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio.
Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE.
Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
-
AngryOwl отреагировална sviat9440 в Форма не сворачивается при клике на иконке в панели задач
Вроде нашел решение проблемы.
FMX.Platform.Win.zip
-
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. Не сложно поправить - кому под что нужно.
-
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
-
-
AngryOwl отреагировална ENERGY в Частичная прозрачность
Самый простой вариант - нарисовать в обычном графическом редакторе нужный прямоугольник с дыркой и сохранить его в png.
Сложный вариант копать сторону TPath - - по факту это SVG формат, векторная графика. Можно сделать вот как на видео (обвести иконки, создать path и закинуть SVG данные вTPath).
Только вот я не знаю в какой программе это делать, если узнаете подскажите тоже в этой теме.
http://www.webdelphi.ru/2012/04/firemonkey-2/
-
AngryOwl отреагировална Andrey Efimov в opendialog для папок
Так не устраивает?
procedure TFormMain.sbSelectFolderClick(Sender: TObject); var PathFolder: string; begin if SelectDirectory('Выбор папки...', '', PathFolder) then ePathFolder.Text := PathFolder; end; SelectDirectory
-
AngryOwl отреагировална Andrey Efimov в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время
Ссылка: http://delphifmandroid.blogspot.ru/2016/02/alarmmanager-rad-studio.html
Автор: Ефимов Андрей
Описание: [AlarmManager] Автозапуск приложения в назначенное время
-
AngryOwl отреагировална Kitty в krapotkin и Равиль Зарипов
Даже не знаю или в правильный раздел форума пишу. Я, например, хочу поблагодарить в своей теме - krapotkin и Равиль Зарипов за очень полезные ответы. Реально помогают решить вопросы. Спасибо.
Хотя все они паскалисты, все же удается иногда получить код на С++ со стороны. Очень в этом помогает автор Indy rlebeau, например эту статью: Статья
он переводит в С++ тут: C++ и никто бы другой не помог. В этом плане тяжело, без него и никак вопрос не решить.
А этот форум это симбиоз ума и решений! Спасибо Ярославу за реализацию и хоты бы одного спеца по С++ как по Дельфи и - вот оно счастье.
Спасибо!
-
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);
-
AngryOwl отреагировална RoschinSpb в Уничтожение фрейма при нажатии на кнопку
В качестве послесловия.
Деструктор объекта не может быть вызван внутри метода этого объекта (самоубийства запрещены). Всегда можно поставить точку останова на вызов метода Free/FreeAndNil. И внимательно посмотреть стек вызова, если где-то в стеке вызова присутствует разрушаемый объект, то это не правильно. Сложности добавляет то, что это не обязательно приводит возникновению AV, вполне может быть, что у вас всё будет работать без ошибок, а на другом компьютере, или на другой платформе с ошибками.
Release на самом деле приводит к отложенному удалению не внутри вызывающего метода, т.е. объект просто помечается как готовый к удалению.
-
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; типа так...
-
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);
-
AngryOwl отреагировална kami в Уничтожение фрейма при нажатии на кнопку
Нет, не пойдет. Потому что DoOnCloseInfo по прежнему вызывается из внутренностей TButton.Click. Если ваш код отрабатывает на Windows - это ваша недоработка, а не показатель правильности. Причины я изложил выше. А на мобильных платформах с фреймом визуально просто ничего не произойдет. Причины опять-таки изложил выше.
И в таком виде тоже не пойдет.
Потому что Synchronize и Queue, будучи вызванными из главного потока, моментально передают управление в метод, а не дожидаются очередного витка выборки сообщений у Application. В таком виде вы просто добавляете несколько вложенных вызовов, увеличивая занятость стека. Не меняя при этом концепцию работы.
-
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;
-
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 ...
-
AngryOwl отреагировална Error в FMX TTaskbar
Самое очевидное, посмотреть как реализован TTaskBar и сделать аналог для FMX, или сильно урезанный аналог с необходимым вам функционалом.
-
AngryOwl отреагировална Andrey Efimov в Возможна работа с паролем в Tzipfile?
По ссылке, в первом посте, я как раз упоминал Zip4J, более того даже пример выкладывал. Но Zip4J подходит для андроида.
Про Winsoft, опять же с того момента, когда писал заметку, ничего не изменилось, всё также не понятно за что платить им, если они используют в своём компоненте только эту либу, проще скачать её и добавить в проект самостоятельно. Пример использования можно глянуть тут Расширенные возможности работы с zip файлами, бесплатно и без СМС (заметка негодования, так что можно не читать, просто скачать пример
p.s. Тут похоже ТС'у желательно найти универсальную либу, но я таких не встречал.
-
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). Это ранняя альфа, необходимы ваши отзывы, критика и т.д.