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

Вниз

Как правильно делать свой Edit?   Найти похожие ветки 

 
vidiv ©   (2006-09-22 22:23) [0]

Пишу свой Edit (стараюсь повторить стандартный + потом расширить под свою программу).

Пишу как потомок класса TWinControl.

Подскажите пожалуйста, как правильно получать события от мыши (для активации и выделения), клавиатуры (клавиши ;eft right home end, символы). как правильно его отрисовывать.

пока я получил событие от мыши так:
procedure WMMouseDown(var Message: TWMKeyDown); message WM_LBUTTONDOWN;

от клавиатуры:
   procedure WMKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
   procedure CNChar(var Message: TWMChar); message CN_CHAR;

(не обращайте внимание на название процедуры WMKeyDown)

для отрисовывания перекрыл:
procedure PaintWindow(DC: HDC); override;

Я на правильном пути? Где можно быстро и понятно почтитать про сабж.

Пока столкнулся с проблемой: почемуто при нажатии клавиш Ctrl+C (которые я перехватываю в WMKeyDown) IDE делфи останавливает выполнение программы и показывает окно CPU. причем на обычном едите такого не происходит. в чем может быть причина?


 
Marser ©   (2006-09-22 22:26) [1]

А от чего ты наследуешься?


 
Furyz ©   (2006-09-22 22:28) [2]

> Пишу свой Edit (стараюсь повторить стандартный + потом расширить
> под свою программу).

может стоит поискать готовый???


 
Kolan ©   (2006-09-22 22:30) [3]


> стараюсь повторить стандартный

Туда и подсматривай


 
vidiv ©   (2006-09-22 22:33) [4]


> А от чего ты наследуешься?

от TWinControl


> Furyz ©   (22.09.06 22:28) [2]
> может стоит поискать готовый???

Для моей задачи не существует. + Мне самому хочется разобраться что к чему.


> Kolan ©   (22.09.06 22:30) [3]
> Туда и подсматривай

Стандартный полностью винда обслуживает, ничего не посмотришь!


 
vidiv ©   (2006-09-22 22:51) [5]

Причем, я заметил, окошко CPU выскакивает при выполнении следующей строки:

procedure TMyEdit.WMCopy(var Message: TWMCopy);
var Data:HGLOBAL;
   CX, DX:Integer;
begin
   if FSelLength <> 0 then begin
       CX := FSelStart;
       if FSelLength < 0 then inc(CX, FSelLength);
       DX := Abs(FSelLength);

       Data := GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, DX+1);
       StrPCopy(GlobalLock(Data), Copy(Text, CX+1, DX));
       GlobalUnlock(Data);

       OpenClipboard(0);
       SetClipboardData(CF_TEXT, Data);
       CloseClipboard;

       GlobalFree(Data);
   end;
   Message.Result := 0;
end;


странно все это, похоже на то, что я параметры гдето неправильно передал :(


 
Marser ©   (2006-09-22 22:59) [6]

А TCustomEdit что мешает юзать?


 
Kerk ©   (2006-09-22 23:00) [7]

> [6] Marser ©   (22.09.06 22:59)

Его винда обслуживает! Читай ветку!:)


 
Percent   (2006-09-23 00:32) [8]

пока я получил событие от мыши так:
procedure WMMouseDown(var Message: TWMKeyDown); message WM_LBUTTONDOWN;

от клавиатуры:
  procedure WMKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
  procedure CNChar(var Message: TWMChar); message CN_CHAR;
(не обращайте внимание на название процедуры WMKeyDown)

для отрисовывания перекрыл:
procedure PaintWindow(DC: HDC); override;

Я на правильном пути? Где можно быстро и понятно почтитать про сабж.


Я бы поступил так:

- Унаследовать от TCustomControl

- События мыши:
procedure MouseDown(); override;
procedure MouseMove(); override;
procedure MouseUp();override;

- События клавиатуры:
procedure KeyDown(); override;
procedure KeyUp(); override;
procedure KeyPressed(); override;

- Отрисовка:
procedure Paint; override;

Kerk ©   (22.09.06 23:00) [7]
> [6] Marser ©   (22.09.06 22:59)

Его винда обслуживает! Читай ветку!:)


Чтобы "не винда" обслуживала, надо от TGraphicControl наследовать. А лучше - из своего загрузчика... :-)


 
Kerk ©   (2006-09-23 00:35) [9]

> [8] Percent   (23.09.06 00:32)

Имел ввиду, что TCustomEdit инкапсулирует стандартный виндовый контрол


 
vidiv ©   (2006-09-23 07:10) [10]

а в чем отличие от
TGraphicControl от TCustomEdit ?


> - События мыши:
> procedure MouseDown(); override;
> procedure MouseMove(); override;
> procedure MouseUp();override;
>
> - События клавиатуры:
> procedure KeyDown(); override;
> procedure KeyUp(); override;
> procedure KeyPressed(); override;
>
> - Отрисовка:
> procedure Paint; override;

Огромной вам, респект и мое уважение!!!!!  Если честно я не очень расчитывал на подходящий ответ


 
Ketmar ©   (2006-09-23 08:10) [11]

>[5] vidiv(c) 22-Sep-2006, 22:51
бр-р-р. это не код, это жуть. проверять на потенциальные ошибки всё-же надо бы...


 
Percent   (2006-09-23 11:13) [12]

а в чем отличие от
TGraphicControl от TCustomEdit ?


Основное отличие TGraphicControl от TWinControl в том, что TGraphicControl не имеет Handle"а, а TWinControl - имеет. Таким образом, TGraphicControl, с одной стороны, не "потребляет" ресурсы Windows, а с другой стороны, не в состоянии самостоятельно (напрямую) обрабатывать сообщения от Windows, так как у него нет очереди сообщений, так как (посмотрев на Handle с другой стороны) этот контрол не имеет "окна" в понятии Windows. И поэтому всю работу в данном контексте за него выполняет его Parent (уж он-то имеет Handle, так как унаследован от TWinControl), отвечая за его (TGraphicControl) прорисовку, события мыши и пр.
Работая с наследниками от TGraphicControl, следует помнить, что они не могут быть сфокусированы, и, как следствие, на них нельзя попасть при помощи [Tab], то есть и события клавиатуры они обрабатывать не могут.
Хотя, если постараться, можно написать свою иерархию контролов,унаследованных как от TWinControl (общий Parent), так и от TGraphicControl (поля ввода, кнопки и пр.), реализующую свой собственный механизм ввода с клавиатуры, обработки прочих сообщений.
Если мне не изменяет память, таким образом реализованы поля ввода в некоторых Web browser"ах.

TCustomEdit - это VCL обертка уже не над "просто" окном, а окном специального контрола Windows - EDIT. Тут уже многие действия и свойства реализованы на уровне Windows, и поэтому управление этим контролом - специфическое.

P.S. То есть, можно много написать на эту тему, но лучше, все же, литературу почитать соответствующую; ее много в интернете.


 
vidiv ©   (2006-09-23 14:29) [13]


> Percent   (23.09.06 11:13) [12]

я конечно, чуть чуть ошибся, я хотел сравнить с TCustomControl, но ваш ответ исчерпывающий. благодарю вас!
Буду дальше разбираться! :)


 
Percent   (2006-09-23 15:38) [14]

TCustomControl

TCustomControl - напрямую унаследован от TWinControl, и единственое, чем от него отличается - обработкой события отрисовки "в стиле Delphi". То есть, в этом классе реализована Canvas и метод Paint. Поэтому, можно не перекрывать PaintWindow(DC: HDC);

Резюмируя, TCustomControl - это класс, дающий все возможности работы с окнами Windows (в том числе, в отличие от TGraphicControl - получение фокуса ввода и событий от клавиатуры), но не реализующий никакого визуального поведения. Образно говоря, "все может, но ничего пока еще не умеет".


 
Юрий Зотов ©   (2006-09-23 16:08) [15]

> Как правильно делать свой Edit?

Наследоваться от TCustomEdit и добавить/убрать/изменить все, что нужно.


 
Furyz ©   (2006-09-23 16:13) [16]

> обработкой события отрисовки "в стиле Delphi".

а что это за стиль такой?
Вы имеете ввиду отсутствие XPшности?


 
vidiv ©   (2006-09-23 17:00) [17]


> а что это за стиль такой?
> Вы имеете ввиду отсутствие XPшности?

нет, он имеет ввиду использование Canvas. IMHO.


> Юрий Зотов ©   (23.09.06 16:08) [15]

Мне надо вставлять в текст картинки, а именно формулы... тянуть и удавливать для этого RichEdit я не хочу. И насколько я знаю виндовый EDIT (который и используется как раз в TCustomEdit) этого не поддерживает в принципе. с OLE я разберусь, там же какие никакие знания есть, а вот по части виндовых окон плаваю пока.


 
Юрий Зотов ©   (2006-09-23 17:24) [18]

> vidiv ©   (23.09.06 17:00) [17]

> надо вставлять в текст картинки, а именно формулы
> И насколько я знаю виндовый EDIT (который и используется как раз в
> TCustomEdit) этого не поддерживает в принципе

Виндовый Edit получает сообщения. Этого достаточно, чтобы сделать с ним что угодно. Например, обрабатывая сообщения отрисовки, можно нарисовать хоть формулы, хоть слона, а обрабатывая сообщения буфера обмена, можно реализовать работу и с ним тоже. И т.д.


 
vidiv ©   (2006-09-23 18:30) [19]


> Виндовый Edit получает сообщения. Этого достаточно, чтобы
> сделать с ним что угодно. Например, обрабатывая сообщения
> отрисовки, можно нарисовать хоть формулы, хоть слона, а
> обрабатывая сообщения буфера обмена, можно реализовать работу
> и с ним тоже. И т.д.

таким образом ничего от стандартного едита и не отстанется вовсе


 
Юрий Зотов ©   (2006-09-23 20:24) [20]

> vidiv ©   (23.09.06 18:30) [19]

> таким образом ничего от стандартного едита и не отстанется вовсе

Предлагаю  вспомнить эти слова после того, как Вы напишете Ваш Edit (если, конечно, он вообще будет написан) и поймете, что 80% Вашей работы было дублированием работы Windows.


 
vidiv ©   (2006-09-23 20:57) [21]


> Юрий Зотов ©   (23.09.06 20:24) [20]

Я это понимаю! В Windows уже реализованно гоораздо больше, но, тем не менее, хоть чуть-чуть изменить поведение стандартного Edit-а уже не представляется возможным


 
Юрий Зотов ©   (2006-09-23 21:11) [22]

> vidiv ©   (23.09.06 20:57) [21]

> хоть чуть-чуть изменить поведение стандартного Edit-а уже не
> представляется возможным

IMHO, здесь Вы довольно сильно ошибаетесь. См. [18].

Фраза "сделать с ним что угодно" был сказана просто так?


 
vidiv ©   (2006-09-25 18:22) [23]

Хвастаюсь:
Осталось:
1) Подключить буфер обмена (как это делать я умею)
2) Привязать редактор формул от MS (тоже не архисложно)
3) Привести в порядок компонент (мелочи)

Не думал, что так просто сделать компонент :)


 
Gero ©   (2006-09-26 16:34) [24]

> [23] vidiv ©   (25.09.06 18:22)


> Не думал, что так просто сделать компонент

Сделать какой-нибудь компонент, действительно просто. Сделать хороший компонент куда сложнее.


 
Игорь Шевченко ©   (2006-09-26 16:42) [25]

Юрий Зотов ©   (23.09.06 17:24) [18]


>  Например, обрабатывая сообщения отрисовки, можно нарисовать
> хоть формулы, хоть слона


Можно. Но займет много времени.



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

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

Наверх




Память: 0.54 MB
Время: 0.066 c
4-1149009608
Варяг
2006-05-30 21:20
2006.10.15
Загрузка и отображение картинки


1-1157473378
flaxe
2006-09-05 20:22
2006.10.15
Передать String другому приложению


6-1147845759
BanderLog
2006-05-17 10:02
2006.10.15
Использование TIdSync в Indy10


2-1159379107
dreamse
2006-09-27 21:45
2006.10.15
Как вытащить имя файла из пусти без расширения ?


6-1148051262
kernel
2006-05-19 19:07
2006.10.15
Противная ошибка