Форум: "WinAPI";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизИзменения свойства объекта в другой программе Найти похожие ветки
← →
VID (2002-03-23 01:39) [0]Срочно в номер!!! :)))
Дано:
имеется объект label3 , также известно имя формы на которой лежит этот label3 - эта форма FORM2
ЗАДАЧА: Надо написать прогу, которая в своём единственном окне сожержит только две кнопки:
нажав одну, свойству VISIBLE упомянутого объекта Label3 присваивается значение TRUE; нажав вторую, свойству VISIBLE присваивается значение FALSE;
А также : Очень надеюсь на Вашу помощь - от этого зависит сдача экзамена на сессии !!!
← →
Song (2002-03-23 08:54) [1]procedure TForm1.Button1Click(Sender: TObject);
begin
Label3.Show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label3.Hide;
end;
← →
McLaren (2002-03-23 09:16) [2]Я так понял, что есть одна программа, на которой лежит лабель, и вторая программа, которая этот лабель скрывает? У лабеля в Дельфи нет хэндла, ему даже сообщение не пошлешь, так что,imho, без ковыряния в первой проге ничего не получится.
← →
perov (2002-03-23 10:02) [3]суть примерно такая
зная имя и класс окна твоего приложения, получаешь его hwnd (FindWindow)
получив хендл окна просматриваешь все его дочерние окна
(EnumChildWindows)
для каждого дочернего окна, проверяешь заголовок (GetWindowText)
если это нужное окно, то посылаем ему сообщение, так как знаем его хендл
← →
Song (2002-03-23 10:17) [4]Да из чего Вы взяли что это отдельные приложения?
← →
perov (2002-03-23 11:44) [5]так в заголовке сказано
Изменения свойства объекта в другой программе
и далее
> ЗАДАЧА: Надо написать прогу, которая в своём единственном
> окне сожержит только две кнопки
← →
VID (2002-03-23 12:48) [6]TO Song: Речь действительно идёт об отдельных приложенияж
TO perov: Окно, в котором содержится Label3 является модальным и вызывается из гланого окна проги. Не мог бы ты сказать, какое сообщение надо послать окну, что бы его label3 показался или исчез ?
Если не трудно, приведи пожалуйста пример кода
← →
Shaman_Naydak (2002-03-23 16:01) [7]Если это окно действительно принадлежит ДРУГОЙ программе, то практически никак..
Label - наследник TGraphicControl"a, а стало быть своего дескриптора (хендла) не имеет.
Проблема в том, что в чужой проге ты не можешь найти этот объект..
Чисто теоретически можно для окна чужой проги попробовать подложить свою WndProc, в которой перехватывать WM_Paint и в случае невидимости заливать просто прямоугольник фоном формы(координаты вычислить эмпирически).. но это столько геморра и тонны 3 кода, что никакого смысла заниматься этим нет
← →
VID (2002-03-23 17:07) [8]Так, что же невозможно что ли ?????
ну хорошо... тогда поставим задачу по другому:
Пусть на форме всегда виден этот label3. КАК СДЕЛАть так, что бы при нажатии кнопки из другой проги, область, занимаемая этим LABEL3 была закрашена, цветом clButtonFace, а при нажатии другой кнопки, заливка исчезалабы , т.е. происходил бы REFRESH (или REPAINT) того окна, которое содержит LABEL3
Left, top, width и Height объекта Label3 - известны.
← →
VID (2002-03-23 20:51) [9]Люди! Не теряйте тему ! :)))
ОЧЕНЬ ВАЖНО !
← →
VID (2002-03-24 14:25) [10]вот это да!!!
так откровенно забить на тему :))
← →
McSimm (2002-03-24 14:58) [11]>Так, что же невозможно что ли ?????
Такое легко можно сделать для 16-битных программ (Делфи 1). Если это подойдет - поищу у себя. Когда-то в образовательных целях написал run-time инспектор программ на Делфи - можно ходить по всем объектам и читать/менять большинство их свойств
← →
MBo (2002-03-24 15:25) [12]получатель
TFormA = class(TForm)
Label1: TLabel;
private
{ Private declarations }
protected
procedure WmCopyData(var Message: TMessage); message WM_COPYDATA;
procedure TFormA.WmCopyData(var Message: TMessage);
begin
label1.color:=PInteger(PCopyDataStruct(Message.LParam)^.lpData)^;
end;
передатчик
procedure TForm5.Button1Click(Sender: TObject);
var h:THandle;
buf:integer;
Data: TCopyDataStruct;
begin
buf:=clRed;
h:=FindWindow("TFormA", nil);
if h>0 then begin
Data.dwData := 0;
Data.cbData := SizeOf(Integer);
Data.lpData := @buf;
SendMessage(h, WM_COPYDATA,0,integer(@Data));
end;
end;
← →
VID (2002-03-25 00:38) [13]TO McSimm: Ты уже как-то говорил об этом... но в данном случае речь идёт о 32-х битной проге...
TO Mbo : Насколько я понял , в твоём примере, требуется также изменить код проги, в которой надо прятать label3. Но это не возможно - у меня нету исходников этой проги...
Было - бы неплохо, найти решение что бы из одной проги нажав кнопку, рисовать (в данном случае заливка) на канвасе формы другой проги...
Вот эб этом собственно и речь...
Очен всё-таки, надеюсь на вашу помощь - сам не справлюсь :)
← →
Adder (2002-03-25 06:55) [14]>Пусть на форме всегда виден этот label3. КАК СДЕЛАть так, что >бы при нажатии кнопки из другой проги, область, занимаемая этим >LABEL3 была закрашена, цветом clButtonFace, а при нажатии >другой кнопки, заливка исчезалабы , т.е. происходил бы REFRESH >(или REPAINT) того окна, которое содержит LABEL3
>Left, top, width и Height объекта Label3 - известны.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,Controls,Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
H,HC:THandle;
Const
L=40; //Left
T=80; //Top
R=40+32; //Left+Width
B=80+13; //Top+Height
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
H:=FindWindow(0,"Form2");
HC := GetDC(H); {получить контекст }
FillRect(HC,rect(L,T,R,B),(COLOR_BTNFACE+1)); {нарисовать}
ReleaseDC(0,HC); {освободить контекст}
end;
procedure TForm1.Button2Click(Sender: TObject);
var Tmp:TRect;
begin
Tmp:=rect(L,T,R,B);
InvalidateRect(H,@Tmp,true);
end;
end.
← →
Adder (2002-03-25 07:06) [15]Только не забудь перед тем как рисовать (FillRect(HC,....), проверить HC<>0, иначе можешь нарисовать прямо на рабочем столе ;)
← →
Fay (2002-03-25 13:13) [16]Зверство, конечно...
... но можно использовать COM.
← →
VID (2002-03-25 17:34) [17]TO Adder: Спасибо, не забуду :)
← →
TapaH (2002-03-25 19:14) [18]Может это глупо... но - почему нельзя сделать так:
Оставить лейбл вообще в покое (для первой программы). Я так понимаю, что во второй можно что-топравить в исходном коде? (если нет, то дальше можно не читать :) ) Создаётся во второй программе любой невидимый объект (ИМЕЮЩИЙ СВОЙ ХЭНДЛ) и создаётся его событие OnChange (ну для него что родное в этом духе) и там уже меняется cв-во лейбла. Понятно? :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c