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

HyperZen

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

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

  • Посещение

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

    1

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

  1. Like
    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.  
  2. Like
    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}  
  3. Like
    HyperZen отреагировална enatechno в [DX10] Drag-and-Drop Пример   
    https://www.youtube.com/watch?v=ta_N6DSi0Xg
    с 22 минуты
  4. Like
    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; Ну если чисто синтаксически - то как то так
    -----------
    О, уже ответили, сорян, не видел
  5. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Отловить двойное нажатие кнопки Back...   
    что то типа
    глобальная back_pressed = 0; //uses DateUtils if (back_pressed + 2000) > MilliSecondOfTheDay(now) then Close else ShowMessage('Нажмите еще раз для выхода'); back_pressed := MilliSecondOfTheDay(now);  
  6. Like
    HyperZen отреагировална krapotkin в Отловить двойное нажатие кнопки Back...   
    if backPressedTime=0 then begin   backPressedTime := now(); end else if (secondSpan(now, backpressedTime)<3) then begin   doExit(); end else   backPressedTime:=0; в общих чертах как-то так
  7. Like
    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; ....  
  8. Like
    HyperZen отреагировална Rusland в Косяк с отображением TText   
    Вот я проверил на Берлине. На TText вбил текст, WordWrap=true, Trimming ставил все возможные варианты - результат один:

  9. Like
    HyperZen отреагировална krapotkin в Использование двух стилей в приложении...   
    если мы видим, что не обновляются те элементы, которые были вне экрана, почему бы просто не пересоздать их при смене стиля?
  10. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Проблема с обновлением картинки в Item'e   
    тоже работает, но заметил странность. не всегда "успевает" отрисовать Item.
    спасибо за решение, но я уже нашел своё. пока оно меня устраивает
  11. Like
    HyperZen получил реакцию от Axbor в Косяк с отображением TText   
    А мое мнение, что это опять этот измученный вопрос подсчета высоты итема TListView...
     
  12. Like
    HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...   
    Зависит от системы, НО в FireMonkey можно сделать свой стиль рамки окна для Windows и в том числе разместить в шапке окна свои компоненты.
  13. Like
    HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...   
    В большинстве случаев стиль может быть любой структуры. Главное требование - это наличие специальных именованных объектов, с которыми компонент взаимодействует. В случае с тулбаром, он не работает со стилем. Поэтому вы можете использовать в стиле все что захотите. А если посмотрите в сторону TTintedStyleObject, то сможете сделать даже перекрашиваемый TToolBar!
  14. Like
    HyperZen отреагировална Brovin Yaroslav в Почему у меня для TLabel неправильно вычисляется размер метки при использовании AutoSize?   
    Как я правильно заметил, в вашем случае не был загружен стиль ваших меток. По этому вы обращались к размерам, вычисленным для настроек текста по умолчанию. А после загрузки стиля, вы уже не обновляли позицию. 
     
    На Windows настройки текста по умолчанию совпадают с настройками текста в стиле. Поэтому работает так, как вы и полагаете.
     
    Решения
    Делать перерасчет позиции в OnApplyStyleLookup или OnResize у TLabel. Принудительно загрузить стиль:
    NeedApplyStyleLookup; ApplyStyleLookup;
  15. Like
    HyperZen отреагировална Brovin Yaroslav в Использование двух стилей в приложении...   
    Самый простой способ это сделать переключение стилей через TStyleManager. Делаете два стиля и переключаете их через TStyleManager. Как раз последний урок записал про это. 
  16. Like
    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; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
  17. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...   
    в дизайнере 

  18. Like
  19. Like
    HyperZen получил реакцию от Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...   
    Проверил на чистом проекте, наблюдается такая же картина. Текст пропадает. Баг Берлина? Или Seattle так же себя ведет?
  20. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...   
    можете в одном файле .style хранить сразу два режима, достаточно указать им stylename разные
    а переключать стили изменяя Stylelookup компонента, и не забываем про ApplyStyleLookup NeedStylelookup
  21. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Всплывающая подсказка   
    Вы про Toast говорите? Поиск по форуму поможет 
  22. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...   
    вот посмотрите это решение
  23. Like
    HyperZen отреагировална Равиль Зарипов (ZuBy) в Использование двух стилей в приложении...   
    как-то просмотрел ваш вопрос...
    вам для Берлина или Сиетла?
  24. Like
    HyperZen отреагировална krapotkin в Возвращаясь к вопросу о подсчете высоты текста TListView   
    я же выкладывал готовый рабочий проект под берлин. там же все вычисляется верно. в Dynamic Appearance
    что еще не так?
    ListViewTestBerlin.7z
  25. Like
    HyperZen отреагировална Евгений Корепов в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Попробуйте проверить отладкой какой размер шрифта попадает в GetTextHeight. Потому что по умолчанию размер 12, а в стиле размер может быть 18. Так же вы не выполняете ListView.ApplyStyleLookup после заполнения ListView. 
    Очень рекомендую перед заполнением ListView выполнять код
    AListView.BeginUpdate; AListView.OnUpdateObjects:=Nil; После заполнения:
    AListView.EndUpdate; ListViewUpdateAll(AListView); // В цикле применяет ListViewUpdateObjects ко всем элементам AListView.ApplyStyleLookup; AListView.OnUpdateObjects:= ListViewUpdateObjects;  
×
×
  • Создать...