Привет всем.
Вопрос: как можно создать объект в выбранном месте формы? Я пробовал так:
var panel:TSPanel;
begin
panel:=tsPanel.create(self);
panel.Top:=100;
panel.Left:=30;
panel.Height:=50;
panel.width:=50;
panel.show;
end;
Спасибо
Panel.Parent := self;
Странная ситуация получается:
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;
if panel1=nil then begin
// ...
end
else FreeAndNil(panel1); // если ты проверяешь на nil в начале - то вот так надо
Спасибо, работает:)
procedure TForm1.SpeedButton1Click(Sender: TObject);Если SpeedButton то можно проверить ее положение
begin
if SpeedButton1.Down then begin
panel1:=tPanel.create(self);
panel1.Top:=209;
panel1.Left:=135;
panel1.parent:=self;
end
else panel1.Free;
end;
И ещё один вопрос, практически по теме... Вот создал я некоторое количество объектов, и вручную на какое-то событие этих объектов повесил одну и ту же процедуру. Как из процедуры можно узнать, на каком именно объекте сработало событие?
А Sender на что? Он вообще-то и хранит информацию о вызвавшем событие объекте...
а я и не знал..
Добавлено через 7 мин.
Но через Sender этот нельзя обратиться к методу\свойству источника события, так? Например, чтобы sender.caption:='...';
У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:
ShowMessage((Sender as TComponent).Name);, и получить имя контрола, вызвавшего событие...
Мы ничего ничему не присваиваем. Просто выводим окошко с названием компонента...
(Sender as TButton).Caption := 'test';Но если теперь повесить это же событие на TEdit.OnClick (этого никто не запрещает делать, сигнатура у метода подходящая для OnClick любого компонента), то будет ошибка, так как TEdit нельзя провести к TButton, это разные классы, если повесить на TMemo.OnClick - то же самое, будет ошибка... И даже TLabel, несмотря на то, что там есть Caption, ты обработать не сможешь. У тебя вся функциональность этого события будет ограничена обработкой кнопок...
Всё, теперь понял, спасибо за разъяснение:)
Сегодня начала появляться ошибка, при создании объектов. Код такой:
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;
Странно, не должно быть проблем (на стандартных TPanel/TSpeedButton работает, проверил)... Но попробуй все-таки явно указать везде вместо Self класс твоей формы, может у тебя кнопка лежит на панель на какой-нибудь, и это дает такой результат (кнопка-то нестандартная, панель - тоже, мало ли что там наворотили).
Извиняюсь за беспокойство, проблему нашёл, там у индекса было смещение, и я, как умная Маша, создавал несуществующий элемент массива-кнопку.