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

Вниз

Проблема с UpperCase и InputBox   Найти похожие ветки 

 
PRT   (2006-06-18 18:23) [0]

1. Почему UpperCase("строка") не работает если строка - русские символы ???
2. Можно ли в InputBox ограничить ввод символов ?? (например, чтоб можно было вводить только русские символы)


 
Eraser ©   (2006-06-18 18:29) [1]

> [0] PRT   (18.06.06 18:23)


> 1. Почему UpperCase("строка") не работает если строка -
> русские символы ???

см. AnsiUpperCase

> 2.

вряд ли, но что может быть проще, чем написать свою InputBoxEx ?


 
PRT   (2006-06-18 18:56) [2]


> вряд ли, но что может быть проще, чем написать свою InputBoxEx
> ?

Не спорю, но это еще одна форма, еще пару лишних кБ.


 
jack128 ©   (2006-06-18 18:59) [3]

PRT   (18.06.06 18:56) [2]
Не спорю, но это еще одна форма, еще пару лишних кБ.

если форму динамически создавать, а не в дезин тайм, то не более 500 байт - 100 пудов.


 
Rial ©   (2006-06-18 20:03) [4]

function UpCase(C : Char): Char; assembler;
asm
    MOV    AL,C
    CMP    AL,"a"
    JB     @@3
    CMP    AL,"z"
    JBE    @@2
    CMP    AL,"ё"
    JZ     @@1
    CMP    AL,"а"
    JB     @@3
    CMP    AL,"я"
    JBE    @@2
    JMP    @@3
@@1: MOV    AL,"Ё"
    JMP    @@3
@@2: SUB    AL,$20
@@3:
end;


 
PZ   (2006-06-18 20:09) [5]

Используйте переключатель клавиатуры:
 LoadKeyboardLayout("00000419", KLF_ACTIVATE); // вкл. русский шрифт
 LoadKeyboardLayout("00000409", KLF_ACTIVATE); // вкл. латинский шрифт


 
kaif ©   (2006-06-19 10:37) [6]

AnsiUpperCase


 
begin...end ©   (2006-06-19 19:53) [7]

> PRT   (18.06.06 18:23) [0]

> 2. Можно ли в InputBox ограничить ввод символов ?? (например,
> чтоб можно было вводить только русские символы)

Можно.

Что происходит при вызове InputBox? Создаётся форма c edit"ом и двумя кнопками, которая показывается модально.

Можем ли мы выполнить какой-нибудь свой код сразу после того, как эта форма будет модально показана? Можем -- сразу после её показа заработает цикл выборки сообщений, заключённый в методе ShowModal. Если послать, скажем, нашей главной форме асинхронное сообщение перед вызовом InputBox, то оно будет выбрано из очереди в ходе работы этого цикла. А в обработчике этого сообщения как раз и можно разместить нужный код.

Допустим, дескриптор модальной формы мы определили.

Можем ли мы получить дескриптор дочернего edit"а? Можем -- см. FindWindowEx.

Можем ли мы получить указатель на экземпляр класса TEdit (Self), связанный с этим дескриптором? Можем -- см. Controls.pas, сообщение RM_GETOBJECTINSTANCE.

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

Можем ли мы, имея этот указатель, назначить edit"у свой обработчик события? Можем, причём совершенно стандартно -- установив значение соответствующего свойства.

А вот код, который всё это делает. Особо не тестировал, но, вроде бы,  работает.

const
 WM_MODALMESSAGE = WM_USER + 100;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure WMModalMessage(var Message: TMessage); message WM_MODALMESSAGE;
   procedure EditKeyPress(Sender: TObject; var Key: Char);
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, WM_MODALMESSAGE, 0, 0);
 InputBox("Изменённый InputBox", "Сюда вводятся только русские буквы:", "")
end;

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
 if not (Key in ["А".."я", "ё", "Ё"]) then
   Key := #0
end;

procedure TForm1.WMModalMessage(var Message: TMessage);
var
 EditHandle: Cardinal;
 EditInstance: TEdit;
 GetObjectInstanceMessage: Cardinal;
begin
 EditHandle := FindWindowEx(GetActiveWindow, 0, "TEdit", nil);
 if EditHandle <> 0 then
 begin
   GetObjectInstanceMessage := RegisterWindowMessage(PChar(Format("ControlOfs%.8X%.8X", [HInstance, GetCurrentThreadID])));
   EditInstance := nil;
   EditInstance := TEdit(SendMessage(EditHandle, GetObjectInstanceMessage, 0, 0));
   if Assigned(EditInstance) then
   begin
     EditInstance.OnKeyPress := EditKeyPress
   end
 end
end;


Здесь edit"у назначается обработчик OnKeyPress, поэтому будет фильтроваться только текст, вводимый вручную, а проблему вставки текста с русскими буквами из буфера это не решает, но совершенно аналогично можно решить и эту проблему -- назначить нужный OnChange вместо OnKeyPress.


 
Leonid Troyanovsky ©   (2006-06-19 20:20) [8]


> begin...end ©   (19.06.06 19:53) [7]

>    EditInstance := TEdit(SendMessage(EditHandle, GetObjectInstanceMessage,


Ну, есть, вообще-то, FindControl.
Хотя, конечно, Screen.ActiveControl для InputBox вполне, IMHO, хватит.

--
Regards, LVT.


 
begin...end ©   (2006-06-19 20:25) [9]

> Leonid Troyanovsky ©   (19.06.06 20:20) [8]

И правда. Забыл.


 
begin...end ©   (2006-06-19 20:38) [10]

> Leonid Troyanovsky ©   (19.06.06 20:20) [8]

> Хотя, конечно, Screen.ActiveControl для InputBox вполне,
> IMHO, хватит.

Ну, если положиться на то, что фокус после вызова InputBox обязательно будет у edit"а -- тогда да. Собственно, вряд ли когда-нибудь будет по-другому, но мне почему-то полагаться на это не хочется.

:-)


 
Leonid Troyanovsky ©   (2006-06-19 20:42) [11]


> begin...end ©   (19.06.06 20:38) [10]

> ли когда-нибудь будет по-другому, но мне почему-то полагаться
> на это не хочется.


Тогда ActiveForm и перебрать Controls.

--
Regards, LVT.



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

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

Наверх




Память: 0.5 MB
Время: 0.043 c
2-1152173889
Байрам
2006-07-06 12:18
2006.07.30
ZLib, распаковка нескольких файлов


15-1151578256
Gero
2006-06-29 14:50
2006.07.30
Прием денег кредитными карточками


3-1148841228
Still Swamp
2006-05-28 22:33
2006.07.30
Требуется локальная DB


1-1150870217
DeStranger
2006-06-21 10:10
2006.07.30
получить TList из потока


4-1145027468
Antoshka
2006-04-14 19:11
2006.07.30
как создать ярлык