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

Вниз

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

Наверх




Память: 0.54 MB
Время: 0.01 c
1-1150972456
Старик
2006-06-22 14:34
2006.08.06
Различные варианты выгрузки приложения из памяти


15-1152534560
гвость
2006-07-10 16:29
2006.08.06
Ошибка при создании Field`a типа Numeric в ADOTable


3-1149160684
ganda
2006-06-01 15:18
2006.08.06
SQL - запрос


15-1152772975
Alien1769
2006-07-13 10:42
2006.08.06
Требование по ресурсам 1С


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





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