Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VirtualTreeView - вызов редактора по нажатию enter, как сделать? 
V
    Опции темы
Чoо
Дата 2.3.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Как сделать, что бы редактирование текущей ячейки началось по нажатию кнопки Enter? так же, как сделать, что бы редактирование текущей ячейки начиналось, если щелкать не по тексту, а по самой ячейке? Как сделать навигацию между соседними колонками, по нажатию кнопок клавиатуры?
 smile 
Для решения первого вопроса  пробовал событие onKeyDown, а для второго OnDblClick, там вызывал метод EditNode, но один из его параметров - колонка. Вот не знаю как получить индекс колонки. Третий вопрос вообще не знаю как решить.
буду рад советам.

по enter так вроде работает:
Код

procedure TRxDatEdit1.VTKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_LEFT:;
    VK_RIGHT:;
    VK_RETURN:
      begin
        VT.EditNode(ChengedNode,vt.Header.Columns.ClickIndex);
      end;
  end;
end;

однако если VT.EditNode(ChengedNode,vt.Header.Columns.ClickIndex); повесить на даблклик - редактирвоание не начинается. еще что не нравится, так если вызываешь редактор, так надо жать не только на текст, но и щелкать мышкой медленно..

Это сообщение отредактировал(а) Чoо - 2.3.2010, 16:27


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
kami
Дата 2.3.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



по п.1 и 3:
Код

procedure TfrState.vtKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Node: PVirtualNode;
  vtx: TVirtualStringTree;
begin
  vtx := TVirtualStringTree(Sender);
  if not vtx.IsEditing then
    if (Key in [VK_RETURN, VK_SPACE]) // начинать редактирование по пробелу и Enter
      and (Shift = []) then
      begin
        Node := vtx.GetFirstSelected;
        if Assigned(Node) then
          vtx.EditNode(Node, vtx.FocusedColumn);
      end
    else
      if Key = VK_RIGHT then
        begin
          vtx.FocusedColumn := vtx.Header.Columns.GetNextVisibleColumn(vtx.FocusedColumn, True);
        end
      else
        if Key = VK_LEFT then
          begin
            vtx.FocusedColumn := vtx.Header.Columns.GetPreviousVisibleColumn(vtx.FocusedColumn, True);
            Key := 0;
          end;
end;



Цитата(Чoо @  2.3.2010,  15:22 Найти цитируемый пост)
как сделать, что бы редактирование текущей ячейки начиналось, если щелкать не по тексту, а по самой ячейке?

Не понял вопроса. А разве оно не начинается? По сути: в версии 3.2.6 в treeOptions>MiscOptions> опции EditOnClick и EditOnDblClick
PM MAIL WWW   Вверх
Чoо
Дата 2.3.2010, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



kami, ух ты.. то над чем пол дня провозился, но так и не победил так просто выглядит smile, спасибо 
Цитата

Не понял вопроса. А разве оно не начинается? По сути: в версии 3.2.6 в treeOptions>MiscOptions> опции EditOnClick и EditOnDblClick

начинается, если щелкаю на сам текст. а если в ячейке текста нет, то приходится "тыкаться" вслепую на начало ячейки, что бы началось редактирование. 
SelectionOptions:
Код

[toExtendedFocus,toFullRowSelect,toSimpleDrawSelection]

MiscOptions:
Код

[toAcceptOLEDrop,toCheckSupport,toEditable,toFullRepaintOnResize,toInitOnSave,toToggleOnDblClick,toWheelPanning,toEditOnClick,toEditOnDblClick]

остальное наверное ни как не влияет. 



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
kami
Дата 2.3.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



----- глупость написал, не читать smile

Upd: попробуй SimpleDrawSelection поставить в False

Это сообщение отредактировал(а) kami - 2.3.2010, 22:15
PM MAIL WWW   Вверх
Dom
Дата 2.3.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Надо чтобы границы ячеек в таблице отображались?
Может это поможет - toShowVertGridLines, toShowHorzGridLines. Внешний вид самих линий тоже можно кажется настроить.
PM MAIL   Вверх
Caduser
Дата 2.3.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 2.10.2006
Где: г. Хабаровск

Репутация: 1
Всего: 1



Цитата(Чoо @ 2.3.2010,  15:22)
... так надо жать не только на текст, но и щелкать мышкой медленно..

Так же хочется решить эту проблему. Пользователей очень раздражает невнятный переход в режим редактирования по "медленному" клику мыши в VirtualTree.

Это сообщение отредактировал(а) Caduser - 2.3.2010, 23:28
PM MAIL ICQ   Вверх
kami
Дата 3.3.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Могу предложить такой вариант (безусловное редактирование по двойному клику на поле). Опции EditOnClick и EditOnDblClick роли не играют.
Предполагаем, что vt находится на форме или фрейме. Стандартно объявляем событие OnDblClick, кроме того:

В объявлении формы (фрейма):
Код

TForm1=class(TForm)
............
private
  procedure DelayedEditOnDblClick(var Message: TMessage); message WM_USER + 2;
............
end;


в реализации пишем:

Код

procedure TForm1.vtDblClick(Sender: TObject);
begin
  if vt.GetFirstSelected <> nil then
    if not vt.IsEditing then
      PostMessage(Handle, WM_USER+2, Integer(vt.GetFirstSelected), vt.FocusedColumn);
end;
.............
procedure TForm1.DelayedEditOnDblClick(var Message: TMessage);
begin
  if not vt.IsEditing then
      vt.EditNode(PVirtualNode(Message.WParam), Message.LParam);
end;


Вариант, конечно, кривоватый, но рабочий. Если есть что-нибудь посимпатичнее - буду рад узнать.
PM MAIL WWW   Вверх
Чoо
Дата 3.3.2010, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



kami, экспериментировал smile.. Твоя реализация нормально работает, не сказал бы что криво. Темболее когда даблклик в VT больше ни где мне не нужен. > Upd: попробуй SimpleDrawSelection поставить в False, пробовал, не помогало.
Цитата(Caduser @  2.3.2010,  23:21 Найти цитируемый пост)
 Пользователей очень раздражает невнятный переход в режим редактирования по "медленному" клику мыши в VirtualTree.

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

Всем спасибо за помощь, вопрос решен smile 


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Dom
Дата 3.3.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Я видимо так и не понял в чем собственно проблема. smile
Вот как у меня вызывается редактор в OnClick.

Код

procedure TTreeOptionsForm.VSTClick(Sender: TObject);
var
  Node: PVirtualNode;
  P: TPoint;
  Column: Integer;
begin
  P := VST.ScreenToClient(Mouse.CursorPos);
  Node := VST.GetNodeAt(p.X, p.Y);
  if Assigned(Node) then
  begin
    Column := VST.Header.Columns.ColumnFromPosition(P);
    if Column >= 0 then
      VST.EditNode(Node, Column);
  end;
end;

PM MAIL   Вверх
Чoо
Дата 3.3.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Dom, тоже норм вариант smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1361 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.