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

Вниз

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

Наверх





Память: 0.53 MB
Время: 0.037 c
2-1159637739
ProgRAMmer Dimonych
2006-09-30 21:35
2006.10.15
Проблема с ListBox ом


15-1158920960
Сергей М.
2006-09-22 14:29
2006.10.15
Проблема с загрузкой ресурса в "мобилу" c использованием WAP


11-1135271830
Boguslaw
2005-12-22 20:17
2006.10.15
autofree form ?


2-1159163382
Mamed_1971
2006-09-25 09:49
2006.10.15
Date and time


4-1148854024
Nickie
2006-05-29 02:07
2006.10.15
Работа с файлами в асинхронном режиме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский