Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к компоненту основной формы из модуля 
:(
    Опции темы
Isaev
Дата 4.2.2011, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Как из подключенного модуля вывести данные в Memo на основной форме?
В Delphi, например, пишишь Uses Unit1.pas и всё... А тут как?

При попытке подключить
Код

#include "Unit1.h"

получаю ошибку в модуле sysmac.H на строке extern "C" {
Код

[C++ Error] sysmac.H(50): E2040 Declaration terminated incorrectly

Видимо потому, что модуль *.c
Объявлена в форма в Unit1.h стандартно
Код

class TForm1 : public TForm



Это сообщение отредактировал(а) Isaev - 4.2.2011, 02:24
PM MAIL ICQ   Вверх
oldcode
Дата 4.2.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



непонятно ... какой модуль куда подключен... и при чем в С++ Билдере *.c ? мало кода...
PM MAIL   Вверх
Нитонисе
Дата 4.2.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Isaev @  4.2.2011,  02:02 Найти цитируемый пост)
Как из подключенного модуля вывести данные в Memo на основной форме?

Во-первых модуль надо добавить в проект (соответствующая кнопочка на панели инструментов билдера), во-вторых включить заголовочный файл главной формы в этом модуле директивой 
Код

#include "Unit1"

Ну а смамо обращение к Мемо...
Код

Form1->Memo1->AddLine("Some text");

PM MAIL   Вверх
Isaev
Дата 4.2.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(oldcode @  4.2.2011,  13:02 Найти цитируемый пост)
непонятно ... какой модуль куда подключен... и при чем в С++ Билдере *.c ? мало кода...

Создаём новый проект (именно в C++ Builder), кидаем на него Memo1, есть модуль, написан на С, а не на С++, потому *.c
т.е. есть 2 файла 123.h и 123.c... В 123.c есть метод, который вызывается из Unit1.cpp
Из файла 123.c нужно осуществить вывод в Memo1

Цитата(Нитонисе @  4.2.2011,  13:32 Найти цитируемый пост)
Во-первых модуль надо добавить в проект

Конечно добавлен

Цитата(Нитонисе @  4.2.2011,  13:32 Найти цитируемый пост)
во-вторых включить заголовочный файл главной формы в этом модуле директивой 

Об этом я писал, читайте внимательнее... При подключении получаю ошибку.

Цитата(Нитонисе @  4.2.2011,  13:32 Найти цитируемый пост)
Ну а смамо обращение к Мемо...

Я в общем компилятор пишу, думаю такие вещи знаю...

Это сообщение отредактировал(а) Isaev - 4.2.2011, 16:20
PM MAIL ICQ   Вверх
borisbn
Дата 4.2.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Нитонисе @  4.2.2011,  13:32 Найти цитируемый пост)
Form1->Memo1->AddLine("Some text");

обращаться так к классам и к __property'ям из Си нельзя!

тут решение я вижу одно ( не факт, что оно одно, просто я одно вижу smile )
передать в Си указатель на функцию, а из Си вызывать её. Типа такого

В Си
Код

typedef void (*updateMemo_f)( void * context, char * text );

static updateMemo_f s_updateMemo;
static void * s_context;

void setUpdateMemoFunc( updateMemo_f updateMemo, void * context ) {
   s_updateMemo = updateMemo;
   s_context = context;
}

...
// там, где требуется...
s_updateMemo( s_context, "Some text" ); // можно ещё проверить, что s_updateMemo != 0


В Си++ (В Form1)
Код

class TForm1 : public TForm {
...
static void updateMemo_s( void * context, char * text ) {
  TForm1 * pThis = (TForm1 *)context;
  pThis->updateMemo( text );
}

// Метод класса
void updateMemo( char * text ) {
  Memo1->AddLine("Some text");
}

...
// где-то в init'е
setUpdateMemoFunc( &updateMemo_s, this );



Это сообщение отредактировал(а) borisbn - 4.2.2011, 17:19


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Isaev
Дата 4.2.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



borisbn,  что-то я не туда вставил, компилится, но не работает
->project<-
PM MAIL ICQ   Вверх
borisbn
Дата 4.2.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Isaev, 
1) в 123.h должен быть header-guard:
в начале файла:
Код

#if !deined( _123_h_included_)
#deine _123_h_included_

а в конце
Код

#endif //!deined( _123_h_included_)


2) в h-никах нельзя создавать переменные - только объявлять
Цитата

static updateMemo_f s_updateMemo;
static void * s_context;

а должно быть
Код

extern updateMemo_f s_updateMemo;
extern void * s_context;


а в 123.c должно быть
Код

static updateMemo_f s_updateMemo;
static void * s_context;


3) функция setUpdateMemoFunc должна быть объявлена в 123.h как inline
Код
inlie void setUpdateMemoFunc( updateMemo_f updateMemo, void * context ) {
  s_updateMemo( s_context, "Some text" ); // можно ещё проверить, что s_updateMemo != 0
}


Цитата(Isaev @  4.2.2011,  18:57 Найти цитируемый пост)
 что-то я не туда вставил, компилится, но не работает

и ( самое главное ),
1. что не работает ?
2. как не работает ?
3. на какой строке ошибка ?


Это сообщение отредактировал(а) borisbn - 4.2.2011, 21:21


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Isaev
Дата 4.2.2011, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



borisbn,  спасибо заработало! Но:
Цитата(borisbn @  4.2.2011,  21:16 Найти цитируемый пост)
функция setUpdateMemoFunc должна быть объявлена в 123.h как inline

как inline не получается её объявить! Сделал просто extern. Это важно?

Цитата(borisbn @  4.2.2011,  21:16 Найти цитируемый пост)
и ( самое главное ),1. что не работает ?2. как не работает ?3. на какой строке ошибка ?

Это я опистил, т.к. приложил текст... Если компилируется, значит уже ошибка на какой строке не покажет!
Была ошибка попытка чтения из адреса 0х00000000

Эх, тяжко прыгать с одного языка на другой!

PS: Если лог в Memo идёт из каждого модуля, в каждом это нужно громоздить или можно как-то универсальнее сделать?


Это сообщение отредактировал(а) Isaev - 4.2.2011, 22:18
PM MAIL ICQ   Вверх
borisbn
Дата 5.2.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
Это я опистил

либо ты ашипся, либо я исчо плохо знаю олбанский smile

А вот это вообще не понял:
1.
Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
спасибо заработало!

2.
Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
Была ошибка попытка чтения из адреса 0х00000000

чему верить ?

P.S.
Цитата(borisbn @  4.2.2011,  17:10 Найти цитируемый пост)
тут решение я вижу одно ( не факт, что оно одно, просто я одно вижу  )

на самом деле не одно. можно предложить ещё проще - переименовать файл *.c в *.cpp, включить в него unit.h и тупо вызывать
Код

Form1->Memo1->AddLine("Some text");




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Isaev
Дата 5.2.2011, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(borisbn @  4.2.2011,  17:10 Найти цитируемый пост)

Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
Это я опистил

либо ты ашипся, либо я исчо плохо знаю олбанский smile

Описался... "опустил" должно быть, нет русских клавиш просто.

Цитата(borisbn @  4.2.2011,  17:10 Найти цитируемый пост)
А вот это вообще не понял:
1.
Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
спасибо заработало!

2.
Цитата(Isaev @  4.2.2011,  22:09 Найти цитируемый пост)
Была ошибка попытка чтения из адреса 0х00000000

чему верить ?

Потому, что сначала ты ошибку исправил, а потом задал вопрос почему она была!

Цитата(borisbn @  4.2.2011,  17:10 Найти цитируемый пост)
тут решение я вижу одно ( не факт, что оно одно, просто я одно вижу  )
на самом деле не одно. можно предложить ещё проще - переименовать файл *.c в *.cpp, включить в него unit.h и тупо вызывать
Код

Form1->Memo1->AddLine("Some text");

Хмм, надо попробовать!

Это сообщение отредактировал(а) Isaev - 5.2.2011, 21:20
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.