Главная страница
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
3-7855
B-Ars
2002-09-11 12:17
2002.10.03
Проблемы с добавлением поля синхронного просмотра в Run-Time


1-7904
AL2002
2002-09-23 14:57
2002.10.03
Кнопочка


7-8190
Uridian
2002-07-26 14:30
2002.10.03
Слежение за процессом печати


1-7907
pvasya
2002-09-23 13:37
2002.10.03
waveOutGetVolume


4-8226
Bond
2002-08-16 13:04
2002.10.03
Изменить реестр Windows, используя WinAPI