Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание объектов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Unconnected
Привет всем.
Вопрос: как можно создать объект в выбранном месте формы? Я пробовал так:


var panel:TSPanel;
begin
panel:=tsPanel.create(self);
panel.Top:=100;
panel.Left:=30;
panel.Height:=50;
panel.width:=50;
panel.show;
end;


И ничего не появляется..
Client
Цитата
panel.parent:=form1;
добавь //или какая у тя форма
Unconnected
Спасибо smile.gif
volvo
Panel.Parent := self;

Чтоб не гадать, какая форма. Раз создается с Self-ом в качестве Owner-а, значит, ему и быть родителем...
Unconnected
Странная ситуация получается:


procedure TForm1.sSpeedButton3Click(Sender: TObject);
begin
if panel1=nil then begin
panel1:=tPanel.create(self);
panel1.Top:=209;
panel1.Left:=135;
panel1.Height:=200;
panel1.width:=400;
panel1.color:=clwhite;
panel1.parent:=self;
panel1.show;
end
else panel1.Free;
end;


Первый раз жму на кнопку - панель появляется, ещё раз жму - исчезает, ещё раз жму - Invalid Pointer Operation (а должна опять появиться). Может, нужно использовать FreeAndNil ещё?
volvo
  if panel1=nil then begin
// ...
end
else FreeAndNil(panel1); // если ты проверяешь на nil в начале - то вот так надо
Unconnected
Спасибо, работает:)
Client
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if SpeedButton1.Down then begin
panel1:=tPanel.create(self);
panel1.Top:=209;
panel1.Left:=135;
panel1.parent:=self;
end
else panel1.Free;
end;
Если SpeedButton то можно проверить ее положение
Unconnected
И ещё один вопрос, практически по теме... Вот создал я некоторое количество объектов, и вручную на какое-то событие этих объектов повесил одну и ту же процедуру. Как из процедуры можно узнать, на каком именно объекте сработало событие?
volvo
А Sender на что? Он вообще-то и хранит информацию о вызвавшем событие объекте...
Unconnected
blink.gif а я и не знал..sad.gif

Добавлено через 7 мин.
Но через Sender этот нельзя обратиться к методу\свойству источника события, так? Например, чтобы sender.caption:='...';
volvo
У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:
  ShowMessage((Sender as TComponent).Name);
, и получить имя контрола, вызвавшего событие...
Unconnected
Цитата
У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:

ShowMessage((Sender as TComponent).Name);

, и получить имя контрола, вызвавшего событие...


Непонятно... Вот в этом коде мы чему присваиваем имя компонента? И как это поможет обратиться свойству\методу? Извиняюсь за возможно глупые вопросы, с этим никогда не сталкивался.
volvo
Мы ничего ничему не присваиваем. Просто выводим окошко с названием компонента...

Цитата
И как это поможет обратиться свойству\методу?
Повторяю: в общем случае обращение к свойству/методу невозможно. Оно становится возможным только, если ты гарантируешь, что вызывать событие будет компонент, у которого ЕСТЬ это свойство, и ты знаешь, каков ТИП этого компонента. Тогда достаточно сделать вот так (для кнопок):
  (Sender as TButton).Caption := 'test';
Но если теперь повесить это же событие на TEdit.OnClick (этого никто не запрещает делать, сигнатура у метода подходящая для OnClick любого компонента), то будет ошибка, так как TEdit нельзя провести к TButton, это разные классы, если повесить на TMemo.OnClick - то же самое, будет ошибка... И даже TLabel, несмотря на то, что там есть Caption, ты обработать не сможешь. У тебя вся функциональность этого события будет ограничена обработкой кнопок...
Unconnected
Всё, теперь понял, спасибо за разъяснение:)
Unconnected
Сегодня начала появляться ошибка, при создании объектов. Код такой:


var buts:array[1..sm] of tsSpeedButton;
panel1:tsPanel;

...

procedure TForm1.sSpeedButton3Click(Sender: TObject);
var i,i2:byte;
x:TPoint;
begin
if (panel1=nil) {and (clientsocket1.active)} then
begin
x.x:=2;
x.Y:=2;
sc:=0;
panel1:=tsPanel.create(self);
panel1.Top:=209;
panel1.Left:=47;
panel1.Height:=200;
panel1.width:=300;
panel1.borderstyle:=bsSingle;
panel1.parent:=self;
panel1.show;
for i:=1 to 6 do
begin
for i2:=1 to 9 do
begin
buts[sc]:=TsSpeedbutton.Create(self);
buts[sc].parent:=panel1; //<===
buts[sc].Left:=x.x;
buts[sc].Top:=x.y;
buts[sc].show;
buts[sc].Width:=30;
buts[sc].Height:=30;
buts[sc].Images:=imagelist2;
buts[sc].ImageIndex:=sc;
buts[sc].onclick:=form1.butsf;
buts[sc].Hint:=smiles[sc]; //добавил это
buts[sc].ShowHint:=true; //и это
inc(sc);
inc(x.x,32);
if sc=48 then break;
end;
inc(x.y,32);
x.x:=2;
end;
end
else freeandnil(panel1);
end;



Текст ошибки - a control cannot have itself as its parent. Мол объект не может быть своим же родителем. Ошибка возникает на выделенной строке.
Причём до сегодня всё нормально отрабатывало..
volvo
Странно, не должно быть проблем (на стандартных TPanel/TSpeedButton работает, проверил)... Но попробуй все-таки явно указать везде вместо Self класс твоей формы, может у тебя кнопка лежит на панель на какой-нибудь, и это дает такой результат (кнопка-то нестандартная, панель - тоже, мало ли что там наворотили).

Цитата
Причём до сегодня всё нормально отрабатывало..
Это еще более странно. Значит. рассказывай, что добавлял сегодня, что куда перемещал, может, перенес кнопку на какой-то GroupBox, или еще что-то, связанное с Parent-ом?
Unconnected
Извиняюсь за беспокойство, проблему нашёл, там у индекса было смещение, и я, как умная Маша, создавал несуществующий элемент массива-кнопку.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.