Я использую самодельный инструмент перевода. (В следующий раз я воспользуюсь одной из библиотек, как описано здесь: инструмент перевода delphi .)
Мои переводчики жалуются, что перевод длинного списка строк затруднен, потому что они не видят их в контекст (на экране, в котором они появляются.)
Один переводчик сделал отличное предложение, чтобы у него была возможность щелкнуть компонент, чтобы изменить его текст. Я могу реализовать это , если я смогу найти способ перехватить всю программу, событие, чтобы, когда пользователь нажимает на компонент, удерживая нажатой клавишу CTRL, вызывается обработчик событий. Обработчик событий определит, есть ли у компонента файл.Caption, и если да, то получить значение компонента Tag (а затем разрешить некоторый ввод данных пользователем.)
(Каждый переводимый компонент правильно имеет уникальное целое число в своем теге, которое я использую для поиска компонента .Caption.)
Есть предложения, как это сделать? Это над моей головой. Мне нужно что-то вроде KeyPreview формы, но для щелчков мышью, чтобы выяснить, какой компонент VCL был нажат, и определить его значение .Tag.
Том
РЕДАКТИРОВАТЬ:
Используя предложение Дэвида Х., единственные события, которые я получаю, - это когда приложение получает фокус или теряет его. Что я сделал не так?
function TForm1.AppHookFunc(var Message : TMessage) : Boolean;
begin
Result := FALSE;
inc(i); outputdebugstring(Pchar(inttostr(i) + ': ' + IntTostr(Message.msg)));
if Message.Msg = WM_MBUTTONDOWN then
begin Beep;
//...DoSomething...
//Result := True;
end;
end;
procedure TForm1.FormCreate( Sender: TObject);
begin
Application.HookMainWindow(AppHookFunc);
end;
procedure TForm1.FormDestroy(
Sender: TObject);
begin
Application.UnHookMainWindow(AppHookFunc);
end;
РЕДАКТИРОВАТЬ 2
Я почти готов! Но FindDragTarget редко возвращает что-либо, кроме нуля. Если я сделаю огромную кнопку, закрывающую большую часть элемента управления, иногда мне удается заставить ее работать. Координаты X, Y в полученном tagMSG относятся к элементу управления. Я бы хотел, чтобы они относились к форме. Я все еще использую другой обработчик событий, чем должен? Любые предложения:
procedure TForm1.ApplicationEvents1Message( var Msg: tagMSG;
var Handled: Boolean);
var
Target: TControl;
Point: TPoint;
begin
Handled := FALSE;
if (Msg.Message = WM_LBUTTONDOWN) And isAltDown then
begin
Point.X := LongRec(Msg.lParam).Lo;
Point.Y := LongRec(Msg.lParam).Hi;
Target := FindDragTarget( Point, {AllowDisabled=}TRUE);
if Assigned(Target) then
begin
if Target Is TButton then
outputdebugString(Pchar(TButton(Target).Caption));
end
else
outputdebugstring(Pchar(IntToStr(Point.X) + ', ' + IntToStr(Point.Y)));
end;
end;
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Я изменил приведенный выше код, чтобы использовать GetCursorPos, а не Msg.lParam. Теперь работает. Очень круто! ТАК КАК!
СПАСИБО ОБЕИМ ЗА ПОМОЩЬ!