-
Постов
190 -
Зарегистрирован
-
Посещение
-
Победитель дней
35
Весь контент sinuke
-
В общем, сделал пока вот так: 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 Ну а если кто может предложить вариант получше, не стесняйтесь
- 4 ответа
-
- listview
- listviewitem
-
(и ещё 1 )
C тегом:
-
неа, не работает. вот код, эффекта ноль: 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
- 4 ответа
-
- listview
- listviewitem
-
(и ещё 1 )
C тегом:
-
Доброго дня, форумчане Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить У кого какие мысли? Как реализовать? Delphi 10.2 Tokyo
- 4 ответа
-
- listview
- listviewitem
-
(и ещё 1 )
C тегом:
-
сложно сказать. у меня в проекте, собранном в Токио, MapView работает и все нормально. только создается он динамически
- 7 ответов
-
- tmapview
- не работает
-
(и ещё 1 )
C тегом:
-
подберите размер ListBoxItem таким образом, что при полном заполнении списка, последний итем на экране показывался не полностью, а частично. тогда точно будет понятно, что что-то дальше в списке есть
-
Есть несколько способов: 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). Но возможно будут проблемы с самим браузером, т.к. этот компонент иногда непредсказуем
-
Как я понимаю, вы пытаетесь открыть внешним приложением файл, который находится в "закрытой" области, которая доступна только вашему приложению или приложениям с рутом. Как вариант, для того, чтобы иметь возможность открыть этот PDF его нужно сохранить в какую-нибудь Shared-папку. Без сохранения можно попробовать бросить на форму TWebBrowser и указать в качестве ссылки "file://ссылка на pdf" (но это не точно, не проверял)
-
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\
-
не надо удалять/пересоздавать. просто нужно контролировать эти добавляющиеся строки в Memo. для этого можно использовать свойства Tag и TagString чтобы знать, какой компонент соответствует какой строке.
-
я так понял, что ваш код выдает следующее: а надо: как я и говорил, нужно просто указывать координату вновь создаваемому компоненту: 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;
-
если я правильно понял проблему, то надо явно указывать координату для компонента, желательно чтобы она была "координата предыдущего + высота предыдущего + 1"
-
я как-то помечал изображения (ставил 1, 2 ,3 ...). так вот на двух устройствах с оскейлами 2 и 3 использовалась одна и та же картинка
-
FindItemByPosition - вот тут можно найти https://github.com/rzaripov1990/ModernListView. просто скопировать два файла FMX.ListView.pas и FMX.ListView.Types.pas в папку с проектом да и высоты всех итемов (и футеров и хидеров) тоже можно узнать. самое просто - циклом пройтись и прибавлять к некой переменной высоту текущего итема. как только эта сумма станет больше локальной координаты, то найден нужный итем
-
Для стандартного 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
-
Ну навскидку можно попробовать вот так: procedure TForm1.Button1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin Button1.BeginUpdate; Button1.Width := Canvas.TextWidth(Button1.Text); Button1.EndUpdate; end;
-
Я так понимаю, что "экраны" - это отдельные формы? А нажатие клавиши обрабатываете в главной форме? Если так, то, как вариант, вместо форм использовать фреймы. И тогда все заработает почти без изменений в коде
-
вот тут я делал демку по видео (источник там есть) https://github.com/sinuke/Image-Zoom-Demo
-
Вышло обновление до версии 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
-
не, ресурсы на андройде располагаются там же, где и файлы деплоймента (вернее по пути, что возвращает TPath.GetDocumentsPath)
-
Есть TAnimator.AnimateFloatWait - после вызова можно и панельку скрыть
-
под андройд не работают Ansi функции, потому как там и строки совсем другие (нуль терминированные строки) лучше наверное через хелпер для строк делать UpperCase, например так: var s: string; begin s := 'fdf'; ShowMessage(s.UpperCase(s)); end; если в чем не прав - поправьте =))
-
необходимо использовать жесты. обрабатывать их нужно в событии OnGesture для определения того, что происходит в данный момент, есть EventInfo, с помощью которого можно узнать начался жест, окончился или нужно действовать по инерции (это свойство Flags). так же с помощью EventInfo можно узнать, какой именно жест происходит, а так же текущие координаты в качестве примера вот можете глянуть мою "демку" (это я делал пробу пера для одного проекта). код не претендует на звание эталонного, но вроде понятный test_touchanim.zip