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;
}
а как мне описать это все? или какнибудь сделать для всех панелей одну функцию? Я на сях первый раз прогу пишу, поэтому опыта — ноль ( |
|
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;
}
}
//--------------------------------------------------------------------------- |
Т.е. в этом случае мы просто можем различать на каком из них произошел клик.
|
|
|