-
Постов
203 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Активность репутации
-
HyperZen получил реакцию от Pax Beach в Ошибка InputBox...
Кому интересно, вот ссылка с примерами со всеми deprecated диалогами и InputBox'ами: http://c2design5sh.blogspot.ru
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.ListBox, FMX.Layouts, FMX.Platform, FMX.StdCtrls, FMX.Controls.Presentation, FMX.DialogService, FMX.ScrollBox, FMX.Memo; type TForm1 = class(TForm) ToolBar1: TToolBar; Label1: TLabel; ListBox1: TListBox; ListBoxItem1: TListBoxItem; ListBoxItem2: TListBoxItem; ListBoxItem3: TListBoxItem; ListBoxItem4: TListBoxItem; ListBoxItem5: TListBoxItem; ListBoxItem6: TListBoxItem; Memo1: TMemo; procedure ListBoxItem1Click(Sender: TObject); procedure ListBoxItem2Click(Sender: TObject); procedure ListBoxItem3Click(Sender: TObject); procedure ListBoxItem4Click(Sender: TObject); procedure ListBoxItem5Click(Sender: TObject); procedure ListBoxItem6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} // uses FMX.Platform, FMX.DialogService //************************************************************************************************** procedure TForm1.ListBoxItem1Click(Sender: TObject); var ASyncService : IFMXDialogServiceASync; begin if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface (ASyncService)) then begin ASyncService.ShowMessageAsync ( ( Sender as TListBoxItem ).Text ); end; Memo1.Lines.Clear; Memo1.Lines.Add( 'ShowMessageAsync Displayed' ); end; procedure TForm1.ListBoxItem2Click(Sender: TObject); var SyncService : IFMXDialogServiceSync; begin if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface (SyncService)) then begin SyncService.ShowMessageSync ( ( Sender as TListBoxItem ).Text ); end; Memo1.Lines.Clear; Memo1.Lines.Add( 'ShowMessageSync Displayed' ); end; //************************************************************************************************** procedure TForm1.ListBoxItem3Click(Sender: TObject); var ASyncService : IFMXDialogServiceASync; caption, inData : array[0..1] of string; begin caption[0] := 'ID :'; caption[1] := #1 + 'Pass :'; // #1 앞에 붙이면 마스킹 기능 inData[0] := 'admin'; // 초기값 inData[1] := '1234'; if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface (ASyncService)) then begin ASyncService.InputQueryAsync( 'Input String', caption, inData, procedure (const AResult : TModalResult; const AValues : array of string) begin case AResult of mrOk: ( Sender as TListBoxItem ).Text := AValues[0] + '/' + AValues[1]; end; end ); end; Memo1.Lines.Clear; Memo1.Lines.Add( 'InputQueryAsync Displayed' ); end; procedure TForm1.ListBoxItem4Click(Sender: TObject); var SyncService : IFMXDialogServiceSync; caption, inData : array[0..1] of string; begin caption[0] := 'ID :'; caption[1] := #1 + 'Pass :'; // #1 앞에 붙이면 마스킹 기능 inData[0] := 'admin'; // 초기값 inData[1] := '1234'; if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceSync, IInterface(SyncService)) then begin if SyncService.InputQuerySync( 'Input String', caption, inData ) then ( Sender as TListBoxItem ).Text := inData[0] + '/' + inData[1]; end; Memo1.Lines.Clear; Memo1.Lines.Add( 'InputQuerySync Displayed' ); end; //************************************************************************************************** procedure TForm1.ListBoxItem5Click(Sender: TObject); var ASyncService : IFMXDialogServiceASync; begin if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface(ASyncService)) then begin ASyncService.MessageDialogAsync( 'Question ?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0, procedure(const AResult: TModalResult) begin case AResult of mrYES : ( Sender as TListBoxItem ).Text := 'YES'; end; end); end; Memo1.Lines.Clear; Memo1.Lines.Add( 'MessageDialogAsync Displayed' ); end; procedure TForm1.ListBoxItem6Click(Sender: TObject); var SyncService : IFMXDialogServiceSync; rValue, i : integer; begin if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceSync, IInterface(SyncService)) then begin rValue := SyncService.MessageDialogSync( 'Question ?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0 ); ( Sender as TListBoxItem ).Text := rValue.ToString; end; Memo1.Lines.Clear; Memo1.Lines.Add( 'MessageDialogSync Displayed' ); end; end.
-
HyperZen отреагировална sinuke в Отловить двойное нажатие кнопки Back...
Лично я только что внедрил себе в проект вот такой код (из этой темы) и все заработало. Это в событии FormKeyUp
{$IFDEF ANDROID} if (Key = vkHardwareBack) and (BackPressed + 2000 > MilliSecondOfTheDay(now))then begin Key := 0; Close; end else begin Key := 0; BackPressed := MilliSecondOfTheDay(now); Toast := TfgToast.Create('Нажмите ''Назад'' еще раз, чтобы выйти из приложения', TfgToastDuration.Short); //Toast из пакета компонет FGX try Toast.Show; finally Toast.DisposeOf; end; Exit; end; {$ENDIF}
-
HyperZen отреагировална enatechno в [DX10] Drag-and-Drop Пример
https://www.youtube.com/watch?v=ta_N6DSi0Xg
с 22 минуты
-
HyperZen отреагировална rareMax в Отловить двойное нажатие кнопки Back...
Type TSomeClass = Class Private Class Var back_pressed:int64; public Procedure onBackPressed();Override; End; TSomeClass.onBackPressed(); Begin if (TSomeClass.back_pressed + 2000) > System.currentTimeMillis then Begin super.onBackPressed(); End else Begin Toast.makeText(getBaseContext(), 'Нажмите еще раз для выхода', Toast.LENGTH_SHORT).show(); End; TSomeClass.back_pressed := System.currentTimeMillis(); End; Ну если чисто синтаксически - то как то так
-----------
О, уже ответили, сорян, не видел
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Отловить двойное нажатие кнопки Back...
что то типа
глобальная back_pressed = 0; //uses DateUtils if (back_pressed + 2000) > MilliSecondOfTheDay(now) then Close else ShowMessage('Нажмите еще раз для выхода'); back_pressed := MilliSecondOfTheDay(now);
-
HyperZen отреагировална krapotkin в Отловить двойное нажатие кнопки Back...
if backPressedTime=0 then begin backPressedTime := now(); end else if (secondSpan(now, backpressedTime)<3) then begin doExit(); end else backPressedTime:=0; в общих чертах как-то так
-
HyperZen получил реакцию от AngryOwl в Возвращаясь к вопросу о подсчете высоты текста TListView
Проблема решена! Всем спасибо!
type TAppearanceObjectsHelper = class helper for TAppearanceObjects function GetParentControl: TControl; property ParentControl: TControl read GetParentControl; end; function TAppearanceObjectsHelper.GetParentControl: TControl; begin Result := OwnerControl; end; Function GetParent(const AListItem: TListViewItem): TListView; begin result := AListItem.Objects.Appearance.ParentControl as TListView; end; И, соответственно, код уважаемого Евгения Корепова претерпевает незначительные изменения:
if (Sender is TListViewItem) then begin AListItem := Sender as TListViewItem; if (GetParent(AListItem) is TListView) then AListView:=GetParent(AListItem) as TListView Else Exit; ....
-
HyperZen отреагировална Rusland в Косяк с отображением TText
Вот я проверил на Берлине. На TText вбил текст, WordWrap=true, Trimming ставил все возможные варианты - результат один:
-
HyperZen отреагировална krapotkin в Использование двух стилей в приложении...
если мы видим, что не обновляются те элементы, которые были вне экрана, почему бы просто не пересоздать их при смене стиля?
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Проблема с обновлением картинки в Item'e
тоже работает, но заметил странность. не всегда "успевает" отрисовать Item.
спасибо за решение, но я уже нашел своё. пока оно меня устраивает
-
HyperZen получил реакцию от Axbor в Косяк с отображением TText
А мое мнение, что это опять этот измученный вопрос подсчета высоты итема TListView...
-
HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...
Зависит от системы, НО в FireMonkey можно сделать свой стиль рамки окна для Windows и в том числе разместить в шапке окна свои компоненты.
-
HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...
В большинстве случаев стиль может быть любой структуры. Главное требование - это наличие специальных именованных объектов, с которыми компонент взаимодействует. В случае с тулбаром, он не работает со стилем. Поэтому вы можете использовать в стиле все что захотите. А если посмотрите в сторону TTintedStyleObject, то сможете сделать даже перекрашиваемый TToolBar!
-
HyperZen отреагировална Brovin Yaroslav в Почему у меня для TLabel неправильно вычисляется размер метки при использовании AutoSize?
Как я правильно заметил, в вашем случае не был загружен стиль ваших меток. По этому вы обращались к размерам, вычисленным для настроек текста по умолчанию. А после загрузки стиля, вы уже не обновляли позицию.
На Windows настройки текста по умолчанию совпадают с настройками текста в стиле. Поэтому работает так, как вы и полагаете.
Решения
Делать перерасчет позиции в OnApplyStyleLookup или OnResize у TLabel. Принудительно загрузить стиль:
NeedApplyStyleLookup; ApplyStyleLookup; -
HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...
Самый простой способ это сделать переключение стилей через TStyleManager. Делаете два стиля и переключаете их через TStyleManager. Как раз последний урок записал про это.
-
HyperZen отреагировална Brovin Yaroslav в Фоновое выполнение операции без "замораживания" отрисовки
Вся отрисовка выполняется в главном потоке приложения. Поэтому, если вы пытаетесь выполнить скачивание файла в основном потоке, то вся отрисовка приостановится до момента окончания вашей операции. Поэтому правило хорошего тона - это вынесение долгих операций (загрузка, ответ авторизации и тд) в отдельный поток.
Примерный код приведен ниже:
1. Создаем отдельный поток, в котором вы будите скачивать файл (я поставил для эмуляции скачивания просто паузу на 5 секунд):
type TMyTask = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; Реализация:
{ TMyTask } procedure TMyTask.DoFinished; begin if Assigned(OnTaskFinished) then OnTaskFinished; end; procedure TMyTask.DoStarted; begin if Assigned(OnTaskStarted) then OnTaskStarted; end; procedure TMyTask.Execute; begin Synchronize(DoStarted); try Sleep(5000); // Эмуляция выполнения 5 Секундной задачи finally Synchronize(DoFinished); end; end; Само использование такого потока будет следующим (в моем примере после выполнения операции, появится сообщение):
TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FMyTask: TMyTask; public procedure DoTaskStarted; // Callback, вызываемый в начале старта операции procedure DoTaskFinished; // Callback, вызываемый в конце выполнения операции. Аналог OnTerminate procedure StartMyTask; // Запуск задачи end; procedure TForm3.Button1Click(Sender: TObject); begin StartMyTask; end; procedure TForm3.DoTaskStarted; begin end; procedure TForm3.DoTaskFinished; begin ShowMessage('Выполнение задачи окончено'); end; procedure TForm3.StartMyTask; begin if FMyTask <> nil then begin FMyTasl.OnTaskStarted := nil; FMyTasl.OnTaskFinished := nil; FMyTask.Free; end; FMyTask := TMyTask.Create(True); FMyTask.OnTaskStarted := DoTaskStarted; FMyTask.OnTaskFinished := DoTaskFinished; FMyTask.Start; end; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...
в дизайнере
-
-
HyperZen получил реакцию от Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...
Проверил на чистом проекте, наблюдается такая же картина. Текст пропадает. Баг Берлина? Или Seattle так же себя ведет?
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...
можете в одном файле .style хранить сразу два режима, достаточно указать им stylename разные
а переключать стили изменяя Stylelookup компонента, и не забываем про ApplyStyleLookup NeedStylelookup
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Всплывающая подсказка
Вы про Toast говорите? Поиск по форуму поможет
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...
вот посмотрите это решение
-
HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...
как-то просмотрел ваш вопрос...
вам для Берлина или Сиетла?
-
HyperZen отреагировална krapotkin в Возвращаясь к вопросу о подсчете высоты текста TListView
я же выкладывал готовый рабочий проект под берлин. там же все вычисляется верно. в Dynamic Appearance
что еще не так?
ListViewTestBerlin.7z
-
HyperZen отреагировална Евгений Корепов в Возвращаясь к вопросу о подсчете высоты текста TListView
Попробуйте проверить отладкой какой размер шрифта попадает в GetTextHeight. Потому что по умолчанию размер 12, а в стиле размер может быть 18. Так же вы не выполняете ListView.ApplyStyleLookup после заполнения ListView.
Очень рекомендую перед заполнением ListView выполнять код
AListView.BeginUpdate; AListView.OnUpdateObjects:=Nil; После заполнения:
AListView.EndUpdate; ListViewUpdateAll(AListView); // В цикле применяет ListViewUpdateObjects ко всем элементам AListView.ApplyStyleLookup; AListView.OnUpdateObjects:= ListViewUpdateObjects;