Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Сообщение от одного приложения - другому

Автор: Tribunal 10.03.2008 11:16

Здравствуйте!
Моя задача такова:
Нужно создать 2 приложения, одно из которых посылает оконное
соообщение, содержащее информацию о типе, параметрах, положении
фигуры; второе - принимает сообщение и отображает фигуру на экране
(эллипс, прямоугольник, многоугольник).

В принципе, программа практически готова. Единственно что она виснет
после передачи сообщения, причем сначала основное приложение %)
Прикрепленный файл  mes.rar ( 30.8 килобайт ) Кол-во скачиваний: 348

Посмотрите пожалуйста, может подскажете что-нибудь...)
Плюс там сделан 3-ей фигурой треугольник...как лучше сделать многоугольник?

спасибо)

Автор: volvo 10.03.2008 16:50

Во-первых, в отсылающей сообщение программе после

        int* t = new int[ARSZ];
нарушена индексация - должно начинаться с 0, а не с 1. Ты просто вылетаешь за границы выделенной памяти и кто знает, что именно ты затираешь при
        t[7]=y3;
...

Во-вторых, ты уверена, что окно находится? Вызывай FindWindow вначале, и если результат не NULL - только тогда посылай сообщение. Иначе очень может быть, что ты шлешь его в пустоту.

Добавлено через 9 мин.
P.S. Да, после внесенных изменений все работает, единственное, что не очень хорошо: при получении сообщения второе приложение "выбрасывает" MessageBox, что создает _иллюзию_ зависания, пока не переключишься на него и не нажмешь "Ok"...

Автор: Tribunal 16.03.2008 19:10

Переделала программу для многоугольников...
не самым лучшим образом...
в данный момент проблема в том,что
передаётся многоугольник неверно=(
посмотрите пожалуйста что не так...
буду очень благодарна!

Прикрепленный файл  mes.rar ( 41.92 килобайт ) Кол-во скачиваний: 349

Автор: volvo 16.03.2008 20:25

Ты передаешь данные неправильно. Вот так нужно:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
COPYDATASTRUCT C;

int* t = new int[type*2+1];
t[0]=type;

int k = 1;
for (int i=0; i<type; i++) {
t[k++]=pl[i].x;
t[k++]=pl[i].y;
}

C.cbData=sizeof(int)*(2*type+1); // Здесь тоже внимательнее !!!
C.lpData=(void*)t;

// Зачем здесь надо передавать хендл окна, я не понимаю... Все равно он не используется.
SendMessage(FindWindow(0,"App2"), WM_COPYDATA, (WPARAM) Form1->WindowHandle, (LPARAM) &C);
}

Ну, и принимать тоже соответственно:
...
Canvas->Pen->Mode=pmCopy;

int k=1;
for (int i=0; i<a[0]; i++) {
pl[i].x = a[k++];
pl[i].y = a[k++];
}
Canvas->Polygon(pl,a[0]);
...

Автор: Tribunal 17.03.2008 18:23

спасибо большое.
единственно у меня почему-то при повторном (раз на 3-4) рисовании многоугольника
появляется допольнительная вершина ^_^
(0,0) прицепляется((
что с этим сделать можно?
подскажите, пожалуйста..

Автор: volvo 17.03.2008 19:30

Да, у тебя получается многоугольник "незамкнутый", отсюда и проблема. Чтобы его "замкнуть" - достаточно добавить еще одну точку, равную нулевой:

     	PaintBox1->Canvas->FillRect(PaintBox1->BoundsRect);
type = StrToInt(Edit1->Text);
for (int i=0; i<type; i++) {
pl[i].x=random(200)-40;
pl[i].y=random(300)-40;
}
pl[type] = pl[0];
Canvas->Pen->Mode=pmCopy;
Canvas->Polygon(pl, type); // <--- здесь остается type, не (type+1) !!!

Естественно, при перемещении и отсылке сообщения надо учитывать не type, а (type+1) точек...