Форум: "Начинающим";
Текущий архив: 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.55 MB
Время: 0.014 c