Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Создание объектов

Автор: Unconnected 8.06.2009 0:04

Привет всем.
Вопрос: как можно создать объект в выбранном месте формы? Я пробовал так:



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


И ничего не появляется..

Автор: Client 8.06.2009 0:07

Цитата
panel.parent:=form1;
добавь //или какая у тя форма

Автор: Unconnected 8.06.2009 0:10

Спасибо smile.gif

Автор: volvo 8.06.2009 0:11

Panel.Parent := self;

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

Автор: Unconnected 8.06.2009 0:48

Странная ситуация получается:



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 8.06.2009 1:02

  if panel1=nil then begin
// ...
end
else FreeAndNil(panel1); // если ты проверяешь на nil в начале - то вот так надо

Автор: Unconnected 8.06.2009 1:04

Спасибо, работает:)

Автор: Client 8.06.2009 1:05

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 9.06.2009 0:51

И ещё один вопрос, практически по теме... Вот создал я некоторое количество объектов, и вручную на какое-то событие этих объектов повесил одну и ту же процедуру. Как из процедуры можно узнать, на каком именно объекте сработало событие?

Автор: volvo 9.06.2009 0:54

А Sender на что? Он вообще-то и хранит информацию о вызвавшем событие объекте...

Автор: Unconnected 9.06.2009 1:08

blink.gif а я и не знал..sad.gif

Добавлено через 7 мин.
Но через Sender этот нельзя обратиться к методу\свойству источника события, так? Например, чтобы sender.caption:='...';

Автор: volvo 9.06.2009 1:22

У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:

  ShowMessage((Sender as TComponent).Name);
, и получить имя контрола, вызвавшего событие...

Автор: Unconnected 9.06.2009 15:31

Цитата
У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:

ShowMessage((Sender as TComponent).Name);

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


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

Автор: volvo 9.06.2009 16:36

Мы ничего ничему не присваиваем. Просто выводим окошко с названием компонента...

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

Автор: Unconnected 9.06.2009 16:55

Всё, теперь понял, спасибо за разъяснение:)

Автор: Unconnected 21.06.2009 23:53

Сегодня начала появляться ошибка, при создании объектов. Код такой:


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 22.06.2009 0:15

Странно, не должно быть проблем (на стандартных TPanel/TSpeedButton работает, проверил)... Но попробуй все-таки явно указать везде вместо Self класс твоей формы, может у тебя кнопка лежит на панель на какой-нибудь, и это дает такой результат (кнопка-то нестандартная, панель - тоже, мало ли что там наворотили).

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

Автор: Unconnected 22.06.2009 0:28

Извиняюсь за беспокойство, проблему нашёл, там у индекса было смещение, и я, как умная Маша, создавал несуществующий элемент массива-кнопку.