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

 
обработчики событий динамических компонент, собсно хоцца поизящней реализовать
joker
Отправлено: 08.05.2004, 12:57


Не зарегистрирован







Такой вот значит вопрос. Код создает массив из TPanel как мне сделать поизящней обработку onResize каждого из них.
вот значит пример такой: создаем 10 панелей, на каждой по одному Edit'у и лэйблу. И лэйбл находится слева панели а всю остальную часть панели занимает Edit. Если для лэйблов мы делаем label[i]->Align = alLeft;
то Edit'ы надо таскать програмно:

TPanel* panels[10];
TLabel* labels[10];
TEdit* edits[10];
TNotifyEvent panel_resize[10];

...

for (i=0; i<10; i++) {
panels[i] = new Tpanel(Form1);
panels[i]->Parent = Form1;
labels[i] = new TLabel(Form1);
labels[i]->Align = alLeft;
edits[i] = new TEdit(Form1);
panels[i]->OnResize = panel_resize[i]; //досюдо компилятор все проглатывает отлично, да и у меня вопросов не возникает.
}

void __fastall panel_resize[0](TObject sender) //<-тут возникает ошибка повторного описания и того что массив должен иметь хотябы один элемент...
{
edits[0]->left=panels[0]->clientWidth — labels[0]->width;
}

а как мне описать это все? или какнибудь сделать для всех панелей одну функцию? Я на сях первый раз прогу пишу, поэтому опыта — ноль sad.gif(
xTrim
Отправлено: 12.05.2004, 09:46


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

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



можно так
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i=0;i<10;i++)
{
 panels[i] = new TPanel(Form1);
 panels[i]->Parent = Form1;
 panels[i]->Align = alTop;
 panels[i]->OnResize = PanelResize;
 labels[i] = new TLabel(panels[i]);
 labels[i]->Parent = panels[i];
 labels[i]->Align = alLeft;
 labels[i]->Width = 20;
 edits[i] = new TEdit(panels[i]);
 edits[i]->Parent = panels[i];
 edits[i]->Left = 20;
 edits[i]->Width=panels[i]->ClientWidth-25;
}
}  
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelResize(TObject *Sender)
{
TPanel *p = dynamic_cast<TPanel*>(Sender);
for(int i=0;i!=p->ComponentCount;i++)
{
 TEdit *e = dynamic_cast<TEdit*>(p->Components[i]);
 if(!e) continue;
 e->Width=p->ClientWidth-25;
}
}

но я думаю лучше все-же
CODE

for (int i=0;i<10;i++)
{
 panels[i] = new TPanel(Form1);
 panels[i]->Parent = Form1;
//  panels[i]->OnResize = PanelResize;
 labels[i] = new TLabel(panels[i]);
 labels[i]->Parent = panels[i];
 labels[i]->Align = alLeft;
 labels[i]->Width = 20;
 edits[i] = new TEdit(panels[i]);
 edits[i]->Parent = panels[i];
 edits[i]->Left = 20;
 edits[i]->Width=panels[i]->ClientWidth-25;
 edits[i]->Anchors  = TAnchors() << akLeft << akTop << akRight << akBottom;
}
Gedeon
Отправлено: 12.05.2004, 11:25


Ветеран

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



QUOTE

но я думаю лучше все-же
CODE

for (int i=0;i<10;i++)
{
panels[i] = new TPanel(Form1);
panels[i]->Parent = Form1;
//  panels[i]->OnResize = PanelResize;
labels[i] = new TLabel(panels[i]);
labels[i]->Parent = panels[i];
labels[i]->Align = alLeft;
labels[i]->Width = 20;
edits[i] = new TEdit(panels[i]);
edits[i]->Parent = panels[i];
edits[i]->Left = 20;
edits[i]->Width=panels[i]->ClientWidth-25;
edits[i]->Anchors  = TAnchors() << akLeft << akTop << akRight << akBottom;
}


Безусловно, что касается OnResize надо делать так, если это только для изменения размеров дочерних компонентов, однако, возможна ситуация при которой необходимо провести еще какие-либо действия, плюс, я думаю, OnResize просто для примера.
Вообще я бы не так сделал. Зачем создавать массив указателей? Я бы создал один указатель, а свойству tag каждого вновь созданного компонента присваивал бы например тоже i. Все это будет выглядеть примерно так:
Создание
CODE

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   TPanel *P; // Указатели на панель, лэйбл, эдит
   TLabel *L;
   TEdit *E;
   for(int i=0;i<10;i++){
       P = new TPanel(this); // Создание
       L = new TLabel(this);
       E = new TEdit(this);
       P->Parent = this;     // присвоение родителей
       L->Parent = P;
       E->Parent = P;
       P->Align = alTop;     // это так для удобства
       L->Caption = "I am Label" + IntToStr(i);
       E->Left = 100;
       L->Tag = i;           // собственно присвоение тэгов
       E->Tag = i;           // собственно присвоение тэгов
       E->OnClick = EClick;  // присвоение функции по этому событию
   }

}
//---------------------------------------------------------------------------

и реализация события
CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::EClick(TObject *Sender)
{
   TEdit *e = dynamic_cast<TEdit*>(Sender); // преобразование в нужный обьект
   switch(e->Tag){                          // а тут собственно выбор тэга
       case(0):{
       } break;
       case(1):{
       } break;
       case(2):{
           Beep(1000,100);                  // пищим если клик на втором
       } break;
       case(3):{
       } break;
       case(4):{
       } break;
       case(5):{
       } break;
       case(6):{
       } break;
       case(7):{
       } break;
       case(8):{
       } break;
       case(9):{
       } break;

   }
}
//---------------------------------------------------------------------------

Т.е. в этом случае мы просто можем различать на каком из них произошел клик.

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