В старых компиляторах Borland / Embarcadero была ошибка компилятора, которая иногда вызывала это. Однако я нашел обходной путь:
, который, помимо прочего, также позволяет использовать присвоение так, как вы хотите снова ... Однако я сомневаюсь, что это все еще имеет место с новыми компиляторами, но все же стоит попробовать.
Если это не работает Существует еще один вариант, который я использовал, прежде чем нашел этот обходной путь. Вы должны создать функцию загрузки, которая возвращает ваш struct
(что-то вроде конструктора), а затем просто передать массив с ним ...
Здесь 2 варианта (оба работают на моем BDS2006 C ++, а также оба могут быть объединены вместе):
//---------------------------------------------------------------------------
// I assume your VCL form components ...
TLabel *LabelP1; TShape *Led1P1,*Led2P1,*Led3P1,*Led4P1,*Led5P1,*Led6P1,*Led7P1,*Led8P1,*Led9P1,*Led10P1;
TLabel *LabelP2; TShape *Led1P2,*Led2P2,*Led3P2,*Led4P2,*Led5P2,*Led6P2,*Led7P2,*Led8P2,*Led9P2,*Led10P2;
TLabel *LabelP3; TShape *Led1P3,*Led2P3,*Led3P3,*Led4P3,*Led5P3,*Led6P3,*Led7P3,*Led8P3,*Led9P3,*Led10P3;
TLabel *LabelP4; TShape *Led1P4,*Led2P4,*Led3P4,*Led4P4,*Led5P4,*Led6P4,*Led7P4,*Led8P4,*Led9P4,*Led10P4;
TLabel *LabelP5; TShape *Led1P5,*Led2P5,*Led3P5,*Led4P5,*Led5P5,*Led6P5,*Led7P5,*Led8P5,*Led9P5,*Led10P5;
// struct
struct pannello_t
{
String nome;
TLabel* labelNome;
TShape* ShapeLed[10];
};
// load function for style 2
pannello_t ld(String nome,TLabel* labelNome,TShape* S0,TShape* S1,TShape* S2,TShape* S3,TShape* S4,TShape* S5,TShape* S6,TShape* S7,TShape* S8,TShape* S9)
{
pannello_t a;
a.nome=nome;
a.labelNome=labelNome;
a.ShapeLed[0]=S0;
a.ShapeLed[1]=S1;
a.ShapeLed[2]=S2;
a.ShapeLed[3]=S3;
a.ShapeLed[4]=S4;
a.ShapeLed[5]=S5;
a.ShapeLed[6]=S6;
a.ShapeLed[7]=S7;
a.ShapeLed[8]=S8;
a.ShapeLed[9]=S9;
return a;
}
//---------------------------------------------------------------------------
void test()
{
// 1. style
pannello_t A[5]=
{
{"HCL-XXX", LabelP1, {Led1P1, Led2P1, Led3P1, Led4P1, Led5P1, Led6P1, Led7P1, Led8P1, Led9P1, Led10P1} },
{"HCL-XXX", LabelP2, {Led1P2, Led2P2, Led3P2, Led4P2, Led5P2, Led6P2, Led7P2, Led8P2, Led9P2, Led10P2} },
{"HCL-XXX", LabelP3, {Led1P3, Led2P3, Led3P3, Led4P3, Led5P3, Led6P3, Led7P3, Led8P3, Led9P3, Led10P3} },
{"HCL-XXX", LabelP4, {Led1P4, Led2P4, Led3P4, Led4P4, Led5P4, Led6P4, Led7P4, Led8P4, Led9P4, Led10P4} },
{"HCL-XXX", LabelP5, {Led1P5, Led2P5, Led3P5, Led4P5, Led5P5, Led6P5, Led7P5, Led8P5, Led9P5, Led10P5} },
};
// 2. style
pannello_t B[5];
B[0]=ld("HCL-XXX", LabelP1, Led1P1, Led2P1, Led3P1, Led4P1, Led5P1, Led6P1, Led7P1, Led8P1, Led9P1, Led10P1 );
B[1]=ld("HCL-XXX", LabelP2, Led1P2, Led2P2, Led3P2, Led4P2, Led5P2, Led6P2, Led7P2, Led8P2, Led9P2, Led10P2 );
B[2]=ld("HCL-XXX", LabelP3, Led1P3, Led2P3, Led3P3, Led4P3, Led5P3, Led6P3, Led7P3, Led8P3, Led9P3, Led10P3 );
B[3]=ld("HCL-XXX", LabelP4, Led1P4, Led2P4, Led3P4, Led4P4, Led5P4, Led6P4, Led7P4, Led8P4, Led9P4, Led10P4 );
B[4]=ld("HCL-XXX", LabelP5, Led1P5, Led2P5, Led3P5, Led4P5, Led5P5, Led6P5, Led7P5, Led8P5, Led9P5, Led10P5 );
}
//---------------------------------------------------------------------------
Помните, что если вы используете определение внутри объявления вашего массива, то назначаемые вами компоненты VCL уже должны указывать на созданные вами компоненты VCL. Если вы не можете гарантировать это, тогда единственные безопасные варианты либо передают массив во время выполнения, используя стиль 2 и функцию ld
, например, в конструкторе Form, либо вместо просто указателей используют указатель указателя ...
Также я видел, что у некоторых компиляторов есть проблемы с использованием struct (но не Borland), в таких случаях использование typedef помогает ...
typedef struct
{
String nome;
TLabel* labelNome;
TShape* ShapeLed[10];
} pannello_t;