Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как подавить реакцию TTreeView на двойной клик? [D7, WinXP]


Страницы:   1 2 3 4 5

АлександрМ ©   (2007-07-05 01:42:00) 

TTreeView при двойном клике сворачивает или разворачивает ту ветку на которой был выполнен этот двойной клик. На событие OnDblClick сделан свой обработчик. И не нужно, чтобы ветка при этом закрывалась или открывалась (пусть пользователь сворачивает или разворачивает её только с помощью кнопок - и +). Подскажите, пожалуйста, как это сделать.


Инс   (2007-07-05 15:29:00) [81]

Эстетические аспекты меня мало волнуют, ибо я сам понимаю все недостатки данного подхода. Мне интересны технические недостатки, которые перекроют технические достоинства.


Ega23   (2007-07-05 15:23:00) [82]


> Как раз таки наоборот, палитра остается нетронутой. Писать
> наследника с регистрацией в палитре - замусоривать последнюю,
>  не регистрировать а создавать в рантайм - неудобно + замусоривание
> кода. А так - все чисто.


Ничего не чисто. У тебя семантика остаётся неизменной при явной подмене сущностей.


Инс   (2007-07-05 15:19:00) [83]


> А вот так над палитрой компонентов насильничать...


Как раз таки наоборот, палитра остается нетронутой. Писать наследника с регистрацией в палитре - замусоривать последнюю, не регистрировать а создавать в рантайм - неудобно + замусоривание кода. А так - все чисто.


> Тогда чё уж там, давай сразу в VCL править.


Существенная разница ;) Править VCL - это значит полная несовместимость с Delphi, установленными на других машинах.


Ega23   (2007-07-05 15:15:00) [84]


> Данный трюк не намного хуже, чем то же объявление пустого
> класса наследника и приведение к нему для доступа к protected-
> свойствам и методам. Подобными "трюками" иногда даже грешила
> Borland, а значит - индульгенция получена.


Существенная разница. Создать класс-однодневку и создавать его в ран-тайме - это вполне допустимый вариант.
А вот так над палитрой компонентов насильничать... Тогда чё уж там, давай сразу в VCL править.


Инс   (2007-07-05 14:55:00) [85]

И в дополнение... Я прекрасно понимаю, что программировать можно двумя способами:
1. Что б работало
2. Правильно
Но всякое случается, инагда - сроки поджимают, иногда просто не хочется замосоривать палитру "одноразовым" компонентом. А выход есть. Кстати, чтобы не гадить в модуле с формой, можно данный код вынести в другой юнит, и в списке uses объявить последним, либо хотя бы после юнита, где содержиться класс-предок.

Данный трюк не намного хуже, чем то же объявление пустого класса наследника и приведение к нему для доступа к protected-свойствам и методам. Подобными "трюками" иногда даже грешила Borland, а значит - индульгенция получена.


Инс   (2007-07-05 14:48:00) [86]


> TTreeView - это TTreeView и никак иначе. Со всеми хелпами
> и правилами работы. Надо что-то своё - наследуйся от TCustomTreeView
> наздоровье.


Уважаемый, Ваше мнение по этому вопросу вполне понятно. Свое я никому не навязываю, считаю, что мой подход также имеет право на существование, так как (аргументы привел выше). Так что не будем спорить, бесполезно, каждый останется при своем. К тому же, этот трюк уже миллион раз обсуждался и ничего нового в данном топике не прозвучало.


Ega23   (2007-07-05 14:36:00) [87]


> А здря. Иногда, если нужно лишь слегка изменить функциональность
> компонента, нет смысла регистрировать его в палитре (у меня
> практически в каждом проекте такое требуется) - иначе палитра
> превратиться в свалку компонентов, которые нужны только
> в одном проекте. Создавать в рантайм - неудобно. А такой
> "обман среды" - ИМХО изящен и безопасен, впрочем, каждый
> сам решает для себя.
>


TTreeView - это TTreeView и никак иначе. Со всеми хелпами и правилами работы. Надо что-то своё - наследуйся от TCustomTreeView наздоровье.


Инс   (2007-07-05 14:18:00) [88]

А здря. Иногда, если нужно лишь слегка изменить функциональность компонента, нет смысла регистрировать его в палитре (у меня практически в каждом проекте такое требуется) - иначе палитра превратиться в свалку компонентов, которые нужны только в одном проекте. Создавать в рантайм - неудобно. А такой "обман среды" - ИМХО изящен и безопасен, впрочем, каждый сам решает для себя.


Ega23   (2007-07-05 13:56:00) [89]


> TTreeView = class(ComCtrls.TTreeView)


Я бы своего подчинённого убил за такое.


Инс   (2007-07-05 13:29:00) [90]

Можно так - ДО объявления формы пишем

TTreeView = class(ComCtrls.TTreeView)
 private
   procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
 end;


а вот реализация метода WMLButtonDblClk

procedure TTreeView.WMLButtonDblClk(var Message: TWMLButtonDblClk);
var
 Rect: TRect;
begin
 if Assigned(Selected) then begin
   Rect:=Selected.DisplayRect(true);
   Rect.Left:=Rect.Left - Indent;
   if PtInRect(Rect,Point(Message.XPos,Message.YPos)) then
     if Assigned(OnDblClick) then OnDblClick(Self);
 end;
end;


АлександрМ   (2007-07-05 12:34:00) [91]

Ага, спасибо.


ЮЮ   (2007-07-05 04:18:00) [92]

Например так: (работают кнопки '*', '-'  и  '+' с NumPad)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls;

type
 TForm1 = class(TForm)
   TreeView1: TTreeView;
   procedure TreeView1Collapsing(Sender: TObject; Node: TTreeNode;
     var AllowCollapse: Boolean);
   procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
     var AllowExpansion: Boolean);
   procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
   FLegalWay: boolean;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TreeView1Collapsing(Sender: TObject; Node: TTreeNode;
 var AllowCollapse: Boolean);
begin
 AllowCollapse := FLegalWay;
end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
 var AllowExpansion: Boolean);
begin
 AllowExpansion := FLegalWay;
end;

procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 FLegalWay :=
   (Key = VK_ADD) or
   (Key = VK_SUBTRACT) or
   (Key = VK_MULTIPLY);
end;

end.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо