![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как подавить реакцию TTreeView на двойной клик? [D7, WinXP]
АлександрМ © (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.