Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

Как подавить реакцию TTreeView на двойной клик?   Найти похожие ветки 

 
АлександрМ   (2007-07-05 01:42) [0]

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


 
ЮЮ ©   (2007-07-05 04:18) [1]

Например так: (работают кнопки "*", "-"  и  "+" с 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.


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

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


 
Инс ©   (2007-07-05 13:29) [3]

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

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;


 
Ega23 ©   (2007-07-05 13:56) [4]


> TTreeView = class(ComCtrls.TTreeView)


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


 
Инс ©   (2007-07-05 14:18) [5]

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


 
Ega23 ©   (2007-07-05 14:36) [6]


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


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


 
Инс ©   (2007-07-05 14:48) [7]


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


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


 
Инс ©   (2007-07-05 14:55) [8]

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

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


 
Ega23 ©   (2007-07-05 15:15) [9]


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


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


 
Инс ©   (2007-07-05 15:19) [10]


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


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


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


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


 
Ega23 ©   (2007-07-05 15:23) [11]


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


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


 
Инс ©   (2007-07-05 15:29) [12]

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


 
Ega23 ©   (2007-07-05 15:47) [13]


> Инс ©   (05.07.07 15:29) [12]
>
> Эстетические аспекты меня мало волнуют, ибо я сам понимаю
> все недостатки данного подхода. Мне интересны технические
> недостатки, которые перекроют технические достоинства.


Вам доводилось заниматься командной разработкой большого проекта? А поддерживать чужой код?
Всегда ли вы, видя объявление

var
bmp : TBitmap;

лезете посмотреть: а является ли TBitmap стандартным классоом TBitmap, или какой-нибудь Вася Пупкин, писавший этот код год назад, взял да и перекрыл его? Для решения своих маленьких нужд?
Не нравится TBitmap? Хорошо, пусть будет TADODataSet. Или TButton.


 
Инс ©   (2007-07-05 15:54) [14]


> Вам доводилось заниматься командной разработкой большого
> проекта? А поддерживать чужой код?


Именно так в данный момент и работаю. А именно - учавствую в командной разработке сам + курирую некоторых других разработчиков. Если мне предоставят код с данным трюком, я еще спасибо скажу за то, что мне не понадобится регистрировать ничего в палитре, чтобы проверить работоспособность. Еще раз повторю, что такой трюк при умелом использовании вполне безопасен (если конечно класс нужно подкорректировать чуть-чуть, а не капитально).


 
Инс ©   (2007-07-05 16:04) [15]

Специально для эстетов: если определенное поведение (как например, реакция TreeView на двойной клик) не устраивает в определенном контроле (а не во всех контролах данного типа) - можно просто в рантайм подменить WindowProc.


 
Ega23 ©   (2007-07-05 16:07) [16]


> Если мне предоставят код с данным трюком, я еще спасибо
> скажу за то, что мне не понадобится регистрировать ничего
> в палитре, чтобы проверить работоспособность.


А не надо регистрировать. Надо в ран-тайм создавать. А вот если такое создание сплошь и рядом идёт - то тогда сам Баал велел компонент ставить.


> Еще раз повторю, что такой трюк при умелом использовании
> вполне безопасен (если конечно класс нужно подкорректировать
> чуть-чуть, а не капитально).


Ещё раз повторяю, что такой трюк уместен на столько же, насколько уместен выход из рекурсивной процедуры через goto.


 
Инс ©   (2007-07-05 16:16) [17]


> Ещё раз повторяю, что такой трюк уместен на столько же,
> насколько уместен выход из рекурсивной процедуры через goto.


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


 
Инс ©   (2007-07-05 16:27) [18]

Ссылки на обсуждения данного приема, дабы нам не повторяться:
Первоисточник - http://ww.delphikingdom.com/asp/answer.asp?IDAnswer=35814
http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=1296
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=47497
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=49421


 
Ega23 ©   (2007-07-05 16:29) [19]


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


Да делайте что хотите, Вы в своём праве. Зачем только такие советы начинающим давать?

З.Ы. ВОГ-17 можно использовать как ручную гранату контактного действия. Надо всего лишь перед броском об что-нибудь твёрдое её ударить, чтобы на боевой взвод встала.
Прямых запретов нигде нет. Однако почему-то её таким образом крайне редко используют. Вот интересно, а почему?


 
Ega23 ©   (2007-07-05 16:54) [20]


> Ссылки на обсуждения данного приема, дабы нам не повторяться:
>
> Первоисточник - http://ww.delphikingdom.com/asp/answer.asp?IDAnswer=35814
> http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=1296
> http://www.delphikingdom.com/asp/answer.asp?IDAnswer=47497
> http://www.delphikingdom.com/asp/answer.asp?IDAnswer=49421


Прочитал.
Из сторонников увидел только Вас да восторги Geo, которому понравилось решение (решение красивое, спорить не буду. Но - только для личного пользования с полным пониманием того, что ты делаешь).
Из противников - Антоха Григорьев, что уже немало. Хотелось бы мнение АП, ИШ или ЮЗ на этот счёт услышать.


 
Инс ©   (2007-07-05 17:00) [21]

Из сторонников можно еще DRON-а назвать, что также немало ;)
ЮЗ в одной из ссылок предлагал решение с Hack-классом, что не сильно далеко уходит от данной темы, хотя, интересно узнать мнение именно по этому поводу.


 
Ega23 ©   (2007-07-05 17:01) [22]


> ЮЗ в одной из ссылок предлагал решение с Hack-классом, что
> не сильно далеко уходит от данной темы, хотя, интересно
> узнать мнение именно по этому поводу.


Hack-класс - нормальное решение. Но идентификатор данного класса создаётся с другим семантическим названием.
В отличие от.


 
Инс ©   (2007-07-05 17:04) [23]


> Hack-класс - нормальное решение. Но идентификатор данного
> класса создаётся с другим семантическим названием.
> В отличие от.


Ну, как сказать, нормальное. Там просто проблема в другом. Доступ к protected полям закрыт идеологией ООП. А там мы ее нарушаем. И здесь мы нарушаем некоторые каноны, так что, приемы близки, ИМХО.


 
{RASkov} ©   (2007-07-05 17:11) [24]

> Ega23

> Инс

Хватит спорить :) Присядте где нибудь вместе, и за кружечкой пива поговорите. :о)


 
Инс ©   (2007-07-05 17:17) [25]


> Хватит спорить :)


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


 
sdts   (2007-07-05 17:23) [26]

Для
> Ega23 ©   (05.07.07 17:01) [22]

а вы сами то [13] ?


 
Ega23 ©   (2007-07-05 17:52) [27]


> а вы сами то [13] ?


Знаешь, если я вижу переменную btn : TButton, то я буду УВЕРЕН, что это именно стандартный TButton. Со всеми его методами, свойствами и событиями.
Вот если я увижу TMyButton или THackButton - то тогда да, обязательно залезу и посмотрю, что это такое. Но не раньше.
Просто Инс © предлагает подменять существующие сущности своими. А я говорю, что их подменять - нельзя. Надо создать новую сущность. Пусть очень похожую. Но - новую.


 
Инс ©   (2007-07-05 17:56) [28]


> Ega23 ©   (05.07.07 17:52) [27]


Не умножать количество сущностей без надобности - Бритва Оккама. Известный принцип. Это я про другую сторону вашего утверждения про сущности...


 
b z   (2007-07-05 18:18) [29]


> Ega23 ©   (05.07.07 17:52) [27]

ведь не зря упямянул [13], т.к. когда начинть проект - это одно, а вот сапорт - другое ... ;)


 
Desdechado ©   (2007-07-05 18:50) [30]

Я против таких маневров с именами классов.
Есть подозрения, что проекты с пакетами работать будут некорректно.
А уж то, что DLL, в которой хранится свое описание класса, будет работать некорректно по отношению к EXE с таким модифицированным описанием - это 100%.


 
Инс ©   (2007-07-05 19:27) [31]


> [30] Desdechado ©   (05.07.07 18:50)


Вы не любите кошек? Вы просто не умеете их готовить! ;)


 
{RASkov} ©   (2007-07-05 20:01) [32]

А я ни с кем не работаю... пишу себе так.... для души и себя... и один.
И частенько использую метод "подмены" предложенный Инс. Если эта подмена происходит в другом модуле (См[8]) то комментирую эти веСЧи...:)
Ну в самом деле... в простеньких проектах это удобнее, чем создание их(контролов) в рантайм или еще хуже отдельным компонентом...
Спор бесполезен... так как оба правы и оба не правы в одно и тоже время :) Все зависит от конкретного проекта.
:о)

> [31] Инс ©   (05.07.07 19:27)
> Вы не любите кошек? Вы просто не умеете их готовить! ;)

Не отступай :)


 
b z   (2007-07-05 20:41) [33]


> так как оба правы и оба не правы в одно и тоже время :)


> Не отступай :)


 
Desdechado ©   (2007-07-05 21:33) [34]

> Инс ©   (05.07.07 19:27) [31]
Представь себе программу с плагинами. Плагины пишутся любым желающим. А ты у себя в программе попереопределял половину классов, а потом толкаешь их в эти плагины в качестве переметров. Что имеем? Правильно, неопознанные ошибки. Собственно, как и в случае компиляции плагинов в других версия дельфи.


 
Инс ©   (2007-07-05 22:05) [35]


> [34] Desdechado ©   (05.07.07 21:33)

А причем тут плагины? И как регистрация классов в палитре под другим именем или создание их в рантайм поможет твоей проблеме? Спор ведь именно об этом. И еще. Ткни меня пальцем в мой пост, где я предлагаю переопределять половину классов и пихать их повсюду куда ни попадя. Я утверждаю, что в рамках аккуратного обдуманного использования этот способ имеет право на существование. А про плагины и DLL ты первый заговорил, так как видимо соображалка за границы собственного проекта выходить категорически отказывается.


 
{RASkov} ©   (2007-07-05 22:14) [36]

> [35] Инс ©   (05.07.07 22:05)

От одного отбился... тут другой :))
>
Чесслова...> Как подавить реакцию TTreeView на двойной клик?
реакцию уже подавили давно :) Хватит спорить :)
Ветка, с этим бесконечным спором, уже смех вызывает. :)


 
Desdechado ©   (2007-07-05 22:25) [37]

Инс ©   (05.07.07 22:05) [35]
Плагины - пример неприменимости твоих подходов, да еще и пример возникновения скрытых ошибок.
О регистрации в палитре говорил только ты, это у тебя фантазии только на 2 вещи хватает, а моей аналитической соображалке вполне по силам гораздо более серьезные вещи.
А спор идет, если ты не понял, о противоестественном желании написать на своем изделии чужой товарный знак, обманивая всех и себя самого.


 
Инс ©   (2007-07-05 22:43) [38]


> О регистрации в палитре говорил только ты


Рекомендую перечитать ветку с самого начала. Данный метод был предложен именно как альтернатива регистрации классов в палитре при небольшой модификации базового. Именно об этом и шел спор с г-ном Ega23. А насчет плагинов - так компилятор и не пропустит, если функция требует в качестве параметра ComCtrls.TTreeView, а ты передаешь свой TreeView. Так как классы проверяются на совместимость не путем проверки имен, а путем проверки указателя на VMT. Или ты имеешь в виду что-то другое? Тогда поясняй подробнее.


 
Инс ©   (2007-07-05 22:46) [39]


> А насчет плагинов - так компилятор и не пропустит, если
> функция требует в качестве параметра ComCtrls.TTreeView,
> а ты передаешь свой TreeView.


Наоборот, разумеется...


 
Инс ©   (2007-07-05 23:04) [40]


> Плагины - пример неприменимости твоих подходов


Примеры неприменимости той или иной технологии есть всегда. Например, SendMessage неприменим, в случае посылки сообщения спящему потоку, ожидающему освобождения объекта твоим потоком. Критическая секция неприменима при синхронизации потоков различных процессов. Отвертка неприменима в случае, когда нужно забить гвоздь в стену. Но если есть хотя бы одна область, где тот или иной метод применим и обоснован - он имеет право на существование. Так что твою позицию считаю необоснованной.



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.039 c
15-1193911735
Alex.rus
2007-11-01 13:08
2007.12.02
Учебник по SQL Server 2000


15-1193834403
vamp_avp
2007-10-31 15:40
2007.12.02
Indy


2-1194429628
Lera
2007-11-07 13:00
2007.12.02
Наименование продукта


2-1192410570
Номер
2007-10-15 05:09
2007.12.02
Скажите, как загрузить курсор из потока?


15-1193855856
Silver...
2007-10-31 21:37
2007.12.02
Сканер Штрих кода