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

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
8-1138559567
SKIPtr
2006-01-29 21:32
2006.07.30
Как воспроизвести 2 звуковых файла


2-1152392627
privet
2006-07-09 01:03
2006.07.30
кнопошки


15-1151417957
ArtemESC
2006-06-27 18:19
2006.07.30
Как узнать где SoundBlaster: порт, DMA-канал ...


2-1152620996
Mishenka
2006-07-11 16:29
2006.07.30
Как перевести сантиметры в пикселы?


2-1152188298
FFFF
2006-07-06 16:18
2006.07.30
В запросе не работает "NZ"





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