Несколько добавок к стандартному дизайну: Дай контролы статусбару и индикатор раскладки клавиатуры своей программе!
© 2002 Сергей Секела
Не знаю кому-как, а мне было очень интересно, как же это во многих программах в StatusBar’ах ставят кнопки, или какие нибудь иконки.

Долго я лазил по интернету, качалу кучу компонент, но когда я ставил на форму такую панельку, кроме нее в довесок шла огромная библиотека, которая солидно накидала “лишних килограмм” моей программе. Потом я нашел в какой то литературе, как сделать StatusBar, к которому можна цеплять контролы. После этого я не использую огромных компнент для того, чтобы сделать в своей программе statusbar чуточку круче. Оказывается что если создать свой статусбар на основе стандартного и поменять его конструктор Create, то получится как раз то, что мне нужно:
unit MStatusBar;
interface
uses ComCtrls, Classes, Controls;
{$ObjExportAll On}
type
TMyStatusBar = class(TStatusBar)
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
uses Consts;
constructor TMyStatusBar.Create( AOwner : TComponent );
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csAcceptsControls];
end;
procedure Register;
begin
RegisterComponents('Win32', [TMyStatusBar]);
end;
end.
Если вот такой юнит проинсталлировать как компоненту, то потом его можна использовать в своих программах ;)
Вы спросите к чему это я клоню?
А идея этой статьи – создание своего индикатора клавиатуры, который будет сидеть именно в таком статус баре.
Долго я копал по разным конференциям и FAQ’ах.. но все таки нашел как это делается, теперь всегда это использую для наглядности и эргономики в программах. Значит чтобы получить текущую раскладку клавиатуры нужно использовать функцию GetKeyboardLayoutName, за реакцию на изменение раскладки клавиатуры отвечает Windows Message - WM_INPUTLANGCHANGEREQUEST и WM_INPUTLANGCHANGE. Они активируются при запросе на изменение раскладки и изменении раскладки соответственно. Но на практике оказалось, что активируются эти сообщения перед изменением текущей рассскладки, от этого и будем копать: Я избавился от такого очень просто: поставил на форму таймер, и через 10 миллисекунд спрашиваю у системмы текущую раскладку. Кстати чтобы знать активные в системме локалы можна порыться в реестре (так как это делал я).

Для иконки я использовал TanimatedImage из поставки RXLib, потому что и в него наиболее просто засунуть несколько пиктограм да и получить их тоже не сложно ;).
ИТАК:
При создании формы
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage:=LangChange;
end;
Процедура, которая ловит изменение и запускает таймер
procedure Tform1.LangChange(var m:TMsg;var Handled: Boolean);
begin
if (m.message=WM_INPUTLANGCHANGEREQUEST) or
(m.message=WM_INPUTLANGCHANGE)
then
Begin
langtimer.enabled:=true;
end;
end;
Собственно сам таймер:
procedure TForm1.LangTimerTimer(Sender: TObject);
var szBuf : array[0..KL_NAMELENGTH] of Char;
begin
GetKeyboardLayoutName( @(szBuf[0]) );
if string(szbuf)='00000409' then begin
flag.Glyphnum:=2;
flag.Hint:='Язык: Английский';
end
else
if string(szbuf)='00000419' then Begin
flag.Glyphnum:=1;
flag.Hint:='Язык: Русский';
end
else
if string(szbuf)='00000422' then Begin
flag.Glyphnum:=0;
flag.Hint:='Язык: Украинский';
end
else
Begin
flag.Glyphnum:=3;
flag.Hint:='Неизвестный язык :(';
end;
langtimer.Enabled:=false;
end;
Вот вроде все на счет индикатора, но когда есть индикатор, то хочется еще самому програмно переключать раскладки клавиатуры, а это делается очень просто: за это отвечает функция LoadKeyboardLayout . Её и будем использовать:
Procedure ChangeLanguage(Language:String);
var
LangName : array[0..KL_NAMELENGTH] of Char;
begin
StrCopy(LangName,pchar(Language));
LoadKeyboardLayout(LangName,KLF_ACTIVATE);
end;
P.S. Маленький список языковых раскладок:
| Ukrainian | 00000422 |
| Russian | 00000419 |
| English | 00000409 |
| German | 00000407 |
| Spanish | 00000403 |
| polish | 00000415 |
| Romainan | 00000418 |
| French | 0000040C |
Для индикатора исполюзуется RXLib 2.75
Желающие могут скачать исходные тексты примера (7.48K)
Все пожелание можете писать на DrWeb@torba.com.
Copyright© 2002 Сергей Секела Специально для Delphi Plus
| 2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2002 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2001 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2000 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 1999 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
- Компания по разработке программного обеспечения
- Услуги аутсорсинга в области программирования
- Как продлить срок службы картриджей
- Мошенничество во Всемирной Паутине. Осторожно: фишинг!
- Web-студия
- Как легально поднять уровень индекса цитирования.
- Мы реально сможем помочь вам в управлении предприятием
- Создание сайтов – популяризация вашего замысла
- Свой сайт. Управление ресурсом
- Семантическое ядро сайта или правила подбора ключевых фраз
- Программирование в среде Delphi 8 for .NET
- Практикум по Delphi для решения прикладных задач
- Фундаментальные алгоритмы и структуры данных в Delphi
- Delphi 6. Программирование на Object Pascal
- Delphi и технология COM
- Delphi в шутку и всерьез: что умеют хакеры
- Программирование в Delphi глазами хакера
- Delphi 2005. Секреты программирования
- Искусство создания компонентов Delphi
- Приемы программирования в Delphi на основе VCL
- Программирование баз данных в Delphi 7
- Программирование баз данных в Delphi
- Программирование в среде Delphi
- Программирование в Delphi 7
- Язык SQL в Delphi 5