-
Постов
553 -
Зарегистрирован
-
Посещение
-
Победитель дней
35
Активность репутации
-
-
rareMax отреагировална Alexander в Скроллинг множества TEdit расположенных на TScrollBox
Моё ИМХО, придётся решать алгоритмически. Если изначально у всех Edit.HitTest :=False; то появления клавиатуры не будет и перемещение будет согласно жесту. А вот как как вводить Edit в режим доступа и редактирования, тут надо пробовать. Если в лоб, то двойной клик(или Tap) по Edit, по сути будет клик по scrollbox. Получение координат и определение, какой edit находится на клике. Соответственно Edit.HitTest :=True ; ввод с клавиатуры, уводить фокус с edit, Edit.HitTest := False;
-
rareMax отреагировална DirtyBorov в MaskEdit
Случилось так, что потребовался мне ввод номера телефона. Компонента, аналога TMaskEdit в FMX нет, так что пришлось "изобретать на коленке". Компонент писать было лень, потому просто покажу как я решил это в конкретном диалоге с использованием TEdit. Может кому то пригодится. Из кода я убрал все лишнее, оставил только то что относится к делу.
uses .... System.MaskUtils, System.Character; type TFormRegistry = class(TForm) edtPhone: TEdit; procedure edtPhoneValidating(Sender: TObject; var Text: string); procedure edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure edtPhoneEnter(Sender: TObject); procedure edtPhoneTyping(Sender: TObject); private const Mask = '+7(000)000-00-00;0;*'; /// '+0(000)000-00-00;0;*' - для других стран, например для Украины +3(999).... private PhoneNumber: string; function GetCaretPos: Integer; function GetMaxLength: integer; public end; procedure TFormRegistry.FormCreate(Sender: TObject); begin edtPhone.Text := FormatMaskText(Mask, PhoneNumber); end; function TFormRegistry.GetCaretPos: Integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do begin if not (MaskGetCharType(Mask, i) in [mcDirective, mcMask]) then Result := Result + 1; if (Result + PhoneNumber.Length) = i then Break; end; Result := Result + PhoneNumber.Length - 1; end; function TFormRegistry.GetMaxLength: integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do if (MaskGetCharType(Mask, i) in [mcMask]) then Result := Result + 1; end; procedure TFormRegistry.edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if (Key = 8) and (PhoneNumber.Length > 0) then PhoneNumber := Copy(PhoneNumber, 1, PhoneNumber.Length-1) else if (PhoneNumber.Length < GetMaxLength) and (Key = 0) and IsDigit(KeyChar) then PhoneNumber := PhoneNumber + KeyChar else KeyChar := #0; end; procedure TFormRegistry.edtPhoneEnter(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneTyping(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneValidating(Sender: TObject; var Text: string); begin Text := FormatMaskText(Mask, PhoneNumber); end; end. -
-
rareMax отреагировална dnekrasov в Как запустить дочерний процесс на Маке?
Вот пример как у меня идет добавление в архив используя zip в MacOS:
function ZipAdd(AArchName, AFileName: String): boolean; {$IFDEF MACOS} var s, sRoot, sFileName, sArchName: String; {$ENDIF} begin Result := False; {$IFDEF MACOS} try if DirectoryExists(AFileName) then begin if AFileName[AFileName.Length] = PathDelim then System.Delete(AFileName, AFileName.Length, 1); sRoot := ExtractFilePath(AFileName); AFileName := AFileName.Remove(0, sRoot.Length); s := Format('pushd "%s"; zip -r "%s" "%s"; popd', [sRoot, AArchName, AFileName]); _system(PAnsiChar(UTF8String(s))); end else begin s := Format('zip -j "%s" "%s"', [AArchName, AFileName]); _system(PAnsiChar(UTF8String(s))); end; Result := FileExists(AArchName); except Result := False; end; {$ENDIF} end; Замените зиповские команды архивирования на раровские разархивирования, добавьте необходимую Вам логику и наслаждайтесь
-
rareMax отреагировална RoschinSpb в Уничтожение фрейма при нажатии на кнопку
В качестве послесловия.
Деструктор объекта не может быть вызван внутри метода этого объекта (самоубийства запрещены). Всегда можно поставить точку останова на вызов метода Free/FreeAndNil. И внимательно посмотреть стек вызова, если где-то в стеке вызова присутствует разрушаемый объект, то это не правильно. Сложности добавляет то, что это не обязательно приводит возникновению AV, вполне может быть, что у вас всё будет работать без ошибок, а на другом компьютере, или на другой платформе с ошибками.
Release на самом деле приводит к отложенному удалению не внутри вызывающего метода, т.е. объект просто помечается как готовый к удалению.
-
rareMax получил реакцию от Rusland в TNetHTTPClient, php и select
На сколько я понимаю это не совсем вопрос по делфи... но держи
http://ru.stackoverflow.com/questions/284297/Вывести-из-базы-mysql-в-виде-json-массива
-
rareMax получил реакцию от Kitty в TNetHTTPClient, php и select
Целый раздел с примерчиками: http://fire-monkey.ru/forum/130-json/
-
rareMax получил реакцию от afors в Редактор форм
В общем. Есть такой контрол: TSelection. Если нужно произвести операцию над каким-либо контролом(Назовем его MyControl) - помещаешь MyControl на TSelection . Делаешь TAlign у MyControl на весь клиент. Делаешь HitTest := False;
В итоге можешь двигать и менять размеры контрола
-
rareMax получил реакцию от Major в TNetHTTPClient, php и select
Целый раздел с примерчиками: http://fire-monkey.ru/forum/130-json/
-
rareMax получил реакцию от Major в TNetHTTPClient, php и select
На сколько я понимаю это не совсем вопрос по делфи... но держи
http://ru.stackoverflow.com/questions/284297/Вывести-из-базы-mysql-в-виде-json-массива
-
rareMax отреагировална kami в Уничтожение фрейма при нажатии на кнопку
Нет, не пойдет. Потому что DoOnCloseInfo по прежнему вызывается из внутренностей TButton.Click. Если ваш код отрабатывает на Windows - это ваша недоработка, а не показатель правильности. Причины я изложил выше. А на мобильных платформах с фреймом визуально просто ничего не произойдет. Причины опять-таки изложил выше.
И в таком виде тоже не пойдет.
Потому что Synchronize и Queue, будучи вызванными из главного потока, моментально передают управление в метод, а не дожидаются очередного витка выборки сообщений у Application. В таком виде вы просто добавляете несколько вложенных вызовов, увеличивая занятость стека. Не меняя при этом концепцию работы.
-
rareMax отреагировална AngryOwl в 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);
-
rareMax отреагировална Равиль Зарипов (ZuBy) в Как начать жить с TDialogService.InputQuery?
ты можешь это легко исправить, uses FMX.Dialogs.Default, на что фантазии хватит
это под Windows
-
rareMax получил реакцию от Major в Живое связывание с таблицей БД
https://www.youtube.com/user/EmbarcaderoTechNet
и для совсем ленивых https://www.youtube.com/results?search_query=delphi+livebindings
-
rareMax получил реакцию от Равиль Зарипов (ZuBy) в Обязателен ли AddObject?
AddObject используйте если нужно добавить несколько объектов в другой объект. Например несколько MyLabel_N в MyRect/
И считайте что FParent.AddObject(FChild) и FChild.Parent := FParent это просто синонимы
-
rareMax получил реакцию от Major в Живое связывание с таблицей БД
Я на данный момент работаю с БД через Marshmallow ORM - и вполне доволен. Возможно для вас это и не выход - тогда пытайтесь подружиться с ЛайвБайндингом. Там кстати вебинар скоро по нему будет))
-
rareMax получил реакцию от Brovin Yaroslav в Надолго зависает код при загрузке из интернета
Вы правы.
-
rareMax получил реакцию от Brovin Yaroslav в Обязателен ли AddObject?
AddObject используйте если нужно добавить несколько объектов в другой объект. Например несколько MyLabel_N в MyRect/
И считайте что FParent.AddObject(FChild) и FChild.Parent := FParent это просто синонимы
-
-
rareMax отреагировална krapotkin в Передача фокуса элементу стиля
стиль должен заведовать оформлением а не функционалом
если в стиль запихать TButton и TEdit то как потом с этим добром работать-то?
только в OnApplyStyle ?
Это нужно реализовывать стандартным образом, вставляя компоненты друг в друга. Тогда и свойства все доступны...
Если нужно повторяющийся комплект использовать, то кинуть это все в TFrame
-
rareMax получил реакцию от Равиль Зарипов (ZuBy) в Обязателен ли AddObject?
А для чего написал его? Вполне достаточно указать Parent.
-
rareMax отреагировална 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). Это ранняя альфа, необходимы ваши отзывы, критика и т.д.
-
rareMax получил реакцию от Rusland в Как Delphi собирает apk файл?
Играйся, http://www.javadecompilers.com/apk
-
rareMax получил реакцию от Kitty в Как Delphi собирает apk файл?
Играйся, http://www.javadecompilers.com/apk