Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2009, 13:26   #1
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
Вопрос Кто поможет собрать программу из кусков кода

Всем привет.

Помощь нужна… Вопрос такой – есть программка, RADIO CHECKER PRO называется. Вот выдержка из её хелпа:

Внешнее управление программой

Программа имеет интерфейс для общения с другими программами с использованием функций
Windows API.

Для работы с RADIO CHECKER PRO нужно запустить его и найти его окно в системе.

Для этого определяем метку окна программы (Window Handle) с помощью функции.
Код:
function GetCheckerHandle: Integer;
begin
Result := FindWindow('TRadioChecker', nil);
end;
// Запомним Handle
Код:
CheckerHandle := GetCheckerHandle;
Далее необходимо отправить название класса окна Вашей программы, для того, чтобы Checker
имел возможность обратного общения с программой.
Код:
function SendWindowClassName(ClassName: string): Integer;
var
Struct: COPYDATASTRUCT;
pch: array[0..255] of Char;
begin
Struct.dwData := 1000;
Struct.lpData := StrPCopy(pch, ClassName);
Struct.cbData := StrLen(Struct.lpData) + 1;
SendMessage(CheckerHandle, WM_COPYDATA, 0, LPARAM(@Struct));
end;
Однако, можно также отдать Handle вашего окна, что исключит путаницу в случае нахождения в
системе двух окон с одинаковыми классами.
Код:
SendMessage(CheckerHandle, WM_USER, 100, Handle);
Для основного окна программы
Код:
Handle :=  Application.MainForm.Handle
Для посылки команды для RADIO Checker PRO используется функция
Код:
SendMessage(CheckerHandle, WM_USER, Cmd, Param);
Для обработки обратных сообщений программы нужно добавить функцию - обработчик сообщений
WM_USER.

При нахождение одного из образцов RADIO Checker Pro сообщит об этом Вашей программе с
кодом.
Код:
wParam = 2000, 
lParam = Номер образца в базе -1
procedure CheckerMessage (var Msg: TMessage); message WM_USER;
...
procedure TCheckerHandler.CheckerMessage (var Msg: TMessage);
begin
  case a.wParam of
   2000: SampleIndex := Msg.lParam + 1;
  end;
end;
Вот это то мне и надо – отловить, когда программа пошлёт это самое сообщение. Может ктонить поможет собрать эти обрывки кода до-кучи, в более-менее осмысленную форму?

Спасибо

Последний раз редактировалось Stilet; 23.11.2009 в 13:47.
Kvinto вне форума Ответить с цитированием
Старый 23.11.2009, 13:51   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

help данной программы сейчас передо мной открыт, все внятно и четко расписано. Где вы обрывки кода видите?
Код:
procedure CheckerMessage (var Msg: TMessage); message WM_USER; // кидаете в секцию private
Код:
procedure Tform1.CheckerMessage (var Msg: TMessage); // кидаете в тело unit-а вашего
begin
 case Msg.wParam of
  2000: if msg.lparam = ... then ...; // ваши действия
 end
end;
end;
и отлавливаете (не забываем про остальные константы).
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.11.2009 в 13:57.
raxp вне форума Ответить с цитированием
Старый 23.11.2009, 14:19   #3
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Хм... Тока не пинайте сильно!

Первую часть - в приват...

В тело

Код:
procedure Tform1.CheckerMessage (var Msg: TMessage);
begin
  case Msg.wParam of
  2000: if msg.lparam = 1 then MessageBox(0,0,0,0);
  end;
end;
Запускаю чекер, эмулирую нахождение образца - ничего...
Kvinto вне форума Ответить с цитированием
Старый 23.11.2009, 14:25   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

1) а кто будет "информировать" RADIO CHECKER PRO ?
Цитата:
Далее необходимо отправить название класса окна Вашей программы, для того, чтобы Checker имел возможность обратного общения с программой
вы это сделали (каким образом вы думаете он сообщения будет пересылать вам)?
2) и пробуйте сначала без msg.lparam
Код:
2000: MessageBox(0, ' ', ' ', 0);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.11.2009 в 14:31.
raxp вне форума Ответить с цитированием
Старый 23.11.2009, 14:31   #5
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Вот почему я и обратился с просьбой к опытным в данном вопросе...

Цитата:
//MessageBox(0,0,0,0); - что за ерунда?
Дык вроде рабочий... Это взято из другова источника, просто для примера и проверялось в компиляторе... Delphi7...

Код:
type
  TForm1 = class(TForm)
  ...    
    procedure KeyDownW(var Msg: TWMKeyDown); message WM_KEYDOWN;
    procedure KeyUpW(var msg: TWMKeyUp); message WM_KEYUP;
  ...
end;

procedure TForm2.KeyDownW(var Msg: TWMKeyDown);
begin
  case Msg.CharCode of
  13: MessageBox(0,0,0,0);
  end;
end;

procedure TForm2.KeyUpW(var msg: TWMKeyUp);
begin
  case Msg.CharCode of
  13: MessageBox(0,0,0,0);
  end;
end;

Последний раз редактировалось Stilet; 23.11.2009 в 14:53.
Kvinto вне форума Ответить с цитированием
Старый 23.11.2009, 14:46   #6
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Цитата:
а кто будет "информировать" RADIO CHECKER PRO ?
Да понял я, понял, что не проинформировал... И код в хелпе вроде есть - а что-куда -- с этим сложности. Подскажите, плз...

И, если не трудно - по-русски... При всём уважении - украинским владею не в полном объёме...

Последний раз редактировалось Stilet; 23.11.2009 в 14:58.
Kvinto вне форума Ответить с цитированием
Старый 23.11.2009, 14:52   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

если проект по-умолчанию, то его можно найти так:
Код:
h:= FindWindow('TForm1',nil);
отсюда, информировать так:
Код:
procedure SendWindowClassName(ClassName: string);
var
Struct: COPYDATASTRUCT;
pch: array[0..255] of Char;
begin
 Struct.dwData := 1000;
 Struct.lpData := StrPCopy(pch, ClassName);
 Struct.cbData := StrLen(Struct.lpData) + 1;
 SendMessage(FindWindow('TRadioChecker', nil), WM_COPYDATA, 0, LPARAM(@Struct));
end;

//передаем-
SendWindowClassName('TForm1');
зы: не забываем про кнопку "правка"
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.11.2009 в 14:54.
raxp вне форума Ответить с цитированием
Старый 23.11.2009, 15:19   #8
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

ммм...

Видите-ли, проблема в том, что я не настолько Делфи владею... Переделать готовый пример под свои нужды - это мне по силам... А с нуля написать - эт для меня сложновато...

Ну вот к примеру, тот же самый хелп...

Код:
//Для этого определяем метку окна программы (Window Handle) с помощью функции.

function GetCheckerHandle: Integer;
begin
  Result := FindWindow('TRadioChecker', nil);
end;
Это понятно... Далее:


Код:
// Запомним Handle
CheckerHandle := GetCheckerHandle;
А вот это куда? Сразу после? Ругается, пишет [Error] Unit1.pas(57): Declaration expected but identifier 'CheckerHandle' found...

Вот такой вот я ниразунезнающий...
Kvinto вне форума Ответить с цитированием
Старый 23.11.2009, 15:29   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

пост #7
Код:
SendMessage(FindWindow('TRadioChecker', nil), WM_COPYDATA, 0, LPARAM(@Struct));
ваш вопрос "А вот это куда?" уже решен.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось mihali4; 24.11.2009 в 01:12.
raxp вне форума Ответить с цитированием
Старый 24.11.2009, 00:24   #10
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Вобщем, наваял я вот что:

Код:
type
  TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);

  private
    procedure CheckerMessage (var Msg: TMessage); message WM_USER;
  public
 end;

var
  Form1: TForm1;
  CheckerHandle:integer;

  implementation

{$R *.dfm}

function GetCheckerHandle: Integer;
begin
  Result := FindWindow('TRadioChecker', nil);
end;

function SendWindowClassName(ClassName: string): Integer;
var
Struct: COPYDATASTRUCT;
pch: array[0..255] of Char;
begin
Struct.dwData := 1000;
Struct.lpData := StrPCopy(pch, ClassName);
Struct.cbData := StrLen(Struct.lpData) + 1;
SendMessage(CheckerHandle, WM_COPYDATA, 0, LPARAM(@Struct));
end;

procedure Tform1.CheckerMessage (var Msg: TMessage);
begin
  case Msg.wParam of
  2000: MessageBox(0,0,0,0);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 CheckerHandle:= GetCheckerHandle;
 SendMessage(CheckerHandle, WM_USER, 100, Handle);
end;

end.
Это работает... Но только в случае, если RADIO CHECKER PRO запущен раньше, чем эта програмка...

Как обойти эту засаду? Ибо по замыслу эта самая програмка должна ЗАКРЫВАТЬ RADIO CHECKER PRO... До следующего его запуска... Ну не в таймер же засовывать строку

Код:
SendMessage(CheckerHandle, WM_USER, 100, Handle);
А как?

Последний раз редактировалось Kvinto; 24.11.2009 в 00:26.
Kvinto вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
собрать команду из кода операции и операнда Olejik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 15 07.06.2009 01:46
Кто поможет студенту ?? Angelholy Помощь студентам 0 03.05.2009 14:07
Кто поможет??? sashahttp Общие вопросы Delphi 1 24.06.2008 09:15