Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменения свойства объекта в другой программе [D5, Win95/98]


VID ©   (2002-03-23 01:39:00) 

Срочно в номер!!! :)))

Дано:
имеется объект label3 , также известно имя формы на которой лежит этот label3 - эта форма FORM2

ЗАДАЧА: Надо написать прогу, которая в своём единственном окне сожержит только две кнопки:
нажав одну, свойству VISIBLE упомянутого объекта Label3 присваивается значение TRUE; нажав вторую, свойству VISIBLE присваивается значение FALSE;

А также : Очень надеюсь на Вашу помощь - от этого зависит сдача экзамена на сессии !!!


TapaH   (2002-03-25 19:14:00) [1]

Может это глупо... но - почему нельзя сделать так:
Оставить лейбл вообще в покое (для первой программы). Я так понимаю, что во второй можно что-топравить в исходном коде? (если нет, то дальше можно не читать :) ) Создаётся во второй программе любой невидимый объект (ИМЕЮЩИЙ СВОЙ ХЭНДЛ) и создаётся его событие OnChange (ну для него что родное в этом духе) и там уже меняется cв-во лейбла. Понятно? :)


VID   (2002-03-25 17:34:00) [2]

TO Adder: Спасибо, не забуду :)


Fay   (2002-03-25 13:13:00) [3]

Зверство, конечно...
... но можно использовать COM.


Adder   (2002-03-25 07:06:00) [4]

Только не забудь перед тем как рисовать (FillRect(HC,....), проверить HC<>0, иначе можешь нарисовать прямо на рабочем столе ;)


Adder   (2002-03-25 06:55:00) [5]

>Пусть на форме всегда виден этот 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.


VID   (2002-03-25 00:38:00) [6]

TO McSimm: Ты уже как-то говорил об этом... но в данном случае речь идёт о 32-х битной проге...

TO Mbo : Насколько я понял , в твоём примере, требуется также изменить код проги, в которой надо прятать label3. Но это не возможно - у меня нету исходников этой проги...

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

Вот эб этом собственно и речь...

Очен всё-таки, надеюсь на вашу помощь - сам не справлюсь :)


MBo   (2002-03-24 15:25:00) [7]

получатель
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;


McSimm   (2002-03-24 14:58:00) [8]

>Так, что же невозможно что ли ?????

Такое легко можно сделать для 16-битных программ (Делфи 1). Если это подойдет - поищу у себя. Когда-то в образовательных целях написал run-time инспектор программ на Делфи - можно ходить по всем объектам и читать/менять большинство их свойств


VID   (2002-03-24 14:25:00) [9]

вот это да!!!

так откровенно забить на тему :))




VID   (2002-03-23 20:51:00) [10]

Люди! Не теряйте тему ! :)))

ОЧЕНЬ ВАЖНО !


VID   (2002-03-23 17:07:00) [11]

Так, что же невозможно что ли ?????
ну хорошо... тогда поставим задачу по другому:
Пусть на форме всегда виден этот label3. КАК СДЕЛАть так, что бы при нажатии кнопки из другой проги, область, занимаемая этим LABEL3 была закрашена, цветом clButtonFace, а при нажатии другой кнопки, заливка исчезалабы , т.е. происходил бы REFRESH (или REPAINT) того окна, которое содержит LABEL3

Left, top, width и Height объекта Label3 - известны.


Shaman_Naydak   (2002-03-23 16:01:00) [12]

Если это окно действительно принадлежит ДРУГОЙ программе, то практически никак..
Label - наследник TGraphicControl"a, а стало быть своего дескриптора (хендла) не имеет.
Проблема в том, что в чужой проге ты не можешь найти этот объект..
Чисто теоретически можно для окна чужой проги попробовать подложить свою WndProc, в которой перехватывать WM_Paint и в случае невидимости заливать просто прямоугольник фоном формы(координаты вычислить эмпирически).. но это столько геморра и тонны 3 кода, что никакого смысла заниматься этим нет


VID   (2002-03-23 12:48:00) [13]

TO Song: Речь действительно идёт об отдельных приложенияж

TO perov: Окно, в котором содержится Label3 является модальным и вызывается из гланого окна проги. Не мог бы ты сказать, какое сообщение надо послать окну, что бы его label3 показался или исчез ?
Если не трудно, приведи пожалуйста пример кода


perov   (2002-03-23 11:44:00) [14]

так в заголовке сказано
Изменения свойства объекта в другой программе
и далее

> ЗАДАЧА: Надо написать прогу, которая в своём единственном
> окнесожержит только две кнопки


Song   (2002-03-23 10:17:00) [15]

Да из чего Вы взяли что это отдельные приложения?


perov   (2002-03-23 10:02:00) [16]

суть примерно такая
зная имя и класс окна твоего приложения, получаешь его hwnd (FindWindow)
получив хендл окна просматриваешь все его дочерние окна
(EnumChildWindows)
для каждого дочернего окна, проверяешь заголовок (GetWindowText)
если это нужное окно, то посылаем ему сообщение, так как знаем его хендл


McLaren   (2002-03-23 09:16:00) [17]

Я так понял, что есть одна программа, на которой лежит лабель, и вторая программа, которая этот лабель скрывает? У лабеля в Дельфи нет хэндла, ему даже сообщение не пошлешь, так что,imho, без ковыряния в первой проге ничего не получится.


Song   (2002-03-23 08:54:00) [18]

procedureTForm1.Button1Click(Sender: TObject);
begin
Label3.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Label3.Hide;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо