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

Major

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

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

  • Посещение

Сообщения, опубликованные Major

  1. enatechno,

    спасибо за ответ!

    1 Вариант. Заменой удаления фреймов на скрытие (подправленный проект приложил).

    Фреймов будет много и они будут не такими голыми, как в тестовом примере, поэтому скрывать/показывать - не подойдет (думаю, что быстро кончится память).

    2 Вариант. Расположить панель с кнопкой Back на главной форме, а не дублировать ее в каждом фрейме. (При необходимости саму кнопку Back можно скрывать при возврате на первый таб).

    Идея интересная, только тогда получится два тулбара (один - для Back, второй - для самого фрейма, где на тулбаре будет несколько кнопок). Не очень красиво

    3 Вариант. Использовать отложенное удаление фрейма (например в потоке).

    а есть пример? интересно очень

  2. запустил программу через отладчик, получил такую ситуацию. Открывается FMX.Controls, а в нем:

    procedure TControl.MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
    begin
      if FPressed and not(FDoubleClick) and PointInObjectLocal(X, Y) then
      begin
        Click;
        FPressed := False;
        StartTriggerAnimation(Self, 'Pressed');
      end;
    end;

     

  3. 4 часа назад, enatechno сказал:



    Ну а причина зависания - то, что вы в процедуре обработчика кнопки фрейма OnClick вызываете TForm1.TabControl1Change и там удаляете этот фрейм и саму кнопку.

    а как можно решить эту проблему? как перейти из фрейма на главную вкладку не только через vkHardwareBack?

    вот приложил тестовый проект

    Test.zip

  4. Господа, помогите пожалуйста разобраться, в чем проблема.

    В программе одна форма, на ней табконтрол с двумя вкладками. TabPosition - None. Одна вкладка выполняет роль меню, из которой можно перейти во вторую вкладку, куда грузится фрейм.

    Если возвращаться в главную вкладку из фрейма через обработку OnKeyUp, то всё норм, без зависаний:

    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
    var KeyChar: Char; Shift: TShiftState);
    begin
      if (Key = vkHardwareBack) then
      begin
        Key := 0;
        if (TabControl1.ActiveTab = TabItem1) then
          Close
        else
          TabControl1.ActiveTab := TabItem1;
      end;
    end;

    А если через кнопку внутри фрейма

      Form1.TabControl1.ActiveTab := Form1.TabItem1;

    то виснет.

    Уничтожаю фрейм так:

    procedure TForm1.TabControl1Change(Sender: TObject);
    begin
      if (TabControl1.ActiveTab = TabItem1) then
        if (FFrame <> nil) then
        begin
          FFrame.Parent := nil;
          FFrame.DisposeOf;
          FFrame := nil;
        end;
    end;

     

     

     

     

     

  5. В 17.02.2017 в 15:58, Равиль Зарипов (ZuBy) сказал:

    где вы это прочитали?

    в андроиде нет ресурсов таких как Windows

    я вот сейчас еще раз проверил. Всё, что кидалось в Deployment,  - в apk-файле находится в папке assets. А то, что подключалось через ресурсы (brcc32), то находится в .so-файле.

    Delphi 10.1 Berlin.

    Можете сами проверить

  6. Можно ли как-то узнать список доступных кнопок (HardwareBack, Home, Menu) на том или ином девайсе?

    Еще заметил, что кнопки vkHardwareBack и vkMenu можно перехватить в OnKeyUp, а кнопка vkHome выполняется так, как системе угодно.

  7. ENRGY,

    а как вам такой способ (не мой)?
     

    uses
      Androidapi.Helpers,
      Androidapi.JNI.App,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.GraphicsContentViewText;
    
    var
      SP: JSharedPreferences;
      SPE: JSharedPreferences_Editor;
    
    procedure TMain.FormShow(Sender: TObject);
    begin
      SP := TAndroidHelper.Activity.getSharedPreferences(StringToJString('ZTApp'), 0);
      IP.Text := JStringToString(SP.getString(StringToJString('IP'), StringToJString('127.0.0.1')));
    end;
    
    procedure TMain.SaveClick(Sender: TObject);
    begin
      SPE := SP.edit;
      SPE.putString(StringToJString('IP'), StringToJString(IP.Text));
      SPE.commit;
    end;

     

  8. Господа, а есть ли в Андроиде нечто подобное реестру в Windows?

    Нужно записать некоторые данные в систему, которые не должны теряться при удалении программы.

    И как работать с этим, используя Delphi? Заранее спасибо.

  9. 5 часов назад, Равиль Зарипов (ZuBy) сказал:

    @Major

    для просветления

     

    у меня почему-то идея, взятая из той статьи, приводит к exception class EArgumentOutOfRangeException with message 'Argument out of range' с выбросом в

    procedure TListHelper.CheckItemRange(AIndex: Integer);
    begin
      CheckItemRangeInline(AIndex);
    end;

    Мой код:

    for K := Layout1.ChildrenCount - 1 downto 0 do
    begin
      if Layout1.Children[K].ClassNameIs('TCircle') then
      begin
        (Layout1.Children[K] as TCircle).Parent := nil;
        (Layout1.Children[K] as TCircle).Free;
      end;
    end;

     

  10. или лучше:

    for K := Layout1.ChildrenCount - 1 downto 0 do
    if Layout1.Children[K].ClassNameIs('TCircle') then
      begin
      (Layout1.Children[K] as TCircle).DisposeOf;
      (Layout1.Children[K] as TCircle) := nil;
    end;

    или так:

    for K := Layout1.ChildrenCount - 1 downto 0 do
    begin
      if Layout1.Children[K].ClassNameIs('TCircle') then
      begin
        (Layout1.Children[K] as TCircle).Parent := nil;
        (Layout1.Children[K] as TCircle).Free;
        (Layout1.Children[K] as TCircle) := nil;
      end;
    end;

     

  11. Читал несколько статей по удалению объектов в Android-приложениях, но до сих пор каша в голове.

    Помогите прояснить ситуацию, пожалуйста.

    Вот я создаю в run-time объекты:   

    for J := 0 to Num - 1 do
    begin
      MyCircle := TCircle.Create(Layout1);
      MyCircle.Parent := Layout1;
      MyCircle.Width := 100;
      MyCircle.Height := 100;
      MyCircle.Align := TAlignLayout.Left;
      MyCircle.Fill.Color := TAlphaColors.Red;
    end;


    Потом я хочу почистить слой от кружков. Так будет правильно?

    for K := Layout1.ChildrenCount - 1 downto 0 do
      if Layout1.Children[K].ClassNameIs('TCircle') then
        (Layout1.Children[K] as TCircle).Free;

    Или кроме Free еще что-то надо?

     

  12. А с какого перепуга на Андроиде у имаджа свойство Bitmap.Canvas.Scale = 3?

    Рисую я на канве имаджа примитивы разные, под Виндоуз всё красиво отображается, под Андроидом - всё огромное.

    Дай думаю проверю Scale, а он почему-то трем равняется!

  13. 3 часа назад, Равиль Зарипов (ZuBy) сказал:

    для заливки используется 

    
    Canvas.Fill.Color := цвет;
    Canvas.FillEllipse();

     

    а как сделать, чтобы по окружности был черный цвет?

    Уже всё перепробовал с Canvas.Stroke, не появляется черный периметр(

×
×
  • Создать...