Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дабл Клик в Memo [D5, Win95/98]


Vdovin-AV@yandex.ru ©   (2002-09-20 13:51:00) 

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


Kibitzer   (2002-09-20 17:09:00) [1]


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

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


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

>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;


Alx2   (2002-09-20 15:35:00) [3]

На клавишу 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;



qube   (2002-09-20 14:57:00) [4]

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


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

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


Separator   (2002-09-20 14:50:00) [6]

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


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

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


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

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


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

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


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

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


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

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


> Separator © (20.09.02 14:13)

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


qube   (2002-09-20 14:24:00) [12]

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

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


Separator   (2002-09-20 14:17:00) [13]

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


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

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

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

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

а потом:

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


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

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


Alx2   (2002-09-20 13:58:00) [16]

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо