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

Вниз

ПРоблема с Gettext совместно с своим Winproc   Найти похожие ветки 

 
Квэнди ©   (2006-07-11 11:21) [0]

Здравствуйте, проблема в следущем:
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


 
Квэнди ©   (2006-07-11 17:49) [1]

Подскажите пожалуйста


 
Leonid Troyanovsky ©   (2006-07-11 18:39) [2]


> Квэнди ©   (11.07.06 17:49) [1]

> Подскажите пожалуйста


Память для s будет Пушкин выделять?

И, вообще, для снабжения контрола своей
оконной процедурой есть procedure WndProc(..); override

--
Regards, LVT.


 
Квэнди ©   (2006-07-12 12:11) [3]

var s: string;
p: PAnsiChar;
begin
case Message.Msg of
WM_SHOWWINDOW: begin
GetWindowTextA(Handle,p,GetWindowTextLengthA(Handle));
s:=p;
Button.Caption:=s;
end;
end;
end;

Длинна текста определяется, а самого текста нет ..


 
Сергей М. ©   (2006-07-12 12:15) [4]


> Квэнди ©   (12.07.06 12:11) [3]


Про Пушкина вник ?
Задумайся над содержимым переменной p перед вызовом GetWindowTextA() ..


 
Квэнди ©   (2006-07-12 13:58) [5]


> Сергей М. ©   (12.07.06 12:15) [4]

если честно немного не понял каким образом я могу выделить память под p ?


 
Сергей М. ©   (2006-07-12 14:06) [6]


> Квэнди ©   (12.07.06 13:58) [5]


GetMem()


 
Квэнди ©   (2006-07-12 14:10) [7]

var s: string;
p: PAnsiChar;
begin
case Message.Msg of
WM_SHOWWINDOW: begin
getmem(p,GetWindowTextLengthA(Handle));
GetWindowTextA(Handle,p,GetWindowTextLengthA(Handle));
s:=p;
Button.Caption:=s;
end;
end;
end;
Верно ?


 
Квэнди ©   (2006-07-12 14:39) [8]

Так результат идентично тот же (


 
Сергей М. ©   (2006-07-12 14:39) [9]

Проверяй


 
Квэнди ©   (2006-07-12 14:54) [10]

Что имено проверять ?
это верный код ? с ним должно работать ?
var s: string;
p: PAnsiChar;
begin
case Message.Msg of
WM_SHOWWINDOW: begin
getmem(p,GetWindowTextLengthA(Handle));
GetWindowTextA(Handle,p,GetWindowTextLengthA(Handle));
s:=p;
Button.Caption:=s;
end;
end;
end;


 
Сергей М. ©   (2006-07-12 14:55) [11]


> Квэнди ©   (12.07.06 14:54) [10]
>
> Что имено проверять ?
> это верный код ? с ним должно работать ?


Этот код и проверяй)


 
Квэнди ©   (2006-07-12 15:04) [12]


> Сергей М. ©   (12.07.06 14:55) [11]

Чтобы что- то проверять надо знать верно это или нет...
var p: PAnsiChar;
GetMem(p,GetWindowTextLengthA(Handle));
GetWindowTextA(Handle,p,GetWindowTextLengthA(Handle));
Button.Caption:=p;

Это верно ?


 
Сергей М. ©   (2006-07-12 15:07) [13]


> Чтобы что- то проверять надо знать верно это или нет


Что бы убедиться , верно что-то или нет, надо это "что-то" проверить.
Ты проверил ? Работает ? Или в рассуждалки играть будем ?


 
Квэнди ©   (2006-07-12 15:09) [14]


> Квэнди ©   (12.07.06 14:39) [8]
>
> Так результат идентично тот же (


 
Сергей М. ©   (2006-07-12 15:27) [15]


> результат идентично тот же


ГДЕ ты проверяешь результат, возвращаемый ф-цией GetWindowtext ?


 
Квэнди ©   (2006-07-12 16:03) [16]


> Сергей М. ©   (12.07.06 15:27) [15]

В debug и p пустая.


 
Сергей М. ©   (2006-07-12 16:07) [17]


> Квэнди ©   (12.07.06 16:03) [16]


Русский язык понимаешь ?
GetWindowtext - функция.
Функция возвращает результат.
ГДЕ в твоем коде анализ этого результата ?


 
Квэнди ©   (2006-07-13 14:12) [18]


> var i: integer;
> p: PAnsiChar;
> begin
> GetMem(p,GetWindowTextLengthA(Handle));
> i:=GetWindowTextA(Handle,p,GetWindowTextLengthA(Handle));
>  //вот в этом месте мы и читаем result
> Button.Caption:=IntToStr(i);
> end;


I возвращает количество символов


 
Квэнди ©   (2006-07-14 11:23) [19]

Неужели никто не сможет помочь ?


 
Сергей М. ©   (2006-07-14 11:34) [20]


> Квэнди ©   (14.07.06 11:23) [19]


Что тебе еще не понятно ?
Все уже тобой сделано - p указывает на строку в i байт, содержащую искомый текст


 
Квэнди ©   (2006-07-14 11:44) [21]


> Сергей М. ©   (14.07.06 11:34) [20]

Но p пустой ... вот собственно в чем проблема, и что я оисывал в первом посте...


 
Сергей М. ©   (2006-07-14 12:20) [22]


> Квэнди ©   (14.07.06 11:44) [21]


Цитата из справки:

This function cannot retrieve the text of an edit control in another application.


 
Квэнди ©   (2006-07-14 14:59) [23]


> Сергей М. ©   (14.07.06 12:20) [22]


Я пытаюсь выдрать декст в одном mdi приложении. Точнее из форма mdi-child этого приложения, вряд ли эта особенность мешает.


 
Сергей М. ©   (2006-07-14 15:03) [24]

Вряд ли или не вряд ли - выясняй детально.

А пока все это пальцем на воде писано.


 
Квэнди ©   (2006-07-14 15:05) [25]

This function cannot retrieve the text of an edit control in another application.
А я использую в своем приложении. Что еще выяснять ?


 
Сергей М. ©   (2006-07-14 15:06) [26]


> я использую в своем приложении


Что используешь-то ?)


 
Квэнди ©   (2006-07-14 15:08) [27]


> Сергей М. ©   (14.07.06 15:06) [26]

Как ни странно функцию, о которой идет речь.


 
Сергей М. ©   (2006-07-14 15:08) [28]


> Квэнди


Открывай справку по WM_GETTEXT и читай до полного просветления - это альтарнатива, обходящая ограничение для GetWindowText


 
Сергей М. ©   (2006-07-14 15:10) [29]


> Как ни странно функцию, о которой идет речь.


Ты с дуба упал ?)

ГДЕ в процитированном фрагменте справки упомянуто о том, что ты не вправе использовать эту ф-цию в своем приложении ?!


 
Квэнди ©   (2006-07-14 15:16) [30]


> > Как ни странно функцию, о которой идет речь.

А я что говорю ? речь как раз о том, что она должна работать в своем приложении, а не работает, вроде я как раз это и спрашивал


 
sniknik ©   (2006-07-14 15:36) [31]

> а не работает, вроде я как раз это и спрашивал
работает, т.что не про это... надо бы спросить почему это не работает в "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) [32]

А нахрена эта ф-ция нужна в своем приложении ?)

Ты что, не в состоянии получить текст СВОЕГО окна средствами VCL ?


 
Phoroon~ ©   (2006-07-14 15:57) [33]


> Ты что, не в состоянии получить текст СВОЕГО окна средствами
> VCL ?

Ты чего привязался до человека, если выбран этот метод, значит нельзя VCL использовать.


 
Квэнди ©   (2006-07-14 16:02) [34]


> sniknik ©   (14.07.06 15:36) [31]

Код- то работает, но только не в MDI


 
Alien1769 ©   (2006-07-14 16:05) [35]


> Phoroon~ ©   (14.07.06 15:57) [33]
>
> > Ты что, не в состоянии получить текст СВОЕГО окна средствами
>
> > VCL ?
>
> Ты чего привязался до человека, если выбран этот метод,
> значит нельзя VCL использовать.

Может уважаемый Phoroon~ © поможет начинающему.


 
sniknik ©   (2006-07-14 16:08) [36]

> Код- то работает, но только не в MDI
ну вот, теперь оказывается MDI виноват %-(... не придумывай, проверь (или поверь) работает, иши глюки в своем коде.


 
Сергей М. ©   (2006-07-14 16:10) [37]


> Phoroon~ ©   (14.07.06 15:57) [33]


Ты, видать, тоже с дуба упал.
ВАП - штука серьезная)


 
Phoroon~ ©   (2006-07-14 16:25) [38]


> Ты, видать, тоже с дуба упал.

Не откуда я не падал.

ИМХО
Разных задач, огромное количество. И бывают задачи, которые можно решить только
одним вариантом (который больше всего подходит).


 
Сергей М. ©   (2006-07-14 16:28) [39]


> Phoroon~ ©   (14.07.06 16:25) [38]


Это радует.


 
Phoroon~ ©   (2006-07-14 16:31) [40]


>  И бывают задачи, которые можно решить только
> одним вариантом (который больше всего подходит).


Правильнее будет сказать: “нужно”.



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

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

Наверх




Память: 0.57 MB
Время: 0.027 c
2-1152823256
Footballer
2006-07-14 00:40
2006.08.06
И снова "открыть с помощью..."


3-1149057311
Kolmax
2006-05-31 10:35
2006.08.06
Импорт данных


15-1152517295
Галинка
2006-07-10 11:41
2006.08.06
Какие задачи программят малые, средние и крупные фирмы


1-1151256672
Billis
2006-06-25 21:31
2006.08.06
Как в DBGrid узнать какая строка выделена?


15-1152176226
alles
2006-07-06 12:57
2006.08.06
asp доступ к Paradox-у по локалке