Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Вниз

Как подавить реакцию 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.039 c
15-1193364872
Slider007
2007-10-26 06:14
2007.12.02
С днем рождения ! 26 октября 2007 пятница


1-1189590777
em240
2007-09-12 13:52
2007.12.02
Завершение потока


4-1179507014
Bacardi
2007-05-18 20:50
2007.12.02
Очередь печати


2-1194433943
LexXL
2007-11-07 14:12
2007.12.02
вписать картинку в квадрат


15-1193827892
Ega23
2007-10-31 13:51
2007.12.02
Народ, а никто случайно не знает, какой сейчас официальный





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский