C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Передача данных и графика
flint
  Отправлено: 26.07.2005, 12:23


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Суть такова:
Программа должна принимать через модем данные и сохранять их на компьютере пользователя в виде файла *.txt
В файле находятся данные о рисунке (координаты точек)
затем необходимо по точкам, заданным в файле, нарисовать фигуру(плоскую)
КАК ЭТО ВСЁ СДЕЛАТЬ?
Поиогите чем можете!!!
ОЧЕНЬ популярные ответы будут очень кстати
Рад буду даже ссылке на статью:)
заранее огромное спасибо всем, кто откликнется на вопрос.
flint
Отправлено: 26.07.2005, 12:27


Дежурный стрелочник

Группа: Участник
Сообщений: 58



И ещё. Картинка получится намного больше, чем размер области, в которой она рисуется.
Надо что-то придумывать, или хватит обычных ScrollBar'ов?
А если ScrollBar'ы не причем, то как это сделать?
еще раз senq
Vlad
Отправлено: 26.07.2005, 13:42


Машинист паровоза

Группа: Участник
Сообщений: 231



Прием файла, я бы сделал через РОР3 (компоненты Indy). Во первых при работе с модемом, ты будешь точно уверен,что получил целый файл. Я такую байду года 2 назад делал, только том другие данные и файл ДБФ. Гляну, могу куски кода кинуть, со старой байды, если найду.
flint
Отправлено: 27.07.2005, 07:06


Дежурный стрелочник

Группа: Участник
Сообщений: 58



спасибо. рад буду, если отправишь. А то я повис тут, и почитать нечего.
Хоть пошарюсь разберусь.
Vlad
Отправлено: 27.07.2005, 10:03


Машинист паровоза

Группа: Участник
Сообщений: 231



Вот что то нашел. Вообщем смысл в следующем:
Использовать обычный виндовый диалер для установки соединения. Пусть он сам набирает. Кстати, он использует default установки винды.
CODE

if(modem)
{
///////*connect to dialer
TRegistry * Reg= new TRegistry;

   Reg->RootKey = HKEY_CURRENT_USER;
   if (Reg->OpenKey("\\RemoteAccess", true) )
   {

     con=Reg->ReadString("Default");
     Reg->CloseKey();
/*
покоцано цензурой
*/      
    con="rundll32.exe rnaui.dll,RnaDial " + con;
 
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
    if( !CreateProcess( NULL, // No module name (use command line).
       con.c_str(), // Command line.
       NULL,             // Process handle not inheritable.
       NULL,             // Thread handle not inheritable.
       FALSE,            // Set handle inheritance to FALSE.
       0,                // No creation flags.
       NULL,             // Use parent's environment block.
       NULL,             // Use parent's starting directory.
       &si,              // Pointer to STARTUPINFO structure.
       &pi )             // Pointer to PROCESS_INFORMATION structure.
   )
      // ErrorExit( "CreateProcess failed." );
      {
        delete Reg;
return 0;

      }

   WaitForSingleObject( pi.hProcess, INFINITE );
        CloseHandle( pi.hProcess );

   CloseHandle( pi.hThread );

    }
Vlad
Отправлено: 27.07.2005, 10:56


Машинист паровоза

Группа: Участник
Сообщений: 231



Вот кусок еще , испозуется Indy, но не тот что по умолчанию в Билдере.
Используется 5 Билдер и библиотека Indy ,кажется 9, взятая с сайта Indy.
Кое где я постирал не значищий для вас код. Идет передача файла.
Учтите, что по стандарту, SMTP , сервер может требовать авторизации(имя и пароль), а может нет. Все зависит как сервак настроен.
CODE

TIdAttachment(IdMessage1->MessageParts, ExtractFilePath(Application->ExeName)+"\\zak.dbf");
IdMessage1->Subject=USER_IDP+"*"+"#$89%";//USER_IDP;
IdMessage1->Recipients->EMailAddresses = to;
IdMessage1->ReceiptRecipient->Text= out_em;
IdMessage1->From->Text=out_em;
if(autr)
IdSMTP1->AuthenticationType = atLogin;
else
IdSMTP1->AuthenticationType = atNone;
IdSMTP1->Username = user;
  IdSMTP1->Password =ix;
  IdSMTP1->Host = em;
  IdSMTP1->Port = StrToInt(port);

  try{
  IdSMTP1->Connect(0);

  try {
     IdSMTP1->Send(IdMessage1);

     save_auto();
         }
     catch(...)
     {
      ShowMessage("Посылка почты не удалась!");
            return 0;
     }
     }
  __finally
  {
  IdMessage1->MessageParts->Clear();
        IdSMTP1->Disconnect();
        if(DM->T2->Active==false)
       DM->T2->Active=true;
     return 1;
   }
  }
  else
 {
/*
покоцано цензурой
*/
TIdAttachment(IdMessage1->MessageParts, ExtractFilePath(Application->ExeName)+"\Zak.dbf");
IdMessage1->Subject=USER_IDP+"*"+"#$89%";//USER_IDP;
IdMessage1->Recipients->EMailAddresses = to;
IdMessage1->ReceiptRecipient->Text= out_em;
IdMessage1->From->Text=out_em;
if(autr)
IdSMTP1->AuthenticationType = atLogin;
else
IdSMTP1->AuthenticationType = atNone;
IdSMTP1->Username = user;
  IdSMTP1->Password =ix;
  IdSMTP1->Host = em;
  IdSMTP1->Port = StrToInt(port);

  try{
  IdSMTP1->Connect(0);

  try {
     IdSMTP1->Send(IdMessage1);
      save_auto();
     }
     catch(...)
     {
      ShowMessage("Посылка почты не удалась!");
/*
*/  
         return 0;
     }
     }
  __finally
  {
  IdMessage1->MessageParts->Clear();
     IdSMTP1->Disconnect();
     return 1;
   }


Посмотрю где у меня есть прием, тоже брошу.
Есть вообще другой вариант приема файла, — используется любая почтовая прога установленная на компе, у неё забирается файлик и затем обрабатывается. Но это другая тема smile.gif Хотя кодировать — меньше.
Vlad
Отправлено: 27.07.2005, 11:42


Машинист паровоза

Группа: Участник
Сообщений: 231



p.s. Про рисование лучше в аське потрепаться. Хотя всё элементарно. И еще печатать надо или нет?
flint
Отправлено: 27.07.2005, 12:02


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Спасибо большое. Вот, пытаюсь разобраться.
Печатать Надо. На печать выводится часть рисунка, отображаемая в области ее просмотра...
flint
  Отправлено: 27.07.2005, 12:09


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Только вот вопрос:

QUOTE

"Использовать обычный виндовый диалер для установки соединения"

Моя вина:)

Суть программы в том, что существует некий прибор, у которого есть встроенный модем. По требованию хозяина прибора (нажатии на кнопку) модем соединяется с компьютером, на котором стоит программа. Она уже и обрабатывает поступившие данные.
?: причем тут dialer????
flint
  Отправлено: 27.07.2005, 12:11


Дежурный стрелочник

Группа: Участник
Сообщений: 58



!!!Важно: на приборе нет операционной системы.
Как быть в этом случае?
Vlad
Отправлено: 27.07.2005, 12:50


Машинист паровоза

Группа: Участник
Сообщений: 231



На компе с которым связывается прибор, что за софт стоит, который обрабатывает входящий звонок? Или комп стоит в локалке? без модема.
flint
  Отправлено: 27.07.2005, 13:13


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Так вот я и пишу этот софт, который обрабатывает входящий звонок!!!
flint
Отправлено: 28.07.2005, 06:43


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Попробую еще подробнее.

Прорамма стоит на компьютере, который должен принять данные и их обработать. В идеале на этом компьютере, кроме этой программы ничего никогда не должно запускаться. Но это только в идеале.
Поэтому я сворачиваю её в трей (на будущее, пока не реализовал).

Эта программа постоянно следит за состояноием com-порта, на котором висит модем. И, как только поступают данные (Данные поступают без ранней договоренности, т.е. в ЛЮБОЕ время, и программа должна в это же время их принять), приложение их принимает, подается сигнал, и под руководством пользователя соответствующим образом обрабатывается.

Вот.....

flint
Отправлено: 28.07.2005, 06:57


Дежурный стрелочник

Группа: Участник
Сообщений: 58



а протокол передачи могу тебе на аську скинуть
(если авторизируешь smile.gif )
Vlad
Отправлено: 28.07.2005, 07:50


Машинист паровоза

Группа: Участник
Сообщений: 231



стучись smile.gif
flint
Отправлено: 28.07.2005, 09:20


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Уж второй день стучусь cool.gif
Георгий
Отправлено: 28.07.2005, 22:32


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



у меня тут нескольно вопросиков есть:
1. комп с программа связан с железкой проводом через RS232 или настоящей телефонной сетью через настоящий модем?
2. программа что то вроде сканера? получает в качестве исходных данных нечто, что потом переводит в bmp?
3. функции программы состоят в том, что бы принять данные от железки, показать картинку пользователю, распечатать. всё?
flint
Отправлено: 29.07.2005, 06:34


Дежурный стрелочник

Группа: Участник
Сообщений: 58



2 Георгий

у меня тут несколько ответиков есть smile.gif :

1. Комп и прибор связаны настоящей телефонной сетью, через настоящий внутренний модем

2.программа что-то вроде сканера. Постоянно слушает модем. Получает в качестве исходных данных, так скажем, координаты точек, а по ним строит изображение, которое, не факт, что вмещается в область, выделенную под нее. именно эту область необходимо вывести на экран. ИЗОБРАЖЕНИЕ НЕ СОХРАНЯЕТСЯ! сохраняются переданные данные, по которым в любой момент изображение может заново построиться. Причем этих данных должно быть много (много понятие растяжимое В данном случае много — это 10приборов*10картинок=100 картинок )

3.
QUOTE
функции программы состоят в том, что бы принять данные от железки, показать картинку пользователю, распечатать.

А также сохранить переданный файл в базе данных (таблица базы данных состоит из номеров приборов). Или альтернативный вариант(кстати, даже более удобный): создать папку. имя — номер прибора. Затем туда помещать полученные данные.
Но картинки нужно будет рисовать, используя БД:
выбрал из БД номер прибора -> увидел какие рисунки есть -> выбрал из них нужный -> посмотрел/распечатал

Вот, вроде и вся суть.
Появится еще что- то напишу
Появятся еще вопросы — пишите вы
(или, лучше как появятся ответы biggrin.gif )
Заранее спасибо...

Вернуться в Вопросы программирования в C++Builder