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

sinuke

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

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

  • Посещение

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

    35

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

  1. В общем, сделал пока вот так: var Source: TListViewItem; Target: TListViewItem; begin ListView1.BeginUpdate; Source := ListView1.Items[0]; Target := ListView1.Items.Insert(1); Target.Text := Source.Text; Source.Text := ListView1.Items[2].Text; ListView1.Items.Delete(2); ListView1.EndUpdate; end; В этом случае придется вручную копировать содержимое каждого итема. Кому интересно, вот тестовый проектик с перетаскиванием итемов мышью Demo.zip Ну а если кто может предложить вариант получше, не стесняйтесь
  2. неа, не работает. вот код, эффекта ноль: var Source: TListViewItem; Target: TListViewItem; Third: TListViewItem; begin ListView1.BeginUpdate; Source := ListView1.Items[0]; Target := ListView1.Items[1]; Third := Target; Target := Source; Source := Third; //ListView1.Items[0] := Target; //ListView1.Items[1] := Source; ListView1.EndUpdate; end; а если раскомментировать строчки, то вообще ошибка, потому как итемы read-only
  3. Доброго дня, форумчане Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить У кого какие мысли? Как реализовать? Delphi 10.2 Tokyo
  4. сложно сказать. у меня в проекте, собранном в Токио, MapView работает и все нормально. только создается он динамически
  5. подберите размер ListBoxItem таким образом, что при полном заполнении списка, последний итем на экране показывался не полностью, а частично. тогда точно будет понятно, что что-то дальше в списке есть
  6. не (Shared)DocumentsPath, a PublicPath если заливаете файлы в assets\internal, то ищем файлы с помощью GetDocumentsPath, при этом они никому не видны если заливаем файлы в assets\, то ищем с помощью GetPublicPath и файлы видны всем мной вышеуказаный код работает
  7. Есть несколько способов: 1) Можно сохранить ваш PDF в shared-папку. Он будет общедоступным и его можно будет открыть через интент вашим кодом из первого сообщения (только там уже будет не TPath.GetDocumentsParh, а TPath. GetPublicPath). Для этого в Deployment Manager нужное изменить Remote Path с assets\internal на assets\ procedure TForm7.btnOpenPDFClick(Sender: TObject); const SAMPLE_PDF_FILENAME = 'example.pdf'; var Uri: Jnet_Uri; OpenLinkIntent: JIntent; PDFFileName: string; begin PDFFileName := TPath.Combine(TPath.GetPublicPath, SAMPLE_PDF_FILENAME); { Внутренний доступ} if not TFile.Exists(PDFFileName) then ShowMessage(PDFFileName + ' not exist!') else begin Uri := StrToJURI('file:' + PDFFileName); OpenLinkIntent := TJIntent.Create; OpenLinkIntent.setDataAndType(Uri, StringToJString('application/pdf')); OpenLinkIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP); try SharedActivity.startActivity(OpenLinkIntent); except on E: Exception do ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf'); end; end; end; 2) Способ с веббраузером TWebBrowser. Бросаете на форму TWebBrowser и передаете ему URL в виде 'file://путь к PDF'. В этом случае файл откроется вашим же приложением, PDF никто больше не увидит (если расположение оставить assets\internal). Но возможно будут проблемы с самим браузером, т.к. этот компонент иногда непредсказуем
  8. Как я понимаю, вы пытаетесь открыть внешним приложением файл, который находится в "закрытой" области, которая доступна только вашему приложению или приложениям с рутом. Как вариант, для того, чтобы иметь возможность открыть этот PDF его нужно сохранить в какую-нибудь Shared-папку. Без сохранения можно попробовать бросить на форму TWebBrowser и указать в качестве ссылки "file://ссылка на pdf" (но это не точно, не проверял)
  9. Android без дополнительных разрешений и с показом экрана набора номера: //uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setData(StrToJURI('tel:' + somePhoneNumber)); SharedActivity.startActivity(Intent); end; А для прямого осуществления вызова (с разрешениями) есть пример стандратный в папке: c:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Mobile Snippets\PhoneDialer\
  10. не надо удалять/пересоздавать. просто нужно контролировать эти добавляющиеся строки в Memo. для этого можно использовать свойства Tag и TagString чтобы знать, какой компонент соответствует какой строке.
  11. я так понял, что ваш код выдает следующее: а надо: как я и говорил, нужно просто указывать координату вновь создаваемому компоненту: var i: integer; p: Integer; txt: TText; begin p := 0; for i := Memo1.Lines.Count - 1 downto 0 do begin txt := TText.Create(self); txt.Parent := Form2; txt.Position.Y := p + 1; txt.Align := TALignLayout.Top; txt.Text := Memo1.Lines.Strings[i]; p := Round(p + txt.Height); end; end;
  12. если я правильно понял проблему, то надо явно указывать координату для компонента, желательно чтобы она была "координата предыдущего + высота предыдущего + 1"
  13. я как-то помечал изображения (ставил 1, 2 ,3 ...). так вот на двух устройствах с оскейлами 2 и 3 использовалась одна и та же картинка
  14. FindItemByPosition - вот тут можно найти https://github.com/rzaripov1990/ModernListView. просто скопировать два файла FMX.ListView.pas и FMX.ListView.Types.pas в папку с проектом да и высоты всех итемов (и футеров и хидеров) тоже можно узнать. самое просто - циклом пройтись и прибавлять к некой переменной высоту текущего итема. как только эта сумма станет больше локальной координаты, то найден нужный итем
  15. Для стандартного ListView я пользуюсь вот таким кодом (только для фиксированной высоты итемов): var indx: Integer; .... indx := Trunc((ListView.AbsoluteToLocal(Point).Y + ListView.ScrollViewPos) / ListView.ItemAppearance.ItemHeight); if (indx >= 0) and (indx <= ListView.Items.Count - 1) then ListView.ItemIndex := indx; А если пользуетесь ModernLV, то можно так: ListView.ItemIndex := ListView.FindItemByPosition(ListView.AbsoluteToLocal(Point).X, ListView.AbsoluteToLocal(Point).Y); где Point - это координаты нужной точки Point: TPointF
  16. в МодернЛВ есть свойства для отступов. Можно задать верхний отступ для итемов, чтобы в эту область всунуть те же SpeedButton
  17. Ну навскидку можно попробовать вот так: procedure TForm1.Button1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin Button1.BeginUpdate; Button1.Width := Canvas.TextWidth(Button1.Text); Button1.EndUpdate; end;
  18. Я так понимаю, что "экраны" - это отдельные формы? А нажатие клавиши обрабатываете в главной форме? Если так, то, как вариант, вместо форм использовать фреймы. И тогда все заработает почти без изменений в коде
  19. вот тут я делал демку по видео (источник там есть) https://github.com/sinuke/Image-Zoom-Demo
  20. Вышло обновление до версии 1.5.0: - Исправлены переходы в глоссарии - Значительно уменьшен размер приложения - Настройки автоматической проверки обновлений - [Windows] Переработка приложения для Windows - [Windows] Добавлены анимации перехода - [Windows] Минимальные размеры окна ограничены 800 пикселями по ширине и 600 по высоте - [Android] Системная строка подкрашивается в "фирменный" синий во всех режимах работы приложения - [Android] Отключена анимация перетаскивания элементов бокового меню - [Android] Индикатор загрузки - [Android] Навигационная панель больше не перекрывает интерфейс приложения - [Android] Исправлена ошибка с сохранением PDF-документа - [Android] Увеличена скорость вывода информации и тестирования - [Android] Немного изменен внешний вид экрана вывода результата тестирования Ссылка на скачивание Android-версии: https://yadi.sk/d/edIZR2VuuRFce Ссылка на скачивание Windows-версии: https://yadi.sk/d/iIeC0OE8ukMoi
  21. может этому прямоугольнику нужно изменить свойство HitTest на False?
  22. не, ресурсы на андройде располагаются там же, где и файлы деплоймента (вернее по пути, что возвращает TPath.GetDocumentsPath)
  23. Есть TAnimator.AnimateFloatWait - после вызова можно и панельку скрыть
  24. под андройд не работают Ansi функции, потому как там и строки совсем другие (нуль терминированные строки) лучше наверное через хелпер для строк делать UpperCase, например так: var s: string; begin s := 'fdf'; ShowMessage(s.UpperCase(s)); end; если в чем не прав - поправьте =))
  25. необходимо использовать жесты. обрабатывать их нужно в событии OnGesture для определения того, что происходит в данный момент, есть EventInfo, с помощью которого можно узнать начался жест, окончился или нужно действовать по инерции (это свойство Flags). так же с помощью EventInfo можно узнать, какой именно жест происходит, а так же текущие координаты в качестве примера вот можете глянуть мою "демку" (это я делал пробу пера для одного проекта). код не претендует на звание эталонного, но вроде понятный test_touchanim.zip
×
×
  • Создать...