Дельфи:Можно создать ком-нт timage в ходе работы программы?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Мне нужно создать n-ое количество компонентов timage после запуска программы, тк изначально n неизвестно(n грузятся из dat файла). Я пробывала писать что-то типа:
var temp;
begin
temp:=timage.create;
temp.left:=...
temp.top:=...
....
end;
только это не проходит. Такую задачу можно выполнить? Как? Можно так же поступить с другими компонентами?
var temp;
begin
temp:=timage.create;
temp.left:=...
temp.top:=...
....
end;
только это не проходит. Такую задачу можно выполнить? Как? Можно так же поступить с другими компонентами?
вроде как
var
temp : TImage;
begin
temp:=timage.create(self);
должно работать
var
temp : TImage;
begin
temp:=timage.create(self);
должно работать
Можно попробовать хранить их в динамическом массиве...
Честно говоря я не пробовал но...
uses ..... ExtCtrls;
.....
My: Images array of TImage;
Begin
.... Использование
End;
Честно говоря я не пробовал но...
uses ..... ExtCtrls;
.....
My: Images array of TImage;
Begin
.... Использование
End;
А сколько свойств надо дать? Как создать картинку(кнопку/едит/мемо) по готовому обьекту?
- 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;
Все работает! Спасибо огромное.
я такая глупая
как создавать страницы для PageControl в ходе работы программы???
Ответте, пожалуйста.

как создавать страницы для 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;
решила немного модифицировать код:
во время вывполнения пороцедуры freeactivepage иногда(!!!) происходит ошибка. либо Абстракт еррор либо ошибка в тредесятом блоке. почему и как ее исправить?
Код: Выделить всё
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;
- 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 этой кнопки.
И все получится.
Bo-вторых, я бы порекомендовал сделать b.parent:=self т.е. положить кнопку на форму, а не на закладки. Когда убиваются закладки, убивается и кнопка, в результате получается, что объект (кнопка) убивается во время работы собственного же метода (обычного метода - не деструктора).
Это все равно, что рубить сук на котором сидишь. Продолжая аналогию - иногда можно успеть спрыгнуть, а иногда и нет. Вот Вам и неустойчивая ошибка!
Одно из двух:
1) либо кладите кнопку на форму,
2) либо создайте свое определение TMyTabSheet, порождая его от TTabSheet. Переопределите конструктор (Create), добавьте туда создание дочернего объекта (кнопки, например), а в переопределенном деструкторе (Destroy) вызывайте Free этой кнопки.
И все получится.