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

Вниз

Дабл Клик в Memo   Найти похожие ветки 

 
Vdovin-AV@yandex.ru   (2002-09-20 13:51) [0]

Народ как прогдамно в Memo симетировать "Дабл Клик" мышки,
т.е. надо установить курсор на слово сдедать "Дабл Клик"
и чтобы слово выделилось, только все это надо сделать при
помощи кода...


 
Alx2 ©   (2002-09-20 13:58) [1]

>Vdovin-AV@yandex.ru (20.09.02 13:51)

Надо выделить, или именно сымитировать выделение мышкой?

Если просто выделить, то может, лучше использовать
Memo.SelStart и Memo.SelLength для выделения текста?



 
Vdovin-AV@yandex.ru   (2002-09-20 14:12) [2]

Надо именно выделить.
При помощи Memo.SelStart и Memo.SelLength я это
уже сделал и вроде работает, но мне ненравится этот
корявый подход... Хотелось бы узнать как это реализованно
в Memo.
Задача вообщем состоит в том, члобы по горячей клавише
выделялось слово в Memo на котором находится курсор...


 
Separator ©   (2002-09-20 14:13) [3]

В мемо так и сделано.

Програмно вызвать DblClick очень просто. Сначало сделай обрабочик этого события:

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
//Что-то делать
end;

а потом:

procedure TForm1.Button1Click(Sender: TObject(;
begin
Memo1DblClick(Memo1)
end


 
Separator ©   (2002-09-20 14:17) [4]

Еще в TMemo усть такое свойство:
property CaretPos: TPoint read GetCaretPos write SetCaretPos;


 
qube ©   (2002-09-20 14:24) [5]

Ну ничего себе корявый подход! Выделить с пом. SelStart -- это коряво, а вот сымитировать double click -- другое дело :). Ну, тогда предлагаю вариант:

SendMessage(Memo1.Handle,WM_MBUTTONDBLCLK,MK_LBUTTON, Y shl 16 or X);


 
Рыжик ©   (2002-09-20 14:34) [6]

TMemo по DoubleClick-у делает Select, а не по Select-у генерирует DoubleClick. Вызывать DoubleClick только для того, чтобы сделать Select - гораздо более коряво, чем использовать SelStart & SelLength.


> Separator © (20.09.02 14:13)

Это не есть иммитация DoubleClick-а. Это вызов обработчика этого события. Selection при этом не изменится.


 
Vdovin-AV@yandex.ru   (2002-09-20 14:37) [7]

to qube:
пробовал
SendMessage(Memo1.Handle,WM_MBUTTONDBLCLK,MK_LBUTTON, Y shl 16 or X);
чего-то не выделяется...
--------------------------------------------------------------------------------


 
qube ©   (2002-09-20 14:40) [8]

да это шутка была, хотя должно работать...
а вместо Y и Х у тебя что?


 
Separator ©   (2002-09-20 14:40) [9]

> Рыжик
А я и не писал при имитацию дблклика, я писал как вызвать его обработчик
>Vdovin-AV@yandex.ru
а зачем тебе выделять именно DblClick?


 
Vdovin-AV@yandex.ru   (2002-09-20 14:47) [10]

Для Рыжика:
Корявость не в использовании SelStart и SelEnd и т.п.,
а в определении начала и конца слова в текущей позиции текста.
А по DoubleClick Memo это делает самостоятельно.
Так зачем изобретать велосипед ?


 
Separator ©   (2002-09-20 14:50) [11]

Один совет:
Нажми Ctrl+TMemo.SelStart и Ctrl+TMemo.SelLength


 
Vdovin-AV@yandex.ru   (2002-09-20 14:51) [12]

to qube:
X, Y это координаты курсора в Memo.


 
qube ©   (2002-09-20 14:57) [13]

Шутка вышла неудачная. У меня тоже не работает :(. Думаю..


 
Alx2 ©   (2002-09-20 15:35) [14]

На клавишу F2 выделяется слово на котором стоит курсор в Memo3
Предупреждаю: в коде много мусора :) Писал урывками :)

procedure TForm1.Memo3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
CharSet = ["a".."z", "A".."Z", "А".."Я", "а".."я","0".."9"];
var Start, LineNum, Cols, Count: Integer;
S: string;
begin
if key = vk_f2 then
begin
Start := -1;
Memo3.Perform(EM_GETSEL, integer(@Start), 0);
if Start > -1 then
begin
LineNum := memo3.Perform(EM_LINEFROMCHAR, Start, 0);
if (LineNum >= 0) and (LineNum < Memo3.Lines.Count) then
begin
Cols := Start - memo3.Perform(EM_LINEINDEX, LineNum, 0);
if Cols > 0 then
begin
S := Memo3.Lines[LineNum];
if Cols > Length(S) then Cols := Length(S);
while (Cols > 0) and (S[Cols] in CharSet) do begin dec(Cols); dec(Start); end;
Memo3.selstart := Start;
Count := 0;
inc(Cols);
while (Cols <= length(S)) and (S[Cols] in CharSet) do
begin
inc(Cols);
inc(Count);
end;
Memo3.SelLength := Count;
end;
end;
end;
end;
end;




 
Alx2 ©   (2002-09-20 16:00) [15]

>Vdovin-AV@yandex.ru (20.09.02 14:12)
Исправил парочку глюков. Теперь вроде-бы все политкорректно :)

procedure TForm1.Memo3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
CharSet = ["a".."z", "A".."Z", "А".."Я", "а".."я","0".."9"];
var Start, LineNum, Cols, Count: Integer;
S: string;
begin
if key = vk_f2 then
begin
Start := -1;
Memo3.Perform(EM_GETSEL, integer(@Start), 0);
if Start > -1 then
begin
LineNum := memo3.Perform(EM_LINEFROMCHAR, Start, 0);
if (LineNum >= 0) and (LineNum < Memo3.Lines.Count) then
begin
Cols := Start - memo3.Perform(EM_LINEINDEX, LineNum, 0);
if Cols >= 0 then
begin
S := Memo3.Lines[LineNum];
if Cols > Length(S) then Cols := Length(S);
while (Cols > 0) and (S[Cols] in CharSet) do begin dec(Cols); dec(Start); end;
Memo3.selstart := Start;
Count := 0;
inc(Cols);
while (Cols <= length(S)) and (S[Cols] in CharSet) do
begin
inc(Cols);
inc(Count);
end;
Memo3.SelLength := Count;
end;
end;
end;
end;
end;



 
Kibitzer   (2002-09-20 17:09) [16]


> Alx2 © (20.09.02 16:00)
> Исправил парочку глюков. Теперь вроде-бы все политкорректно :)

Действительно работает. Даже лучше чем DblClick у TMemo - меня всегда раздражало что TMemo выделяет кроме слова и пробелы после него :(
Этот кусок кода я себе сохраню :)))



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
6-8095
BaNNeR
2002-08-03 11:25
2002.10.03
DELPHI irc-сервер и irc-клиент


3-7850
KIR
2002-09-13 00:23
2002.10.03
Снова о переносе БД с Paradox a


3-7825
BlackTiger
2002-09-12 12:30
2002.10.03
Где взять полный EhLib или хотя бы только DBGrid из него за так?


3-7864
Vladimir*
2002-09-13 10:31
2002.10.03
Query глючит?


6-8099
Podlec
2002-08-03 23:48
2002.10.03
SMS