Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > DoubleClick в Edit


Автор: Keeper89 21.8.2009, 14:12
Доброго времени суток!

В стандартном Edit'е имеется событие двойного щелчка по умолчанию, при этом выделяется некоторый участок текста. 
Можно ли сделать так, чтобы текст не выделялся, каретка оставалась в той же позиции (не перескакивала для выделения текста), а событие отлавливалось? Пробовал сбрасывать SelStart и SelLength в теле процедуры - не помогло.

Спасибо.

Автор: Rrader 21.8.2009, 17:17
Отключить выделение:
Код

unit Unit1;

interface

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

type
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TEdit }

procedure TEdit.WndProc(var Msg: TMessage);
begin
  if Msg.Msg <> WM_LBUTTONDBLCLK then
    inherited
  else
    (Parent as TForm).Caption := IntToStr(GetTickCount);
end;

end.

Автор: Keeper89 21.8.2009, 18:39
Rrader, я тоже об этом подумывал smile, твой вариант переделал вот так (вроде бы эквивалентно):
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure WndProc(var Msg: TMessage); message WM_LBUTTONDBLCLK;
  end;
  TForm2 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TEdit }

procedure TEdit.WndProc(var Msg: TMessage);
begin
  //

end;

end.

Спасибо!

А можно ли таким же образом создать класс типа TEditX, который будет обладать этим свойством? Так например, часть компонентов можно будет оставить как стандартные TEdit, а часть как TEditX.

И второй вопрос, не буду создавать для этого отдельную тему: можно ли разделить события клика и двойного клика? (Для Эдита при двойном щелчке у меня сначала срабатывает событие для щелчка, а потом уже для двойного).

Автор: Rrader 21.8.2009, 19:54
Цитата(Keeper89 @  22.8.2009,  00:39 Найти цитируемый пост)
А можно ли таким же образом создать класс типа TEditX

Нельзя. В любом случае ломаешь один класс (TEdit), а в нем можешь фильтровать контролы по желаемому признаку (имя, координаты/размеры, размер шрифта и т.п.)

Цитата(Keeper89 @  22.8.2009,  00:39 Найти цитируемый пост)
И второй вопрос, не буду создавать для этого отдельную тему: можно ли разделить события клика и двойного клика? (Для Эдита при двойном щелчке у меня сначала срабатывает событие для щелчка, а потом уже для двойного).

В замешательстве. А как надо? Что должно сработать, а что нет? События логически связаны...

Автор: Keeper89 21.8.2009, 19:58
Цитата(Rrader @  21.8.2009,  20:54 Найти цитируемый пост)
В замешательстве. А как надо? Что должно сработать, а что нет? События логически связаны... 

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

Автор: Rrader 21.8.2009, 20:10
Двойной клик рождается из одинарного smile Что могу предложить - отказаться от этой идеи либо по одинарному щелчку давать время на отлов следующего (время двойного клика всегда можно узнать). Тогда ты получишь некоторую задержку при одинарном клике, сам понимаешь smile 

Автор: Keeper89 21.8.2009, 20:36
Ясно smile Отсюда вопрос - как лучше определять это время?

Автор: Keeper89 23.8.2009, 14:37
up

Автор: volvo877 23.8.2009, 15:13
Keeper89, тут был:
http://forum.vingrad.ru/index.php?showtopic=166081&view=findpost&p=1213939 ? (только не WM_NOREMOVE, а PM_NOREMOVE)

Автор: Keeper89 23.8.2009, 15:58
volvo877, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)