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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание редактора для VirtualTreeView, TVirtualStringTree 
V
    Опции темы
aktuba
  Дата 27.12.2006, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Люди, возникла проблема при создании своего редактора для VT.
Вот что есть:
Код

type
  PHKNode = ^THKNode;
  THKNode = record
    Caption: string;
    Key: TShortCut;
    Modify: Boolean;
  end;

  TVTCustomEditor = class(TInterfacedObject, IVTEditLink)
  private
    FEdit: TEdit;
    FTree: TVirtualStringTree;
    FNode: PVirtualNode;
    FColumn: Integer;
  protected
    procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  public
    destructor Destroy; override;

    function BeginEdit: Boolean; stdcall;
    function CancelEdit: Boolean; stdcall;
    function EndEdit: Boolean; stdcall;
    function GetBounds: TRect; stdcall;
    function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex): Boolean; stdcall;
    procedure ProcessMessage(var Message: TMessage); stdcall;
    procedure SetBounds(R: TRect); stdcall;
  end;

function TVTCustomEditor.BeginEdit: Boolean;
begin
    Result := True;
  with FEdit do
    begin
      Show;
      SetFocus;
    end;
end;

function TVTCustomEditor.CancelEdit: Boolean;
begin
    Result := True;
  FEdit.Hide;
  FTree.SetFocus;
end;

destructor TVTCustomEditor.Destroy;
begin
    FreeAndNil(FEdit);
  inherited;
end;

procedure TVTCustomEditor.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const
    keys: set of Byte = [8, 9, 13, 32];
var
    str: string;
begin
    str := '';
  if Key = VK_ESCAPE then
    begin
      FTree.CancelEditNode;
     Key := 0;
      Exit;
    end;
  if ssCtrl in Shift then str := str + 'Ctrl+';
  if ssAlt in Shift then str := str + 'Alt+';
  if ssShift in Shift then str := str + 'Shift+';
  if Key in keys then
    begin
      case Key of
       VK_RETURN: str := str + 'Enter';
        VK_TAB: str := str + 'TAB';
        VK_BACK: str := str + 'Backspace';
        VK_SPACE: str := str + 'Space';
      end;
    end;
  if Key > 32 then str := str + Chr(Key);
  FEdit.Text := str;
  if (Key >= 32) or (Key in keys) then EndEdit;//FTree.EndEditNode;
end;

procedure TVTCustomEditor.EditKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    Key := 0;
    EditKeyDown(Sender, Key, Shift);
end;

function TVTCustomEditor.EndEdit: Boolean;
var
    lData: PHKNode;
begin
    Result := False;
  lData := FTree.GetNodeData(FNode);
  if not Assigned(lData) then Exit;
  lData^.Key := TextToShortCut(FEdit.Text);
  lData^.Modify := True;
  FEdit.Hide;
  FTree.SetFocus;
  Result := True;
end;

function TVTCustomEditor.GetBounds: TRect;
begin
    Result := FEdit.BoundsRect;
end;

function TVTCustomEditor.PrepareEdit(Tree: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex): Boolean;
var
  VTEditNode: PHKNode;
begin
  Result := True;
  FTree := Tree as TVirtualStringTree;
  FNode := Node;
  FColumn := Column;
  FreeAndNil(FEdit);
  VTEditNode := FTree.GetNodeData(Node);
  FEdit := TEdit.Create(FTree);
  with FEdit as TEdit do
    begin
      AutoSize := False;
      Visible := False;
      Parent := Tree;
      Text := ShortCutToText(VTEditNode^.Key);
      OnKeyDown := EditKeyDown;
      OnKeyUp := EditKeyUp;
    end;
end;

procedure TVTCustomEditor.ProcessMessage(var Message: TMessage);
begin
    FEdit.WindowProc(Message);
end;

procedure TVTCustomEditor.SetBounds(R: TRect);
var
  Dummy: Integer;
begin
  FTree.Header.Columns.GetColumnBounds(FColumn, Dummy, R.Right);
  FEdit.BoundsRect := Rect(0, R.Top, R.Right, R.Bottom);
end;


Так все работает, но после окончания работы с редактором не происходит перерисовка (Repaint). 
А если в функции EditKeyDown заменить строку
Код

if (Key >= 32) or (Key in keys) then EndEdit;

на строку
Код

if (Key >= 32) or (Key in keys) then FTree.EndEditNode;

то получаю AV. Помогите разобраться plz... smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Bose
Дата 27.12.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



в PrepareEdit НЕ присваивай обработчик для OnKeyDown. Обрабатывай всё это в OnKeyUp! smile

Добавлено @ 18:55 
изменённая PrepareEdit будeт выглядеть так:

Код

function TVTCustomEditor.PrepareEdit(Tree: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex): Boolean;
var
  VTEditNode: PHKNode;
begin
  Result := True;
  FTree := Tree as TVirtualStringTree;
  FNode := Node;
  FColumn := Column;
  FreeAndNil(FEdit);
  VTEditNode := FTree.GetNodeData(Node);
  FEdit := TEdit.Create(FTree);
  with FEdit as TEdit do
    begin
      AutoSize := False;
      Visible := False;
      Parent := Tree;
      Text := ShortCutToText(VTEditNode^.Key);
      OnKeyDown := nil;
      OnKeyUp := EditKeyDown;
    end;
end;

PM MAIL WWW Skype   Вверх
aktuba
Дата 31.12.2006, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Проблему решил иначе. Убрал 
Код

FEdit.Hide;
 в CancelEdit и в EndEdit.

Может кому пригодится...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Bose
Дата 2.1.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



aktuba, тебе мой совет не помог что ли? smile  smile  smile 
PM MAIL WWW Skype   Вверх
aktuba
Дата 2.1.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Bose - я не мог использовать твой совет, т.к. основной код у меня как-раз в OnKeyDown. Если нажата Shift или Ctrl или Alt и удерживается, то выводится название иначе не выводится... Поэтому пришлось искать обходные пути...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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