Перейти к содержанию
  • Регистрация
  • 0
enatechno

"Нестабильный" вызов OnSelectCell в Berlin?

Вопрос

Откомпилировав тестовый проект в Berlin для Android (4.3, 5.1), обнаружил, что событие OnSelectCell стало "нестабильным". Т.е. если я делаю Tap по ячейкам StringGrid, то OnTap отрабатывает всегда, а OnSelectCell - не всегда.
К тому же иногда нарушается последовательность вызова событий.
Последовательность обработки событий в Android была такой (в Seattle и более ранних версиях):
1). OnTap; 
2). OnSelectCell.

Как лечить?
SelectCell.png

 

 

test_SelectCell.rar

Изменено пользователем enatechno

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Извините за возможной офф топ или за комент, но, мне кажется grid для мобилы - это зло!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

6 минут назад, Vitaldj сказал:

Извините за возможной офф топ или за комент, но, мне кажется grid для мобилы - это зло!

Всё, всё завязыва работу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

По существу вопроса. Обратите внимание SelectCell срабатывает при возможной смене ячейки т.е. не всегда. Раньше, я смотрю, событие срабатывало при попытке выделить "дизабленную" ячейку, и фактически ни чего не происходило, но событие срабатывало.

Если между нажатием и отпусканием вы перемещаете палец, то это интерпретируется как попытка перетащить содержимое. Т.е. касания должны быть как бы более акцентированные что ли, чтобы сменить выбранную ячейку.

Вообще говоря не стоит строить свой алгоритм на предположении что Tap и SelectCell жестко связаны. Переход  к другой ячейки может осуществляться многими способами, стрелками, кнопками навигации, по по нажатию на клавишу ввода и т.п. Tap не срабатывает при использовании мыши.

Воспроизвести двойное срабатывание SelectCell мне не удалось. И всегда Tap срабатывает до SelectCell. Какое у вас устройство? Я попробую по-тестировать на нем, если Vitaldj разрешит :D

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, RoschinSpb сказал:

По существу вопроса. Обратите внимание SelectCell срабатывает при возможной смене ячейки т.е. не всегда. Раньше, я смотрю, событие срабатывало при попытке выделить "дизабленную" ячейку, и фактически ни чего не происходило, но событие срабатывало.

Если между нажатием и отпусканием вы перемещаете палец, то это интерпретируется как попытка перетащить содержимое. Т.е. касания должны быть как бы более акцентированные что ли, чтобы сменить выбранную ячейку.

Вообще говоря не стоит строить свой алгоритм на предположении что Tap и SelectCell жестко связаны. Переход  к другой ячейки может осуществляться многими способами, стрелками, кнопками навигации, по по нажатию на клавишу ввода и т.п. Tap не срабатывает при использовании мыши.

Воспроизвести двойное срабатывание SelectCell мне не удалось. И всегда Tap срабатывает до SelectCell. Какое у вас устройство? Я попробую по-тестировать на нем, если Vitaldj разрешит :D

 

Сам товарищ разработчик пожаловал! ;)). Это событие! (Побежал за пивом))). Ну про grid ИМХО. Если еще для планшетов, это куда не шло, то для телефонов, ну не мобильный это интерфейс! Уж простите, за прямоту! В новой версии двойной клик вернете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А вот есть такая конторка, Microsoft называется, так она целый Excel для мобильников сделала :) 
В целом конечно надо с особой осторожностью подходить к использованию таблиц в мобильных устройствах да и вообще учитывать некоторые особенности при разработке интерфейса, но это уже вопросы второго порядка. В идеале к которому мы стремимся: то, что работает на дэсктопе должно работать и на телефоне без переделок.
OnDblClick в public как был так и остался.
В следующей версии в Published должны появиться

  TCellClick = procedure(const Column: TColumn; const Row: Integer) of object;
    property OnCellClick;
    property OnCellDblClick;

Будут срабатывать в таком порядке
OnSelectCell([StringGrid1] 4; 8)
OnSelChanged([StringGrid1] 4; 8)
OnCellClick([StringGrid1] Progress; Row: 8)
OnCellDblClick([StringGrid1] Progress; Row: 8)

но это секрет и оффтоп в данной теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, RoschinSpb сказал:

Обратите внимание SelectCell срабатывает при возможной смене ячейки т.е. не всегда

Я каждый раз нажимал на новую ячейку. Для "чистоты" теста после ячейки из первой колонки нажимал на ячейку второй колонки (и наоборот). Все ячейки Enabled.

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

Воспроизвести двойное срабатывание SelectCell мне не удалось.

У меня не было двойного срабатывания тоже. У меня были случаи не срабатывания SelectCell. На скрине (Berlin): 10 Tap и 7 SelectCell. Т.е. при 10 "тапах" на ячейках трижды не сработал SelectCell.

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

Какое у вас устройство?

Nexus 7 (Android 5.1), Samsung GalaxyS III (4.3)

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

Вообще говоря не стоит строить свой алгоритм на предположении что Tap и SelectCell жестко связаны.

Логично. Я просто привел пример как было в прошлой версии, а также использовал OnTap для подтверждения, что устройство приняло жест пользователя.

 

Изменено пользователем enatechno

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, enatechno сказал:

У меня не было двойного срабатывания тоже.

Я имею ввиду, что бы было два SelectCell подряд как в вашем примере. У меня Nexus 7. Ладно, в общем принял к сведению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Алиса Романец
      Доброго времени суток всем!
      В VCL была возможность скрыть полосы прокрутки на TStringGrid. Оно не отключало скролл, но оно позволяло спокойно сделать таблицу с n-ым количеством колонок одинаковой ширины без появления горизонтальной полосы проркрутки. Есть ли что-то подобное в FireMonkey, а в особенности отключение не всех сразу, а лишь одной (горизонтальной) полосы прокрутки?
    • От zekelive
      Товарищи, здравствуйте. Хотел бы проконсультироваться с вами на довольно сложно для меня тему. Имеется клиентское мобильное приложение на Андроид. Принцип его просто, загружает фирмы из БД в scrollbox. За счёт того, что сразу загрузка всех данных из сервера занимает длительное время, было принято решение загружать с сервера только ключевую информацию (название фирмы), а остальную информацию загружать из локальной БД. При этом, т.к. файл БД можно легко вытащить из apk файла любому человеку, размещать всю БД на локалке нельзя. Только информацию в целом не представляющую большой значимости в отдельности от названия фирмы и не только. 
      Вопрос, правильная ли схему построения была выбрана с точки зрения защиты данных (если это так можно назвать), и оптимизации загрузки информации. 
      Приветствуются ваши советы, как лучше построить схему взаимодействия приложения с БД, или как лучше защитить данные. В идеале для быстродействия, загнать побольше данных в локальную БД. 
    • От Sashar333
      Здравствуйте!
      Помогите разобраться пожалуйста.
      Delphi 10.1 и 10.2, Windows
      Программа прекрасно работала и программировалась.
      Добавил две колонки в StringGrid:

      сразу понял что не красиво и попытался их удалить(ничего в программе больше не менял и не добавлял!?) таким образом:

      но после нажатии кнопки "Delete" получил сообщение:

      дальше программировать, данный проект, нет возможности из таких сообщений и дальнейших разрушительных сбоев
      при новой загрузке проекта в DELPHI все работает и запускается, Project1.exe из Debug'а тоже работает.
      Но стоит только в DELPHI попытать что то сделать(бывает достаточно навести курсор мыши) с именно этим StringGrid то сразу выдает ошибки:


      помогает полное удаление StringGrid но так как 
      это не в первый раз и в разных версиях это сильно напрягает
      переустановки delphi не помогают
      может кто знает в чем дело?
      Заранее спасибо за ответ...
    • От Павел Караваев
      Добрый вечер, форумчане! Возможно ли менять ширину разделительных линий в StringGrid'е, гугол мне с этим не помог. Мне необходимо каждую пятую вертикальную и каждую пятую горизонтальную линию чуть шире остальных.(Delphi 10.2, Windows)
    • От Павел Караваев
      Люди добрые, помогите) Я не понимаю, как закрасить ячейки в зависимости от информации в данной ячейке. Если в ячейке 1, то нужно покрасить белым, если 0, то чёрным. Имеющиеся на форуме ответы не помогают, ячейки не красятся=(
    • От Sashar333
      Здравствуйте! Delphi 10.1 Berlin, android 6
      Есть СomboBox, в нем выбираю фильтр для вывода в StringGrid списка из файла базы.
      При выборе в ComboBox "ВСЕ" - StringGrid заполняется большим! списком, который соответственно можно прокручивать по инерции
      Есть выбор "1" в ComboBox, при котором StringGrid заполняется всего несколькими записями, которые умещаются в пол экрана(которые не прокручиваются)
      Момент такой: Если StringGrid прокручивается по инерции(с выбором "ВСЕ"), а в этот момент выбрать выбор "1"  то  приложение вылетает (на android)
      Я так понял это из-за того что Stringу нечего прокручивать!?
      Подскажите пожалуйста решение этой проблемы . Заранее спасибо!
    • От RubenKamp
      Добрый день господа.
      Уже несколько часов не могу разобраться с медиаплеером, не могу воспроизвести mp3 файл, прошу помощи.
      В Deployment файл добавлен.
      uses System.IOUtils;
      MediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, 'Correct.mp3');
      MediaPlayer1.Play;
      Ошибка: Не поддерживаемый медиа файл.
      Делал так MediaPlayer1.FileName:=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath(),'Correct.mp3'); и та же ошибка.
      А так работает: MediaPlayer1.FileName := 'D:\PRG\app\Slide #11\Sound\Correct.mp3';
      Что изменилось в Berlin-е?
    • От Mazzay
      Есть хоть какая-нибудь возможность зафиксировать первый столбец, чтобы он не прокручивался?
      То есть нужен аналог свойства FixedCols из VCL,
    • От Евгений Корепов
      Господа и товарищи, помогите тупому мне! Столкнулся с странным. Под windows все отлично работает, а под android не могу добиться загрузки картинок. Мозг уже сломал.
      Собрал тестовый проект - в ListView (DynamicAppearance) добавляем 4 ListViewItem, в ListViewUpdatingObjects все создаем и грузим картинки из инета (потоки и прочее убрал для упрощения). Картанка слева, текст (URL) справа, проще некуда. Прилагаю к сообщению архив проекта и код.
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, System.Net.HTTPClient, FMX.Objects; type TFormMain = class(TForm) ListView: TListView; procedure ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } ListViewUpdate : Boolean; procedure MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); procedure InitListView(AListView : TListView); function LoadImageFromURL(AURL : String) : TBitmap; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin ListViewUpdate:=False; end; procedure TFormMain.FormShow(Sender: TObject); begin InitListView(ListView); end; procedure TFormMain.InitListView(AListView : TListView); Var AListViewItem : TListViewItem; AImageURL : String; begin AImageURL:='http://kayfolom.ru/images/test/'; ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + 'logo.png'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '000487806d3a2ab98aeb2c47b810fc8b.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0012ef6cb42e95268a4cd1d832a2b93a.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0022454ccb4f81a701cb3a3c89d52d2f.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); end; procedure TFormMain.ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin if Not ListViewUpdate then begin MyListViewUpdateObjects(Sender as TListView, AItem); AHandled:=True; end; end; procedure TFormMain.MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); Var AName : TListItemText; AImage : TListItemImage; AvailableWidth, ImageWidth, ImageHeight : single; function SetupTextObject(const AName, AText : String; AFontSize : Single; AFontStyles : TFontStyles; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText; begin Result:=TListItemText(AItem.View.FindDrawable(AName)); if Result=Nil then Result:=TListItemText.Create(AItem); Result.Name:=AName; Result.Width:=AWidth; Result.WordWrap:=True; Result.Font.Size:=AFontSize; Result.Font.Style:=Result.Font.Style + AFontStyles; Result.Trimming:=TTextTrimming.None; Result.Text:=AText; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.TextAlign:=ATextAlign; Result.TextVertAlign:=ATextVertAlign; Result.Height:=AHeight; end; function SetupImageObject(const AName : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign) : TListItemImage; Var AImageURL : String; begin Result:=TListItemImage(AItem.View.FindDrawable(AName)); if Result=Nil then begin Result:=TListItemImage.Create(AItem); AImageURL:=AItem.Data['ImageURL'].AsString; Result.Bitmap:=LoadImageFromURL(AImageURL); end; Result.Name:=AName; Result.Width:=AWidth; Result.Height:=AHeight; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.ScalingMode:=TImageScalingMode.StretchWithAspect; end; begin AvailableWidth:=AListView.Width - AListView.ItemSpaces.Left - AListView.ItemSpaces.Right; // Изображение размещаем слева ImageWidth:=AvailableWidth / 3; ImageHeight:=AvailableWidth / 3; AImage:=SetupImageObject('Image', ImageWidth, ImageHeight, 0, 0, TListItemAlign.Leading, TListItemAlign.Leading); // Текст справа AName:=SetupTextObject('Name', AItem.Data['ImageURL'].AsString, 14, [], AvailableWidth - ImageWidth, ImageHeight, ImageWidth, 0, TListItemAlign.Leading, TListItemAlign.Leading, TTextAlign.Center, TTextAlign.Center); AItem.Height:=Round(ImageHeight + AListView.ItemSpaces.Top + AListView.ItemSpaces.Bottom); end; function TFormMain.LoadImageFromURL(AURL : String) : TBitmap; Var AHTTPClient : THTTPClient; AStream : TMemoryStream; HTTPResponse : IHTTPResponse; begin Result:=Nil; AHTTPClient:=THTTPClient.Create; AStream:=TMemoryStream.Create; try HTTPResponse:=AHTTPClient.Get(AURL, AStream); finally if HTTPResponse.StatusCode=200 then Result:=TBitmap.CreateFromStream(AStream); end; end; end.  
      test092 ListView with Image.7z
    • От rakhmet
      Оказался в крайне идиотской ситуации: единственный iPhone 5s был обновлён до 10.2. Даже не спрашивайте как - рассказать всё равно не смогу, один глаз уже и так дёргается 
       
      В общем, Xcode 8.0 не работает с iOS 10.2. Обновить старенький Xcode 8.0 я не могу, потому что с обновлённым Xcode 8.2, в свою очередь, не работает Delphi Berlin Update 2. При этом откатить iOS могу максимум до 10.1, но мне нужна минимум iOS 10.0 - просто чтобы хотя бы заткнуть Xcode 8.0 
       
      Что можно сделать?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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