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

dervish00

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

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

  • Посещение

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

  1. если не нужна публикация в Google Play, то на скорую руку решение есть. Ставим в свойствах проекта галочку на пермишене "MANAGE_EXTERNAL_STORAGE" и потом, после установки приложения на устройстве, ручками даём приложению разрешение "Разрешить управление всеми файлами". У меня после этого всё заработало.

  2. Та же самая проблема. Приложение создает файл sql (копия БД) в папке, которую можно выбрать. Потом прекрасно его видит и может восстановить базу из него. Но если закинуть точно такой же файлик с другого девайса - не видит. И если удалить приложение, а потом заново установить - не видит ни свои, ни чужие файлы.

    Ищу инфу. Если найду выход - поделюсь. Ну, соответственно, попрошу вас, если найдете - поделиться.

  3. В соседней теме обозначил вопрос про высоту Item-ов. Попробую задать вопрос более расширенно. На выезжающем TMultiView хочу сделать менюшку с помощью ListView, причем какое-то количество верхних Item-ов хочу  отделить от остальных (небольшое количество - чаще один, но иногда несколько, причем сколько это "несколько" неизвестно - сколько пользователь добавит). Пробовал для целей отделения использовать Item с Purpose установленным в TListItemPurpose.Header, как советовали на этом форуме, - не получается, пространство отделяется, но сепараторов нет, некрасиво. Решил сделать тремя TLayout - верхний для верхней части меню, средний для разделения и нижний для остальной части меню. Вся проблема оказалась в том, что я не могу подсчитать сумму высот отдельных Item для верхнего ListView, чтобы затем задать высоту Layout, в который вписан как клиент данный ListView. В тот момент, когда динамически создаю Item высота его равна 0, а в обработчиках OnUpdateObjects и OnUpdatingObject обрабатывается один конкретный AItem. Вопрос - в каком месте подсчитывать?

  4. 11 часов назад, Евгений Корепов сказал:

    Вы добавили Item, но не дали возможность его отрисовать. Т.е. ListView3 добавил себе итем, но еще ничего о нем не знает. Параметры Item вам нужно выставлять в событии ListView3UpdatedObjects - тут уже будет известна высота.

    Ну все не так просто - OnUpdatINGObjects возникает при прорисовке конкретного Item. Мне же нужно посчитать сумму их высот. Да и вообще - я, честно говоря, думал, что данным событием нужно пользоваться если тип ItemAppearance будет Custom или DynamicAppearance, у меня же в примере вполне себе классический тип - ListItemRightDetail, не нужно ничего добавлять - ни рисунков, никакого сложного форматирования, просто Item и Detail

  5. Подниму тему. Вот совершенно элементарный код:

    procedure TForm1.Button2Click(Sender: TObject);
    var
       Item : TListViewItem;
       i, CountStringsInHeader : Integer;
       hHeader : single;
    
    begin
       CountStringsInHeader := 5;
       if CountStringsInHeader > 0 then begin
          hHeader := 0;
          ListView3.BeginUpdate;
          try
             if ListView3.Items.Count <> 0 then begin
                ListView3.ScrollViewPos := 0;
                while ListView3.Items.Count > 0 do ListView3.Items.Delete(0);
             end;
             for I := 0 to CountStringsInHeader-1 do begin
                Item := ListView3.Items.Add;
                Item.Text := i.ToString;
                Item.Detail := 'Detail: '+i.ToString;
                hHeader := hHeader + Item.Height;
             end;
          finally
             ListView3.EndUpdate;
             layListHeader.Height := hHeader + laySeparator.Height;
             layListHeader.Visible := True;
          end;
       end;
       ListView2.BeginUpdate;
       try
          if ListView2.Items.Count <> 0 then begin
             ListView2.ScrollViewPos := 0;
             while ListView2.Items.Count > 0 do ListView2.Items.Delete(0);
          end;
          for I := CountStringsInHeader to 4 do begin
             Item := ListView2.Items.Add;
             Item.Text := i.ToString;
             Item.Detail := 'Detail: '+i.ToString;
          end;
       finally
          ListView2.EndUpdate;
       end;
    end;

    Почему в строке 

    hHeader := hHeader + Item.Height;

    Item.Height всегда равно 0? Техт маленький, мне не нужно расширять item, просто точно вычислить высоту Layout в который вписан ListView.

  6. Если выбрать айтем с номером больше 53, а потом раскрыть список, то самым нижним видимым будет 53, если покрутить полосу прокрутки, то видно, что выделенным является правильный айтем, но он не видим при раскрытии списка. Уж и не знаю, как еще объяснить...

  7. Есть форма с ComboBox. Список заполняю динамически и ставлю ItemIndex равным какому-либо элементу. При нажатии на стрелочку для раскрытия списка до какого-то значения ItemIndex в этом списке подсвечивается правильный Item, а после какого-то этот правильный Item спрятан внизу, т.е. до него список не скроллируется. Думал, что это из-за динамики, сделал такой же комбо, только заполненный в дизайнтайм - поведение абсолютно такое же. Что делаю не так? Простенький проект-пример в прицепе.

    testcombobox.zip

     

    Все это в винде. Delphi Berlin.

  8. 25 минут назад, sinuke сказал:

    Есть TAnimator.AnimateFloatWait - после вызова можно и панельку скрыть

    Как видно из кода - мне нужно одновременно две панельки запускать (одна прячется, другая появляется). А AnimateFLoatWait пока не закончит работу - не даст запуститься второй анимашке.

     

    На самом деле все решил - оказался такой страшный мой косяк, что аж стыдно... У меня в коде, как вы понимаете, чуть сложнее - имена панелек берутся из смерженной до этого строки с разделителями. Так я парсил эту строку под имена отдельные как раньше это делал под виндой (у меня куча процедурок и функций своих осталось со времен, когда активно кодил), а здесь не учел, что под андроидом строки с нуля начинаются, а не с 1-ки. Поправил - вроде все отрабатывает как положено и даже через FindComponent, т.е. не надо городить костылик с отбором панельки по имени...

    Всем спасибо за участие и прошу прощения за свой косяк.

  9.  

    1 час назад, sinuke сказал:

    под андройд не работают Ansi функции, потому как там и строки совсем другие (нуль терминированные строки)

    лучше наверное через хелпер для строк делать UpperCase, например так:

    
    var
      s: string;
    begin
      s := 'fdf';
      ShowMessage(s.UpperCase(s));
    end;

    если в чем не прав - поправьте =))

    Не работает. Даже безо всяких UpperCase - просто напрямую (что передал, с тем и сравниваю) не работает. Думается мне, что дело тут несколько глубже и связано с передачей параметров. Пока знаний по андроиду не хватает, пытаюсь найти инфу в сети... Просто хотелось сделать универсальный инструмент для смены панелек (их будет 6-8 штук) с плавной анимацией. Можно, конечно и в лоб описать все переходы, но как-то некрасиво.

  10. function Form1.GetPanel(paName: string):Tpanel;
    begin
        Result := NIL;
        if AnsiUpperCase(paName) = 'PANEL1' then Result := Panel1;
        if AnsiUpperCase(paName) = 'PANEL2' then Result := Panel2;
    end;
    
    procedure Form1.Button1Click(Sender: TObject);
    var
       FirstFMXObjName, SecondFMSObjName : string;
       pa : TPanel;
    
    begin
       FirstFMXObjName := 'panel1';
       SecondFMSObjName := 'panel2';
    //   pa := GetPanel(FirstFMXObjName);
       pa := Panel1; //раскомментировав пред. строку и закомментировав эту  - не работает
       if NOT Assigned(pa) then Exit;
       FloatAnimationHideFromRight2Left.Parent := pa;
       FloatAnimationHideFromRight2Left.Enabled := True;
       FloatAnimationHideFromRight2Left.PropertyName := 'Position.X';
       FloatAnimationHideFromRight2Left.StartFromCurrent := False;
       FloatAnimationHideFromRight2Left.StartValue := 0.0;
       FloatAnimationHideFromRight2Left.StopValue := -pa.Width;
    //   pa := GetPanel(SecondFMSObjName);
       pa := Panel2; //раскомментировав пред. строку и закомментировав эту  - не работает
       if NOT Assigned(pa) then Exit;
       FloatAnimationShowFromRight2Left.Parent := pa;
       FloatAnimationShowFromRight2Left.Enabled := True;
       pa.Position.X := pa.Width;
       pa.Visible := True;
       FloatAnimationShowFromRight2Left.PropertyName := 'Position.X';
       FloatAnimationShowFromRight2Left.StartFromCurrent := False;
       FloatAnimationShowFromRight2Left.StartValue := pa.Width;
       FloatAnimationShowFromRight2Left.StopValue := 0.0;
       FloatAnimationHideFromRight2Left.Start;
       FloatAnimationShowFromRight2Left.Start;
    end;

    вот такой код. Под Windows и Android работает без проблем. Но если раскомментировать/закомментировать строки, которые подписаны в коде, то под Windows работает, а под Android - нет. А хотелось бы чтобы именно так работало (для универсальности). Пытался сделать через FindComponent и также под Windows все работало, а под Android выдавало Access Violation. Есть ли у гуру мысли, что происходит?

  11. Устанавливаю в TEdit.Text строковое значение, прочитанное из БД. Ставлю на этот TEdit фокус (TEdit.SetFocus). Показываю форму с этим TEdit. Естественно, вся строка подсвечена. Тапаю кратко в конце строки, чтобы снять выделение и пытаюсь добавить к введенной строке несколько символов. Начинает заменяться ВЕСЬ текст. Думал у меня косяк - открыл пример MobileControl, благо там TEdit-ов пруд пруди. Оказалось, что у всех такое поведение. Можно как-то это изменить?

  12. При нажатии на TSpeedButton, TButton итп появляется кружок вокруг места нажатия, а при нажатии на TLabel (c HitTest=true) - нет. Можно ли как-то его добавить, чтобы создавалось впечатление, что нажата кнопка? Мне нужно, чтобы вертикально шли три кнопки (Tspeedbutton) - Сохранить, Не сохранять, Отмена, которые прижаты к правому краю формы. Текст хотелось бы выровнять по правому краю кнопок, но такого свойства не нашел. Пришлось заменить TSpeedButton на TLabel, а у них нет пресловутого "кружка".    "Некрасивенько..." (С)

  13. Подниму темку. Все описанное выше хорошо для БД, в которые пользователь ничего не сохраняет, а как сделать то же (апгрейдить БД) в которую пользователь уже чего-то занес. Просится решение, что-то вроде выгрузки из текущей базы, например, в xml, удаление текущей, создание новой и загрузки в новую данных из xml. Отсюда вопрос: есть ли какие-либо готовые решения выгрузки SQLite БД в XML?

  14. 7 минут назад, enatechno сказал:

    Можно. Приведенный мною текст может быть использован TDM.DataModuleCreate(Sender: TObject).
    Ваша ошибка была в том, что вы обращались к экземпляру класса 

    
    DM.Conn.Connected := True;

    а сам экземпляр DM не создали.

    да, точно, спасибо. вот что значит отсутствие практики... "давно не брал я в руки шашку" (с). попробовал - работает. 

  15. Pax Beach

     

    Спасибо за ответ. Начал копать в этом направлении (к сожалению, в силу некоторых рабочих процессов, не могу уделить сейчас этому много времени). Добавил к приложению (просто пустая форма) модуль, на который посадил два компонента. Вот код:

    unit DMUnit;
    
    interface
    
    uses
      System.SysUtils, System.Classes, Data.DbxSqlite, Data.DB, Data.SqlExpr,
      Data.FMTBcd, System.IOUtils;
    
    type
      TDM = class(TDataModule)
        Conn: TSQLConnection;
        DS: TSQLDataSet;
        procedure ConnBeforeConnect(Sender: TObject);
        procedure ConnAfterConnect(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      DM: TDM;
    
    implementation
    
    {%CLASSGROUP 'FMX.Controls.TControl'}
    
    {$R *.dfm}
    
    procedure TDM.ConnAfterConnect(Sender: TObject);
    begin
       Conn.ExecuteDirect('CREATE TABLE IF NOT EXISTS tbl1 (_id INTEGER, name TEXT, PRIMARY KEY (_id ASC)');
    end;
    
    procedure TDM.ConnBeforeConnect(Sender: TObject);
    begin
       {$IF DEFINED(iOS) or DEFINED(ANDROID)}
          Conn.Params.Values['ColumnMetadataSupported'] := 'False';
          Conn.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'test.db');
       {$ENDIF}
    end;
    
    begin
       DM.Conn.Connected := True;
    end.

    при старте приложение сразу вылетает. Если закамментить:

    begin
    //   DM.Conn.Connected := True;
    end.

    то стартует нормально, но БД, естественно, не создается... Что не так? Вроде все просто и прозрачно.

  16. Обязательно ли деплоить пустую БД с приложением на устройство или можно при первом запуске просто создать новую БД? Как добавить таблицу в существующую БД более/менее понятно из wiki, а вот как создать БД - так и не понял. Вроде перерыл интернет на эту тему, но так и не нашел. Может кто сталкивался? Буду благодарен за ответы по существу вопроса.

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