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

x11

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

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

  • Посещение

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

    13

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

  1. Процедура добавления Item procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.PopupMenu := PopupMenu1; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; У popupmenu есть 2 пункта, привязанных к Action. Gestures срабатывает на "long tap" procedure TfmEditObject.lbPhotosGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var c: IControl; ListBox: TListBox; lbxPoint: TPointF; ListBoxItem: TListBoxItem; begin if EventInfo.GestureID = igiLongTap then if (sender is TListBox) and assigned(TListBox(sender).Selected) then begin c := ObjectAtPoint(EventInfo.Location); if Assigned(c) then if Assigned(c.GetObject) then if c.GetObject is TListBox then begin ListBox := TListBox(c.GetObject); lbxPoint := ListBox.AbsoluteToLocal(EventInfo.Location); ListBoxItem := ListBox.ItemByPoint(lbxPoint.X, lbxPoint.Y); if Assigned(ListBoxItem) then PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y); Handled := True; end; end; end; Ставил точку останова, видно, что до строки "PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y);" доходит. Если программа работает на Windows, то меню отображается по правой кнопке мышки, а на андроид устройстве меню не отображается по Long Tap. Как видно из кода, то меню прикручивается к ListBoxItem, а непосредственно к TListBox меню прикрутил в дизайне.
  2. x11

    ListBoxItem и OnGesture

    да, поэтому отключено
  3. Возможно. Мало примеров и информации на русском.
  4. Я могу перевести и без переводчика. Я не могу понять, откуда лезет ошибка. Из внутренностей FMX? Ведь ошибка происходит до моего кода. Вот что заметил. Если я перед нажатием на кнопку тапну по ListBox`у, то ошибки не возникает.
  5. но всё равно, в каждой форме, где планируется использовать InputDialog, нужно создавать свой InputDialogHandler.
  6. x11

    ListBoxItem и OnGesture

    Здесь https://stackoverflow.com/questions/35921419/firemonkey-how-to-add-longtap-gesture-to-runtime-made-listboxitems/35938554 подсказывают, что Сделал для ListBox. Рвботает, но только на Андроиде.
  7. x11

    ListBoxItem и OnGesture

    In order to use Interactive Gestures such as zoom and rotate in a component, you do not need to associate the component with a Gesture Manager. http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Gesturing_Overview
  8. x11

    ListBoxItem и OnGesture

    У ListBoxItem нужно реализовать вызов контекстного меню. На ListBoxItem лежит ImagesViwer с картинкой и у ImagesViwer свойство HitTest отключено. почитал справку http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Gestures_in_FireMonkey сделал как описано: procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.Touch.GestureManager := GestureManager1; item.Touch.InteractiveGestures := [TInteractiveGesture.LongTap, TInteractiveGesture.DoubleTap]; item.OnGesture := ListBoxItemGesture; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; procedure TfmEditObject.ListBoxItemGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); Var s: string; begin if GestureToIdent(EventInfo.GestureID, s) then ShowMessage( S ); if EventInfo.GestureID = igiLongTap then ShowMessage( Sender.ClassName ); Handled := True; end; Ничего не происходит. На на андроид устройстве, ни на винде. И правильно ли я понял, что для LongTap, т.е. для InteractiveGestures не нужен GestureManager?
  9. А как реализовать у ListBox и у ListBoxItem длинный (продолжительный) Tap? Т.е. нужно вызвать контекстное меню для выбранного (выделенного) ListBoxItem`а. Для Windows продолжительный Tap - это просто щелчок правой кнопкой мышки, а для Android - это продолжительный тап. Например, чтобы удалить или расшарить то ,что лежит на ListBoxItem.
  10. И вот какая странность: если нажать кнопку TakePhotoFromCameraAction, то появляется возможность сфоткать и ошибок нет. А потом нажимаю эту проблемную кнопку и уже в этом случае ошибка "invalid class type cast" не появляется более.
  11. procedure TfmEditObject.TakePhotoFromLibraryAction1DidFinishTaking( Image: TBitmap); begin ShowMessage('TakePhotoFromLibraryAction1DidFinishTaking'); AddPhoto(Image); end; procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; // ListItemImage: TListViewItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; // ListItemImage := ListView1.Items.Add; // ListItemImage.Height := self.Width; // ListItemImage.Bitmap.Assign(Image); end; При нажатии на SpeedButton получаю invalid class type cast. Ставлю бряку (на картинке подтверждение). Но ошибка вываливается до неё. ShowMessage('TakePhotoFromLibraryAction1DidFinishTaking'); не появляется
  12. Вверху - ListBox + TImageViewer. Внизу - ListView. Недостатки ListView в том ,что не получается растянуть картинку по всей ширине. Плюсы ListBox в том, что можно сделать горизонтальную прокрутку, а с помощью TImageViewer можно масштабировать.
  13. В общем теперь так: procedure TfmReference.InputDialogHandlerInsert(const AResult: TModalResult; const AValues: array of string); begin //запрос на добавление case AResult of mrOk: if not AValues[0].IsEmpty then begin sqlInsert.sql.Text := Format('Insert into %s (name) values(' + QuotedStr(AValues[0]) + ')', [GetTableName]); sqlInsert.Execute; if sqlInsert.Transaction.Active then sqlInsert.Transaction.Commit; actRefreshExecute(nil); end;// end;// case end; procedure TfmReference.InputDialogHandlerEdit(const AResult: TModalResult; const AValues: array of string); Var id: integer; begin //запрос на редактирование case AResult of mrOk: if not AValues[0].IsEmpty then begin id := StrToIntDef(ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('id').Text, -1); sqlInsert.sql.Text := Format('update %s set name = ' + QuotedStr(AValues[0]) + 'where id = ' + IntToStr(ID), [GetTableName]); sqlInsert.Execute; actRefreshExecute(nil); end; end;// case end; procedure TfmReference.MyInputCloseDialogProc(const AResult: TModalResult); Var id: integer; begin // запрос на удаление if AResult = mrYes then begin id := StrToIntDef(ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('id').Text, -1); sqlInsert.sql.Text := Format('delete from %s where id = ' + IntToStr(ID), [GetTableName]); try sqlInsert.Execute; actRefreshExecute(nil); except on e:exception do begin ShowMessage('Ошибка удаления. ' + e.Message + sLineBreak + sqlInsert.sql.Text); end;// on e:exception do end;// try end end; пример использования: procedure TfmReference.actInsertExecute(Sender: TObject); Var val: array of string; cap: string; begin // добавляем запись SetLength(val, 1); val[0] := ''; cap := comboRefType.Items[comboRefType.ItemIndex]; TDialogService.InputQuery(cap, ['Добавить: '], Val, InputDialogHandlerInsert); end; procedure TfmReference.actEditExecute(Sender: TObject); Var val: array of string; cap: string; begin // редактируем запись if not Assigned(ListView1.Selected) then begin ShowMessage('Выберите строку'); exit; end; SetLength(val, 1); val[0] := ListView1.Items[ListView1.Selected.Index].Objects.FindObjectT<TListItemText>('name').Text; cap := comboRefType.Items[comboRefType.ItemIndex]; TDialogService.InputQuery(cap, ['Изменить: '], Val, InputDialogHandlerEdit); end; procedure TfmReference.actDeleteExecute(Sender: TObject); Var id: integer; begin // удаляем запись if not Assigned(ListView1.Selected) then begin ShowMessage('Выберите строку'); exit; end; // resDel := False; TDialogService.MessageDialog('Удалить выбранную строку?', TMsgDlgType.mtConfirmation, mbYesNo, TMsgDlgBtn.mbYes, 0, MyInputCloseDialogProc); end; Т.е., как видите, получается 6 процедур вместо трёх.
  14. Мало того, в каждой форме и на каждый чих нужно создавать свой TForm1.InputDialogHandler ? Например, процедуры добавление, удаление и редактирование. Нужно создавать три разных InputDialogHandler. Это и так три разных процедуры, а получается, что нужно создать ещё по одной.
  15. Да я всё понимаю и не против отсутствия модульных окон. Получается, что в каждой форме нужно лепить <TForm>.InputDialogHandler"? Просто это противоречит принципу ООП: один раз написал, много раз используй.
  16. Неужели никак нельзя придумать "обёртку" TDialogService.InputQuery?
  17. Да, попробую и listview, конечно же. Спасибо за советы.
  18. Нет. В данном случае речь идёт о форме добавления/редактирования объявления, где будет три закладки: основные параметры, дополнительные и вкладка Фото.
  19. А если я использую все стандартные темы FMX? В каждую тему нужно что-то добавлять своё? Нет, этот вариант отпадает.
  20. Мне десяток фото на форме показывать. Вы уверены, что лучше ListView?
  21. а если будет " detail " то не будет ли видна дополнительная кнопка?
  22. Дело в том ,что нужна не иконка, а полноценное отображение разного типа картинок, т.е. фотографий.
  23. т.е. придётся лепить тот старый овнокод в каждой процедуре
  24. Да, я уже понял, что в этом дело. Тут уже в другом вопрос: то, что я добавил while r.Res = mrNone do Application.ProcessMessages; это нормально или нельзя так?
×
×
  • Создать...