Текущий архив: 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.52 MB
Время: 0.045 c