Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Динамическое создание SNMP


Автор: Bima 8.2.2007, 14:48
создаю динамически 5 компонентов Indy: IdSNMP
код такой:

в *.h в секции private пишу:
Код

TIdSNMP *MySNMP[5];


в *.cpp пишу следующее:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0; i<5; i++)
   {
   MySNMP[i]=new TIdSNMP(this);
   MySNMP[i]->Active=true;
   MySNMP[i]->BroadcastEnabled=false;
   MySNMP[i]->BufferSize=8192;
   MySNMP[i]->Community="public";
   MySNMP[i]->Port=161;
   MySNMP[i]->ReceiveTimeout=500;
   MySNMP[i]->TrapPort=162;
   MySNMP[i]->Query ->PDUType=PDUGetRequest;
   }
MySNMP[0]->Host="10.3.4.13";
MySNMP[1]->Host="10.3.4.14";
MySNMP[2]->Host="10.3.4.15";
MySNMP[3]->Host="10.3.4.16";
MySNMP[4]->Host="10.3.4.17";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Add("Send strat");
for (int i=0; i<5; i++)
   {
   MySNMP[i]->Query->MIBAdd("1.3.6.1.4.1.318.1.1.1.1.2.2.0","");
   if (MySNMP[i]->SendQuery())
      {
      for (int k = 0; k < MySNMP[i]->Reply->ValueCount; k++)
      Memo1->Lines->Add(IntToStr(i)+"= "+MySNMP[i]->Reply->Value[k]);
      }
   }
Memo1->Lines->Add("Send stop");
}
//---------------------------------------------------------------------------

код на кнопке не отвечает, то есть компоненты не работают, в Мемо1 появляются только 2 сообщения Send strat и Send stop.

Если делаю на компоненте, который ставлю на форму:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdSNMP1->Active=true;
IdSNMP1->Query->Host="10.3.4.13";
IdSNMP1->Query->Community = "public";
IdSNMP1->Query ->PDUType=PDUGetRequest;
IdSNMP1->Query->MIBAdd("1.3.6.1.4.1.318.1.1.1.1.2.2.0","");
if (IdSNMP1->SendQuery())
   {
   for (int i = 0; i < IdSNMP1->Reply->ValueCount; i++)
      Memo1->Lines->Add(IdSNMP1->Reply->Value[i]);
   }
}
//---------------------------------------------------------------------------

То все прекрассно работает.
проясните данную ситуацию?

Автор: Anikmar 8.2.2007, 22:39
Лично я в коде, сколько не вглядывался, ничего криминального не увидел.

Предположение:

1. При размещении на форме какие-то поля задаются в дизайн-тайме и забываются при динамическом создании. Можно открыть dfm файл в текстовом режиме и внимательно посмотреть на поток создания этого объекта, может что-то упущено? (конечно маловероятно, но все-таки - сам нарывался на такие мелочи)

2. MySNMP[i]->Query->MIBAdd("1.3.6.1.4.1.318.1.1.1.1.2.2.0",""); - я не спец по этому компоненту, просто возникла мысль - не надо ли это свойство сначала обнулить или еще что с ним сделать....

Автор: Bima 9.2.2007, 15:44
Цитата

Можно открыть dfm файл в текстовом режиме и внимательно посмотреть на поток создания этого объекта, может что-то упущено? 

Там вообще все по минимуму.
Решилась проблема не обычным способом:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0; i<5; i++)
   {
   MySNMP[i]=new TIdSNMP(this);
   MySNMP[i]->Active=true;
   MySNMP[i]->BroadcastEnabled=false;
   MySNMP[i]->BufferSize=8192;
   MySNMP[i]->Community="public";
   MySNMP[i]->Port=161;
   MySNMP[i]->ReceiveTimeout=500;
   MySNMP[i]->TrapPort=162;
   MySNMP[i]->Query ->PDUType=PDUGetRequest;
   MySNMP[i]->Name="MySNMP"+IntToStr(i);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Add("Send strat");
for (int i=0; i<5; i++)
   {
   MySNMP[i]->Query->Clear();
   MySNMP[i]->Active=true;
   MySNMP[i]->Host="10.3.4."+IntToStr(13+i);
   MySNMP[i]->Query->MIBAdd("1.3.6.1.4.1.318.1.1.1.1.2.2.0","");
   if (MySNMP[i]->SendQuery())
      {
      for (int k = 0; k < MySNMP[i]->Reply->ValueCount; k++)
      Memo1->Lines->Add(IntToStr(i)+"= "+MySNMP[i]->Reply->Value[k]);
      }
   }
Memo1->Lines->Add("Send stop");
}
//---------------------------------------------------------------------------


Похоже, что адрес не присвоился в момент инициализации, а когда перед отправкой сообщения я его проинициализировал, то все заработало.
тема закрыта

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)