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

Вниз

Управление с клавиатуры &   Найти похожие ветки 

 
Johnnnnn   (2009-09-30 09:42) [0]

В общем, при добавлении к названию клавиши символа &, нажимая на букву которая стоит после символа & на клавиатуре, вызывается процедура привязанная к кнопке, как можно отключать и включать эту возможность, чтобы к примеру можно было в мемо что-то ввести? Первое что приходит на ум это убирать в цикле &, из названия кнопок, но как его потом расставлять обратно если он может быть в середине названия? Есть какое-то простое решение для этого?


 
DrPass ©   (2009-09-30 09:47) [1]


> В общем, при добавлении к названию клавиши символа &, нажимая
> на букву которая стоит после символа & на клавиатуре, вызывается
> процедура привязанная к кнопке

А что, разве это как-то мешает вводить в мемо? Или как обычно, пишем о проблеме в форум после того, как ее придумал, а не после того, как она возникла?


 
Johnnnnn   (2009-09-30 10:02) [2]

мешает, я незнаю почему но когда давно в универе учил делфи то там было про то что клавиши вызываются при нажатии ALT плюс символ после знака & у меня же почемуто оно срабатывает без ALT - пользуюсь Delphi 6


 
sniknik ©   (2009-09-30 10:23) [3]

> почемуто оно срабатывает без ALT
не надо есть варенье над клавиатурой, капнул и alt залип...


 
DrPass ©   (2009-09-30 10:44) [4]


> Johnnnnn   (30.09.09 10:02) [2]


> там было про то что клавиши вызываются при нажатии ALT плюс
> символ после знака & у меня же почемуто оно срабатывает
> без ALT - пользуюсь Delphi 6

Что, и когда текст в Memo вводишь, тоже срабатывают? Не ври


 
Юрий Зотов ©   (2009-09-30 11:04) [5]

> Johnnnnn   (30.09.09 10:02) [2]

Срабатывание кнопки без Alt происходит, когда фокус ввода стоит на этой кнопке. Если же фокус ввода стоит в Memo, то кнопка срабатывает именно с Alt, поэтому мешать вводу в Memo она не может.

А включать/отключать акселераторы можно так:

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormDblClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   FEnableAccelChars: boolean;
   procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
 end;

implementation

{$R *.dfm}

var
 i: integer = 0;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Inc(i);
 Caption := IntToStr(i)
end;

procedure TForm1.CMDialogChar(var Message: TCMDialogChar);
begin
 if FEnableAccelChars then
   inherited
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
 FEnableAccelChars := not FEnableAccelChars;
 Caption := BoolToStr(FEnableAccelChars, True)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FormDblClick(Sender)
end;


 
Johnnnnn   (2009-09-30 15:30) [6]


> А включать/отключать акселераторы можно так:


Спасибо вот как раз то что нужно. в мемо не мешает я не проверил у меня с webbrowserom неполучалось вводить я подумал что и с мемо такаяже ерунда. Спасибо еще раз.


 
Johnnnnn   (2009-09-30 16:30) [7]

Нда видно рано я спасибо сказал чтото я немогу в этом коде разобраться можно както попроще нажал на кнопку акселераторы вырубились нажал еще раз включились?


 
Johnnnnn   (2009-09-30 18:56) [8]

Эх разьяснил бы кто?


 
Johnnnnn   (2009-09-30 20:53) [9]

В общем кому может пригодиться? Как говориться за неумной головою нет ногам покоя

var
 ai:array of string;
 delhotkeyrun:boolean;

procedure delhotkey();
var
i, i1, i2:integer;
s,s1,s2:string;
begin
i2:=0;
if (delhotkeyrun) then begin
delhotkeyrun:=false;
setlength(ai, form1.ComponentCount-1);
for i:=0 to form1.ComponentCount-1 do begin
if (form1.Components[i] is TButton) then begin
s:=(form1.Components[i] as TButton).caption;
for i1:=0 to length(s) do begin
s1:=s[i1];
if s1="&" then begin
ai[i2]:=(form1.Components[i] as TButton).name+"///"+s;
inc(i2);
s:=copy(s, 0, i1-1)+copy(s, i1+1, length(s));
break;
end;
end;
(form1.Components[i] as TButton).caption:=s;
end;
end;
end else begin
delhotkeyrun:=true;
for i:=0 to form1.ComponentCount-1 do begin
if (form1.Components[i] is TButton) then begin
for i1:=0 to length(ai)-1   do begin
s:=copy(ai[i1], 1, pos("///",ai[i1])-1);
s1:=copy(ai[i1], pos("///",ai[i1])+3, length(ai[i1]));
s2:=(form1.Components[i] as TButton).name;
if s=s2 then (form1.Components[i] as TButton).caption:=s1;
end;
end;
end;
end;
end;

initialization
delhotkeyrun:=true;


 
Юрий Зотов ©   (2009-09-30 21:51) [10]

> Johnnnnn   (30.09.09 16:30) [7]

> чтото я немогу в этом коде разобраться

Это плохо - код-то ведь очень простой. Делайте выводы - наверное, самое время книжки по Delphi полистать?

> можно както попроще

Проще уж некуда. Кстати, Ваш вариант сложнее, а кроме того он отключает только кнопки и не позволяет включить их обратно.

> нажал на кнопку акселераторы вырубились нажал еще раз включились

Вот именно это у меня и происходит при двойном щелчке по самой форме.


 
Johnnnnn   (2009-09-30 22:03) [11]

Насчет книжек согласен только когда их читать... Я просто понять не могу что именно там отключает его по всей видимости эта процедура CMDialogChar но ее вызова я нигде не нашел... Вот только что собрал новый проэкт с вашим кодом, да все работает в том у меня почемуто когда жал shift+cntl+c выдавало кауюто ошибку на етой процедуре procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; я ее и так и так а она нивкакую:) А то что я скинул у меня работает и на вкл и на выкл.


 
Юрий Зотов ©   (2009-09-30 23:14) [12]

> Johnnnnn   (30.09.09 22:03) [11]

> Насчет книжек согласен только когда их читать...

На поиск и скачку книги Тейксейры и Пачеко уйдет 15 минут. На ее чтение - неделя. А на программирование и "вслепую" (как сейчас) Вы потратите годы. Так что выгоднее?

> что именно там отключает его по всей видимости эта процедура
> CMDialogChar но ее вызова я нигде не нашел.

И не найдете. Это процедура обработки сообщения CM_DIALOGCHAR, которое получает форма при нажатии любого акселератора. Она вызывается неявно, поэтому искать ее вызов бесполезно, этот механизм надо просто знать - вот, кстати, для чего нужны книжки.

> у меня почемуто когда жал shift+cntl+c выдавало кауюто ошибку

Когда ошибка перестанет быть "какой-то", а будет прочитан и понят ее текст - тогда станет ясна и ее причина. У меня никаких ошибок не возникает. Возможно, потому, что у меня на форме нет ничего, кроме кнопки, а у Вас есть еще что-то - вот это "что-то" и дает ошибку.


 
Johnnnnn   (2009-10-01 15:49) [13]

Спасибо.



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
15-1252385906
oxffff
2009-09-08 08:58
2009.11.15
Звенигород. 22-24 сентября. Honeywell.


2-1254313228
yantux
2009-09-30 16:20
2009.11.15
Подскажите свободные библиотеки для OpenGL


2-1254120146
ford
2009-09-28 10:42
2009.11.15
записать событие в лог виндовс


15-1252644331
MBo
2009-09-11 08:45
2009.11.15
Пятничная задачка


15-1253430561
Юрий Зотов
2009-09-20 11:09
2009.11.15
Люди, подскажите чайнику...