Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает для всех форм проекта

25K
13 ноября 2008 года
TheMustafa
33 / / 08.09.2008
Здравствуйте!

Помогите пжлста понять в чем дело?
Есть код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i, j;
String tmpStr, tmpStr2;
TRadioGroup *rdg;
TComboBox *cmb;
TListBox *lb;
TLabel *lbl;
TEdit *ed;
TButton *btn;
TCheckBox *chb;
TRadioButton *rb;

Memo1->Clear();
Memo2->Clear();
Memo3->Clear();
Memo1->Lines->Add("Êîëè÷åñòâî êîìïîíåíòîâ â Application - "+IntToStr(Application->ComponentCount));
for (i=0; i<Application->ComponentCount; i++)
{
Memo1->Lines->Add(Application->Components->Name);
tmpStr = Application->Components->ClassName();
if (tmpStr.Pos("Form") > 0)
{
Memo1->Lines->Add("&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#234;&#238;&#236;&#239;&#238;&#237;&#229;&#237;&#242;&#238;&#226; &#237;&#224; &#244;&#238;&#240;&#236;&#229; - "+IntToStr(Application->Components->ComponentCount));

for (j=0; j<Application->Components->ComponentCount; j++)
{
tmpStr2 = Application->Components->Name+"_"+Application->Components->Components[j]->Name;
Memo2->Lines->Add("#define rs"+tmpStr2);
tmpStr2 = Application->Components->Components[j]->ClassName();
// &#229;&#241;&#235;&#232; Label
if (tmpStr2.Pos("Label") > 0)
{
lbl = (TLabel*)FindComponent(Application->Components->Components[j]->Name);
tmpStr2 = "rs"+Application->Components->Name+"_"+lbl->Name+"_Caption \""+
lbl->Caption+"\"";
Memo3->Lines->Add(tmpStr2);
continue;
}
// &#229;&#241;&#235;&#232; Edit
if (tmpStr2.Pos("Edit") > 0)
{
ed = (TEdit*)FindComponent(Application->Components->Components[j]->Name);
tmpStr2 = "rs"+Application->Components->Name+"_"+ed->Name+"_Text \""+
ed->Text+"\"";
Memo3->Lines->Add(tmpStr2);
continue;
}
// &#229;&#241;&#235;&#232; Button
if (tmpStr2.Pos("TButton") > 0)
{
btn = (TButton*)FindComponent(Application->Components->Components[j]->Name);
tmpStr2 = "rs"+Application->Components->Name+"_"+btn->Name+"_Caption \""+
btn->Caption+"\"";
Memo3->Lines->Add(tmpStr2);
continue;
}
// &#229;&#241;&#235;&#232; CheckBox
if (tmpStr2.Pos("TCheckBox") > 0)
{
chb = (TCheckBox*)FindComponent(Application->Components->Components[j]->Name);
tmpStr2 = "rs"+Application->Components->Name+"_"+chb->Name+"_Caption \""+
chb->Caption+"\"";
Memo3->Lines->Add(tmpStr2);
continue;
}
// &#229;&#241;&#235;&#232; RadioButton
if (tmpStr2.Pos("TRadioButton") > 0)
{
rb = (TRadioButton*)FindComponent(Application->Components->Components[j]->Name);
tmpStr2 = "rs"+Application->Components->Name+"_"+rb->Name+"_Caption \""+
rb->Caption+"\"";
Memo3->Lines->Add(tmpStr2);
continue;
}

} // end of for
}
}
//
for (i=0; i<Memo2->Lines->Count; i++)
{
tmpStr = Memo2->Lines->Strings + " "+IntToStr(i+1);
Memo2->Lines->Strings = tmpStr;
}

}

Его задача перебрать все компоненты на всех формах и собрать их
Captionы, Textы и т.д.
Работает если на 1-й и 2-формах есть компоненты с одинаковыми именами. Или если есть на 1-й но нет на 2-й.
Если же есть компоненты одного класса но разных имен, то вылезает Ексепшн.
Помогите?

Заранее спасибо
288
13 ноября 2008 года
nikitozz
1.2K / / 09.03.2007
Оформляйте исходник по правилам. Читать неудобно.
288
13 ноября 2008 года
nikitozz
1.2K / / 09.03.2007
FindComponent - это функция унаследованная от TComponent. В вашем коде он вызывается для Form1. Соотвественно когда вы просматриваете компоненты второй формы вызов FindComponent возвращает NULL, если конечно на первой форме нет компонента с таким же именем. Отсюда и исключение.
Вообщем исправьте на
 
Код:
Application->Components->FindComponent(.......);
2.3K
13 ноября 2008 года
ART-CODE
134 / / 15.11.2004
Посмотри простой пример - может где пригодится:

Код:
String SenderInfo="";

TObject* Sender=(TObject*)Application->Components->FindComponent(.......);

 if(IsPublishedProp(Sender, "Caption"))
                        {
                        SenderInfo=GetStrProp(Sender, "Caption");
                        }
 if(IsPublishedProp(Sender, "Text"))
                        {
                        SenderInfo=SenderInfo+" "+GetStrProp(Sender, "Text");
                        }

ShowMessage(SenderInfo);
25K
13 ноября 2008 года
TheMustafa
33 / / 08.09.2008
Всем большое спасибо. Разобрался
490
13 ноября 2008 года
frid-karatel
357 / / 15.09.2007
Да и вообще - закинь перебор компонентов в функцию, например так:
 
Код:
void GetSubComponents(TComponent *Parent) {[
  /*
    Здесь перебирай подкомпоненты компонента Parent
    Это избавит тебя от кода вида Application->Components->Components[j]->Components[k];
  */
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог