Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
А нет ли у TStringGrid / TDrawGrid подходящего события, в котором можно задать BoundsRect у встроенного редактора (InplaceEditor) ?
Было бы удобно, если бы предусмотрели специальное событие.

Нужно для того, чтобы в одной ячейке рисовать значок и справа от него текст, который в режиме редактирования ячейки не затирает значок.
Другими словами, чтобы левая граница редактора смещалась вправо от значка.
Или я хочу странного ?

Почти получилось в событии OnGetEditText таким образом:
var
  NewRect: TRect;
begin
  if StringGrid.EditorMode then
  begin
    case ACol of
      1:
      begin
        NewRect := StringGrid.InplaceEditor.BoundsRect;
        NewRect.Left := NewRect.Left + ImagesGrid.Width + 8;
        StringGrid.InplaceEditor.BoundsRect := NewRect;
      end;
    end;
  end; 

Но эффект пропадает, если сетку отсортировать кликом по заголовку .
Лазарус 1.8.0RC5

К сообщению приложен файл. Размер - 12Kb
1 дек 17, 23:53    [20999927]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Freedoom
Guest
Ghost Writer, см property OnSelectEditor
2 дек 17, 23:32    [21001497]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
Freedoom,

пробовал, нет эффекта.
2 дек 17, 23:46    [21001538]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
Ghost Writer
OnGetEditText
Продублировал в OnHeaderClick.
Вроде ничо так, но присутствует ощущение костыля.
Надеюсь, больше нигде не вылезет боком.
3 дек 17, 02:04    [21001746]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Freedoom
Guest
Ghost Writer
пробовал, нет эффекта.

Приз Код в студию
3 дек 17, 16:33    [21002329]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
Freedoom
Код в студию
ну вот так
procedure TForm1.StringGridSelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
var
  NewRect: TRect;
begin
  NewRect := Editor.BoundsRect;
  NewRect.Left := NewRect.Left + ImagesGrid.Width + 8;
  Editor.BoundsRect := NewRect;
end;
3 дек 17, 17:10    [21002382]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Freedoom
Guest
Ghost Writer, не совсем правильное понимание события. См. исходники:
procedure TCustomGrid.SelectEditor;
var
  aEditor: TWinControl;
begin
  {$ifdef DbgGrid}
  DebugLnEnter('TCustomGrid.SelectEditor INIT');
  {$endif}
  aEditor := GetDefaultEditor(Col);
  if EditingAllowed(FCol) and Assigned(OnSelectEditor) then begin
    // in some situations there are only non-selectable cells
    // if goAlwaysShowEditor is on set initially editor to nil,
    // user can modify this value in OnSelectEditor if needed
    if not SelectCell(FCol,FRow) then
      aEditor:=nil;
    OnSelectEditor(Self, fCol, FRow, aEditor);
  end;
  if aEditor<>Editor then
    Editor := aEditor;
  if Assigned(Editor) and not Assigned(Editor.Popupmenu) then
    Editor.PopupMenu := PopupMenu;
  {$ifdef DbgGrid}
  DebugLnExit('TCustomGrid.SelectEditor END');
  {$endif}
end;

Смысл события - назначить свой редактор. Реализацию и перекрываемые методы редактора лучше смотреть в grids.pas
Можно реализовать свой, наследовав от TStringCellEditor
3 дек 17, 20:18    [21002603]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
Freedoom
не совсем правильное понимание события
у меня ? а кто мне это советовал ?
Freedoom
Ghost Writer, см property OnSelectEditor
я вчера справочку прочитал, так что с пониманием всё нормально http://wiki.freepascal.org/Grids_Reference_Page/ru#Grid_Cell_Editors
3 дек 17, 20:27    [21002617]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Freedoom
Guest
Ghost Writer
я вчера справочку прочитал, так что с пониманием всё нормально http://wiki.freepascal.org/Grids_Reference_Page/ru#Grid_Cell_Editors
Предлагаю более подробно рассмотреть приведённую в тексте ссылку
Example: How to set a custom cell editor
See lazarus/examples/gridexamples/gridcelleditor/gridcelleditor.lpi
3 дек 17, 20:54    [21002643]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 718
Freedoom,

ясно, спасибо.
Получается, что стандартные редакторы грид перемещает сам, а инородные надо ручками.

При сортировке тоже косяк: ComboBox1 остался на месте, а ячейка под ним уже другая. Тоже придется OnHeaderClick корректировать позицию.

И вторая бяка: заменил ComboBox на TEdit, BorderStyle := bsNone и текст прилип к верхнему краю. А выравнивания по вертикали нет.

Наверно выкину StringGrid

К сообщению приложен файл. Размер - 24Kb
3 дек 17, 21:56    [21002732]     Ответить | Цитировать Сообщить модератору
 Re: сместить InplaceEditor у TStringGrid (Lazarus)  [new]
Freedoom
Guest
Ghost Writer
TEdit, BorderStyle := bsNone и текст прилип к верхнему краю. А выравнивания по вертикали нет.

Попробуйте TEdit.Height := TStringGrid.DefaultRowHeight; Так же можно поэксперементировать с drawgrid
4 дек 17, 01:53    [21002943]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить