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

dervish00

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

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

  • Посещение

Весь контент dervish00

  1. если не нужна публикация в Google Play, то на скорую руку решение есть. Ставим в свойствах проекта галочку на пермишене "MANAGE_EXTERNAL_STORAGE" и потом, после установки приложения на устройстве, ручками даём приложению разрешение "Разрешить управление всеми файлами". У меня после этого всё заработало.
  2. Та же самая проблема. Приложение создает файл sql (копия БД) в папке, которую можно выбрать. Потом прекрасно его видит и может восстановить базу из него. Но если закинуть точно такой же файлик с другого девайса - не видит. И если удалить приложение, а потом заново установить - не видит ни свои, ни чужие файлы. Ищу инфу. Если найду выход - поделюсь. Ну, соответственно, попрошу вас, если найдете - поделиться.
  3. увы, нет такого метода у TListViewItem
  4. dervish00

    Подсчет высоты ListView

    В соседней теме обозначил вопрос про высоту Item-ов. Попробую задать вопрос более расширенно. На выезжающем TMultiView хочу сделать менюшку с помощью ListView, причем какое-то количество верхних Item-ов хочу отделить от остальных (небольшое количество - чаще один, но иногда несколько, причем сколько это "несколько" неизвестно - сколько пользователь добавит). Пробовал для целей отделения использовать Item с Purpose установленным в TListItemPurpose.Header, как советовали на этом форуме, - не получается, пространство отделяется, но сепараторов нет, некрасиво. Решил сделать тремя TLayout - верхний для верхней части меню, средний для разделения и нижний для остальной части меню. Вся проблема оказалась в том, что я не могу подсчитать сумму высот отдельных Item для верхнего ListView, чтобы затем задать высоту Layout, в который вписан как клиент данный ListView. В тот момент, когда динамически создаю Item высота его равна 0, а в обработчиках OnUpdateObjects и OnUpdatingObject обрабатывается один конкретный AItem. Вопрос - в каком месте подсчитывать?
  5. Ну все не так просто - OnUpdatINGObjects возникает при прорисовке конкретного Item. Мне же нужно посчитать сумму их высот. Да и вообще - я, честно говоря, думал, что данным событием нужно пользоваться если тип ItemAppearance будет Custom или DynamicAppearance, у меня же в примере вполне себе классический тип - ListItemRightDetail, не нужно ничего добавлять - ни рисунков, никакого сложного форматирования, просто Item и Detail
  6. Подниму тему. Вот совершенно элементарный код: 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.
  7. Если выбрать айтем с номером больше 53, а потом раскрыть список, то самым нижним видимым будет 53, если покрутить полосу прокрутки, то видно, что выделенным является правильный айтем, но он не видим при раскрытии списка. Уж и не знаю, как еще объяснить...
  8. Есть форма с ComboBox. Список заполняю динамически и ставлю ItemIndex равным какому-либо элементу. При нажатии на стрелочку для раскрытия списка до какого-то значения ItemIndex в этом списке подсвечивается правильный Item, а после какого-то этот правильный Item спрятан внизу, т.е. до него список не скроллируется. Думал, что это из-за динамики, сделал такой же комбо, только заполненный в дизайнтайм - поведение абсолютно такое же. Что делаю не так? Простенький проект-пример в прицепе. testcombobox.zip Все это в винде. Delphi Berlin.
  9. Как видно из кода - мне нужно одновременно две панельки запускать (одна прячется, другая появляется). А AnimateFLoatWait пока не закончит работу - не даст запуститься второй анимашке. На самом деле все решил - оказался такой страшный мой косяк, что аж стыдно... У меня в коде, как вы понимаете, чуть сложнее - имена панелек берутся из смерженной до этого строки с разделителями. Так я парсил эту строку под имена отдельные как раньше это делал под виндой (у меня куча процедурок и функций своих осталось со времен, когда активно кодил), а здесь не учел, что под андроидом строки с нуля начинаются, а не с 1-ки. Поправил - вроде все отрабатывает как положено и даже через FindComponent, т.е. не надо городить костылик с отбором панельки по имени... Всем спасибо за участие и прошу прощения за свой косяк.
  10. По-моему, кое-что нарыл. Сейчас буду разбираться
  11. krapotkin у TAnimator.AnimateFloat нет события OnFinish, а мне в конце надо сделать у панельки Visible := False
  12. Не работает. Даже безо всяких UpperCase - просто напрямую (что передал, с тем и сравниваю) не работает. Думается мне, что дело тут несколько глубже и связано с передачей параметров. Пока знаний по андроиду не хватает, пытаюсь найти инфу в сети... Просто хотелось сделать универсальный инструмент для смены панелек (их будет 6-8 штук) с плавной анимацией. Можно, конечно и в лоб описать все переходы, но как-то некрасиво.
  13. 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. Есть ли у гуру мысли, что происходит?
  14. Устанавливаю в TEdit.Text строковое значение, прочитанное из БД. Ставлю на этот TEdit фокус (TEdit.SetFocus). Показываю форму с этим TEdit. Естественно, вся строка подсвечена. Тапаю кратко в конце строки, чтобы снять выделение и пытаюсь добавить к введенной строке несколько символов. Начинает заменяться ВЕСЬ текст. Думал у меня косяк - открыл пример MobileControl, благо там TEdit-ов пруд пруди. Оказалось, что у всех такое поведение. Можно как-то это изменить?
  15. dervish00

    [TLabel]OnClick в Android

    При нажатии на TSpeedButton, TButton итп появляется кружок вокруг места нажатия, а при нажатии на TLabel (c HitTest=true) - нет. Можно ли как-то его добавить, чтобы создавалось впечатление, что нажата кнопка? Мне нужно, чтобы вертикально шли три кнопки (Tspeedbutton) - Сохранить, Не сохранять, Отмена, которые прижаты к правому краю формы. Текст хотелось бы выровнять по правому краю кнопок, но такого свойства не нашел. Пришлось заменить TSpeedButton на TLabel, а у них нет пресловутого "кружка". "Некрасивенько..." (С)
  16. дааа, что-то я погорячился... все гораздо проще. но, вопрос в любом случае не снимается - SQLite -> XML, например для бакапа. правда, это другая тема...
  17. Подниму темку. Все описанное выше хорошо для БД, в которые пользователь ничего не сохраняет, а как сделать то же (апгрейдить БД) в которую пользователь уже чего-то занес. Просится решение, что-то вроде выгрузки из текущей базы, например, в xml, удаление текущей, создание новой и загрузки в новую данных из xml. Отсюда вопрос: есть ли какие-либо готовые решения выгрузки SQLite БД в XML?
  18. да, точно, спасибо. вот что значит отсутствие практики... "давно не брал я в руки шашку" (с). попробовал - работает.
  19. enatechno Спасибо. Красиво и легко. Я, правда, уже порешал у себя. Все получилось. Оказывается, нельзя в ДатаМодуле инициализировать. Сделал это в OnCreate главной формы - все заработало.
  20. 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. то стартует нормально, но БД, естественно, не создается... Что не так? Вроде все просто и прозрачно.
  21. dervish00

    Новая БД в Android

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