![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ПРоблема с Gettext совместно с своим Winproc [D2005, XP]
Квэнди © (2006-07-11 11:21:00)Здравствуйте, проблема в следущем:
procedure TМой компонент.MSLWndProc(var Message: TMessage);
var s: PAnsiChar;
begin
case Message.Msg of
WM_GETTEXT: begin
Message.Result:= CallWindowProc(MSLOldWndProc, Handle, Message.Msg, Message.WParam, Message.LParam);
Button.Caption := Copy(PChar(Message.LParam),1,12); //кнопка которой нужно назначить caption (win2000,xp(классическая))
exit;
end;
WM_MDIACTIVATE: begin
if HWND(Message.LParam)=Handle then <операция>
if HWND(Message.WParam)=Handle then <операция>
end;
WM_DESTROY: begin
if Assigned(FOnDestroy) then OnDestroy(Self, Handle);
Self.Free;
SetWindowLong(Handle, GWL_WNDPROC, Longint(MSLOldWndProc));
FreeObjectInstance(MSLInstanceWndProc);
end;
WM_SHOWWINDOW: begin
GetIconForm; //процедура по выковыреванию иконок
GetWindowText(Handle,s,20);
Button.Caption:=pchar(s);
end;
end;
Message.Result:= CallWindowProc(MSLOldWndProc, Handle, Message.Msg, Message.WParam, Message.LParam);
end;
GetWindowText - она берет caption который был установлен для конкретной формы в design-time.
1
пример:
Design-time - form1.caption:='Журнал'.
- form2.caption:='Справочник'.
2
Run-Time
procedure tmainform.button1click(sender: tobject);
var f: Tform1;
begin
f:=TFomr1.create(application);
f.caption:='Журнал'+inttostr(mdichilcount+1);
end;
procedure tmainform.button2click(sender: tobject);
var f: Tform2;
begin
f:=TFomr2.create(application);
f.caption:='Справочник'+inttostr(mdichilcount+1);
end;
Вывод:
GetWindowTet - возьмет заголовок 1,
а нужно 2
Phoroon~ (2006-07-14 16:31:00) [1]
> И бывают задачи, которые можнорешить только
> одним вариантом (который больше всего подходит).
Правильнее будет сказать: “нужно”.
Сергей М. (2006-07-14 16:28:00) [2]
> Phoroon~ © (14.07.06 16:25) [38]
Это радует.
Phoroon~ (2006-07-14 16:25:00) [3]
> Ты, видать, тоже с дуба упал.
Не откуда я не падал.
ИМХО
Разных задач, огромное количество. И бывают задачи, которые можно решить только
одним вариантом (который больше всего подходит).
Сергей М. (2006-07-14 16:10:00) [4]
> Phoroon~ © (14.07.06 15:57) [33]
Ты, видать, тоже с дуба упал.
ВАП - штука серьезная)
sniknik (2006-07-14 16:08:00) [5]> Код- то работает, но только не в MDI
ну вот, теперь оказывается MDI виноват %-(... не придумывай, проверь (или поверь) работает, иши глюки в своемкоде.
Alien1769 (2006-07-14 16:05:00) [6]
> Phoroon~ © (14.07.06 15:57) [33]
>
> > Ты что, не в состоянии получить текст СВОЕГО окна средствами
>
> > VCL ?
>
> Ты чего привязался до человека, если выбран этот метод,
> значит нельзя VCL использовать.
Может уважаемый Phoroon~ © поможет начинающему.
Квэнди (2006-07-14 16:02:00) [7]
> sniknik © (14.07.06 15:36) [31]
Код- то работает, но только не в MDI
Phoroon~ (2006-07-14 15:57:00) [8]
> Ты что, не в состоянии получить текст СВОЕГО окна средствами
> VCL ?
Ты чего привязался до человека, если выбран этот метод, значит нельзя VCL использовать.
sniknik (2006-07-14 15:36:00) [9]> а не работает, вроде я как раз это и спрашивал
работает, т.что не про это... надо бы спросить почему это не работает в "TМой компонент", может тотому что у него просто нет caption-а? потому и "Но p пустой" (или handle невалидный, не того контрола...)
проверь (сам бы должен по идее), на главной форме ..
TForm1 = class(TForm)
...
protected
procedure WndProc(var Mes: TMessage); override;
...
end;
procedure TForm1.WndProc(var Mes: TMessage);
var
s: string;
len: integer;
begin
case Mes.Msg of
WM_SHOWWINDOW:
begin
len:= GetWindowTextLengthA(Handle);
SetLength(s, len);
GetWindowTextA(Handle, PChar(s), len+1);
Label1.Caption:=s;
end;
end;
inherited WndProc(Mes);
end;
Label1.Caption должен скопироваться из заголовка главной формы.
работает?
теперь смотри в другое место (значение хендла, откуда его береш, длинну возвращаемую GetWindowTextLengthA, возвращаемый номер ошибки из GetWindowTextA, т.д. х.з. что еще там у тебя может быть)
Сергей М. (2006-07-14 15:36:00) [10]А нахрена эта ф-ция нужна в своем приложении ?)
Ты что, не в состоянии получить текст СВОЕГО окна средствами VCL ?
Квэнди (2006-07-14 15:16:00) [11]
> > Как ни странно функцию, о которой идет речь.
А я что говорю ? речь как раз о том, что она должна работать в своем приложении, а не работает, вроде я как раз это и спрашивал
Сергей М. (2006-07-14 15:10:00) [12]
> Как ни странно функцию, о которой идет речь.
Ты с дуба упал ?)
ГДЕ в процитированном фрагменте справки упомянуто о том, что ты не вправе использовать эту ф-цию в своем приложении ?!
Сергей М. (2006-07-14 15:08:00) [13]
> Квэнди
Открывай справку по WM_GETTEXT и читай до полного просветления - это альтарнатива, обходящая ограничение для GetWindowText
Квэнди (2006-07-14 15:08:00) [14]
> Сергей М. © (14.07.06 15:06) [26]
Как ни странно функцию, о которой идет речь.
Сергей М. (2006-07-14 15:06:00) [15]
> я использую в своем приложении
Что используешь-то ?)
Квэнди (2006-07-14 15:05:00) [16]This function cannot retrieve the text of an edit control in another application.
А я использую в своем приложении. Что еще выяснять ?
Сергей М. (2006-07-14 15:03:00) [17]Вряд ли или не вряд ли - выясняй детально.
А пока все это пальцем на воде писано.
Квэнди (2006-07-14 14:59:00) [18]
> Сергей М. © (14.07.06 12:20) [22]
Я пытаюсь выдрать декст в одном mdi приложении. Точнее из форма mdi-child этого приложения, вряд ли эта особенность мешает.
Сергей М. (2006-07-14 12:20:00) [19]
> Квэнди © (14.07.06 11:44) [21]
Цитата из справки:
This function cannot retrieve the text of an edit control in another application.
Квэнди (2006-07-14 11:44:00) [20]
> Сергей М. © (14.07.06 11:34) [20]
Но p пустой ... вот собственно в чем проблема, и что я оисывал в первом посте...