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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1254269831
Drowsy
2009-09-30 04:17
2009.11.15
Как можно из программы запустить другое приложение


2-1254506989
@!!ex
2009-10-02 22:09
2009.11.15
Почему записываются нули вместо значения????


15-1253305803
Юрий
2009-09-19 00:30
2009.11.15
С днем рождения ! 19 сентября 2009 суббота


15-1251884197
Piter
2009-09-02 13:36
2009.11.15
Размер дистрибутива .NET


1-1224572864
Gurd
2008-10-21 11:07
2009.11.15
TXMLDocument





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