IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Создание объектов
сообщение
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


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


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
panel.parent:=form1;
добавь //или какая у тя форма
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Спасибо smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Panel.Parent := self;

Чтоб не гадать, какая форма. Раз создается с Self-ом в качестве Owner-а, значит, ему и быть родителем...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


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 ещё?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






  if panel1=nil then begin
// ...
end
else FreeAndNil(panel1); // если ты проверяешь на nil в начале - то вот так надо
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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 то можно проверить ее положение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






А Sender на что? Он вообще-то и хранит информацию о вызвавшем событие объекте...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






У Sender нет свойства Caption, потому что у TEdit-а, например, его не может быть... Чтоб обратиться к Caption-у (если он есть у вызывающего контрола), надо привести Sender к нужному типу, если ты точно знаешь, контрол какого типа вызвал событие. Но зато можно сделать более универсально - так:
  ShowMessage((Sender as TComponent).Name);
, и получить имя контрола, вызвавшего событие...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

ShowMessage((Sender as TComponent).Name);

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


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






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

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


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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


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. Мол объект не может быть своим же родителем. Ошибка возникает на выделенной строке.
Причём до сегодня всё нормально отрабатывало..

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






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

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


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


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

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 11:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name