Дельфи:Можно создать ком-нт timage в ходе работы программы?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
allo4la
Сообщения: 15
Зарегистрирован: 02 авг 2004, 11:48

Мне нужно создать n-ое количество компонентов timage после запуска программы, тк изначально n неизвестно(n грузятся из dat файла). Я пробывала писать что-то типа:

var temp;
begin
temp:=timage.create;
temp.left:=...
temp.top:=...
....
end;
только это не проходит. Такую задачу можно выполнить? Как? Можно так же поступить с другими компонентами?
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

вроде как
var
temp : TImage;
begin
temp:=timage.create(self);
должно работать
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

Можно попробовать хранить их в динамическом массиве...
Честно говоря я не пробовал но...


uses ..... ExtCtrls;
.....
My: Images array of TImage;
Begin
.... Использование
End;
allo4la
Сообщения: 15
Зарегистрирован: 02 авг 2004, 11:48

А сколько свойств надо дать? Как создать картинку(кнопку/едит/мемо) по готовому обьекту?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Я пробывала писать что-то типа:

var temp;
begin
temp:=timage.create;
temp.left:=...
temp.top:=...
....
end;
Почти правильно. Проблема как я понял в том, что картинки не появляются на форме.
Для этого нужно create(self) - т.е. форма будет их владельцем (owner) и освободит память, занимааемую ими, перед тем как сама будет разрушена. И еще надо указать, какой win-контрол будет являться родительским окном для созданного temp:TIMage. Т.е. temp.parent=<а вот тут Form1 или Panel2>;. Т.е. указываем на кого этот temp надо положить. Теперь понятно, что temp.left - это будет координата внутри формы, или панели и еще чего-нибудь.

Вообще это можно поставить в цикл:

Код: Выделить всё

for i:=1 to ... do begin
  ...
  temp:=TIMage.create(self);  //self пишется, если это внутри метода формы, иначе владельца надо указать явно
  temp.left:=... ;
  temp.top:=... ;
  temp.parent:=... ;
  ...
end;
allo4la
Сообщения: 15
Зарегистрирован: 02 авг 2004, 11:48

Все работает! Спасибо огромное.
allo4la
Сообщения: 15
Зарегистрирован: 02 авг 2004, 11:48

я такая глупая :(
как создавать страницы для PageControl в ходе работы программы???
Ответте, пожалуйста.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  sh:TTabSheet;
begin
  sh:=TTabSheet.Create(self);
  with sh do begin
    Caption := 'XXX';
    PageControl := PageControl1;
  end;
end;
Т.е. надо создать страницу, а потом сказать ей, кто у нее хозяин.
allo4la
Сообщения: 15
Зарегистрирован: 02 авг 2004, 11:48

решила немного модифицировать код:

Код: Выделить всё

var globalnumber:integer=1;
procedure TForm1.freeactivepage(sender:tobject);
begin
Pagecontrol1.ActivePage.Destroy;
//или Pagecontrol1.ActivePage.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  sh:TTabSheet;
  b:tbutton;
begin
  sh:=TTabSheet.Create(self);
  b:=tbutton.Create(self);
  b.Parent:=sh;
  b.Caption:='destroy';
  b.OnClick:=freeactivepage;
  with sh do begin
    Caption := inttostr(globalnumber);
    inc(globalnumber);
    PageControl := PageControl1;
  end;
end;
во время вывполнения пороцедуры freeactivepage иногда(!!!) происходит ошибка. либо Абстракт еррор либо ошибка в тредесятом блоке. почему и как ее исправить?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Во-первых: "Do not call Destroy directly in an application.". Поэтому ТОЛЬКО FREE!

Bo-вторых, я бы порекомендовал сделать b.parent:=self т.е. положить кнопку на форму, а не на закладки. Когда убиваются закладки, убивается и кнопка, в результате получается, что объект (кнопка) убивается во время работы собственного же метода (обычного метода - не деструктора).
Это все равно, что рубить сук на котором сидишь. Продолжая аналогию - иногда можно успеть спрыгнуть, а иногда и нет. Вот Вам и неустойчивая ошибка!

Одно из двух:
1) либо кладите кнопку на форму,
2) либо создайте свое определение TMyTabSheet, порождая его от TTabSheet. Переопределите конструктор (Create), добавьте туда создание дочернего объекта (кнопки, например), а в переопределенном деструкторе (Destroy) вызывайте Free этой кнопки.
И все получится.
Ответить