Консультация № 109812
17.11.2007, 10:12
0.00 руб.
0 3 3
Здрасте. Как правильно в C++ Builder программно создать массив TImage. Делал так:
TImage *Im[5];
Im[0]->Picture->LoadFromFile("2.gif");
При компиляции выдает ошибку.
Обязательно ли указывать Parent этого массива? И как правильно указать для массива?

Обсуждение

Неизвестный
17.11.2007, 12:16
общий
это ответ
Здравствуйте, RussianGM!

Ну еще б не выдавал ошибку:)) Вы создали массив указателей объектов TImage и пытаетесь к этим объектам обратиться) Предварительно НЕ создав ни один из них))
Грубо говоря адресуемся туда, не знаем куда)

Предварительно вам все таки нужно эти 5 объектов создать и присвоить им владельца (хотя тут не обязательно) ;)

Второй шаг, раз TImage являются визуальными объектами, им само собой следует присвоить родителя (Parent), чтобы эти компоненты отрисовались, иначе вы их нигде не увидите;)

Ну а далее - стандартные манипуляции...

З.Ы. Освобождать память из под них (delete) НЕ нужно, т.к. родитель их сам удалит, при уничтожении самого себя. (особенности VCL).

Пример в приложении...

Успехов!

Приложение:
TImage *Im[5]; int Top = 0, Left = 0; for(int i = 0; i < 5; i++) { Im[i] = new TImage(Form1); //Выделяем память под объект и автоматически передаем в конструктор указатель на владельца (пусть это будет форма Form1) Im[i]->Parent = Form1; //Назначаем родителем нашу форму Form1 //Далее манипуляции по желанию... Im[i]->Picture->LoadFromFile("pic.gif"); Im[i]->Left = Left; Im[i]->Top = Top; Top += 10; Left += 10; }
Неизвестный
17.11.2007, 14:15
общий
это ответ
Здравствуйте, RussianGM!
Можно попробывать так
TImage Im[5];
Im[0].Picture->LoadFromFile("2.gif");
Удачи!

Неизвестный
17.11.2007, 14:27
общий
это ответ
Здравствуйте, RussianGM!
Не зависимо от того, с помощью какого инструментария вы собираете программу на C++,
все массивы в С++ объявляются одинаково. Массив вы указали совершенно правильно,
указав тип, идентификатор и размер массива. И компилятор "ругается" не по этому.
Вы объявили массив указателей на класс TImage. Но не создали сами объекты данного
типа. Специфика библиотеки VCL (основная библиотека BCB) в том, что компилятор не
размещает в памяти статические объекты этой библиотеки. Вы можете объявлять
только указатели на типы (классы) и затем выделять под них память с помощью оператора
new. Вот так может выглять ваш рабочий пример:

TImage *Im[5];
// выделяем память под все объекты типа TImage
for (int i=0; i<sizeof(Im)/sizeof(Im[0]); i++) {
// здесь в конструкторе указываем указатель на объект класса - "oтветственного"
Im[i]= new TImage(Form1);
// за уничтожение объекта TImage
Im[i]->Parent=Form1; // если хотим - чтобы картинка показалась на форме Form1
... // здесь можно вставить код, в котором укажем координаты картинки // и др.
}
Im[0]->Picture->LoadFromFile("2.gif");

А вообще настоятельно посоветовал бы вам почитать любую литературу по C++, в том числе и по работе в Builder.
Форма ответа