Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2011, 00:11   #1
saltonik
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 12
По умолчанию программно созданные shape

здравствуйте! у меня такой вопрос.
программно создается n-ное количество shape-ов. а как потом работать с ними. например мне нужно по отдельности их использовать. какое у них будет name? shape у всех?

Код:
for i:=1 to n do
begin
Shape:=TShape.Create(Form3);
Shape.Parent:=Form3;
shape.left:=250;
shape.top:=500;
shape.height:= 20;
shape.width:= 40;
shape.onmousedown:= ShapeMouseDown;
shape.onmousemove:= ShapeMousemove;
shape.onmouseup:= ShapeMouseup;
end;
saltonik вне форума Ответить с цитированием
Старый 03.04.2011, 13:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

saltonik
сейчас проверил
(перебрал через
Код:
  for k:=0 to Form3.ComponentCount-1 do
     if Form3.Components[k] is TShape then
         Memo1.Lines.Append(TShape(Form1.Components[k]).Name);
так вот. Вы будете смеяться, но всем им присвоилось ПУСТОЕ имя.

Поэтому, если Вы для чего-то нужно имя (ну и для удобства/красоты не помешает!)
добавьте в Ваш код присвоение имени:
Код:
for i:=1 to n do
begin
Shape:=TShape.Create(Form3);
Shape.Name := 'MyShape'+IntToStr(i);
Shape.Parent:=Form3;
....

Добавлено
позвольте ещё небольшое лирическое отступление...
А ещё, как и многих других VCL компонентов у TShape есть такое поле:
.Tag : Integer;
туда можно писать что угодно (целые числа, разумеется!) и потом использовать очень просто.
Т.е. при создании Вы пишете:
shape.Tag := i;
потом, в процедуре, например, на OnClick :
if TShape(Sender).Tag = 1 then ... или
case TShape(Sender).Tag of
1: 'нажали первый шейп'
2: 'второй' ...

Последний раз редактировалось Serge_Bliznykov; 03.04.2011 в 13:13.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2011, 13:55   #3
saltonik
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
saltonik
сейчас проверил
(перебрал через
Код:
  for k:=0 to Form3.ComponentCount-1 do
     if Form3.Components[k] is TShape then
         Memo1.Lines.Append(TShape(Form1.Components[k]).Name);
так вот. Вы будете смеяться, но всем им присвоилось ПУСТОЕ имя.

Поэтому, если Вы для чего-то нужно имя (ну и для удобства/красоты не помешает!)
добавьте в Ваш код присвоение имени:
Код:
for i:=1 to n do
begin
Shape:=TShape.Create(Form3);
Shape.Name := 'MyShape'+IntToStr(i);
Shape.Parent:=Form3;
....

Добавлено
позвольте ещё небольшое лирическое отступление...
А ещё, как и многих других VCL компонентов у TShape есть такое поле:
.Tag : Integer;
туда можно писать что угодно (целые числа, разумеется!) и потом использовать очень просто.
Т.е. при создании Вы пишете:
shape.Tag := i;
потом, в процедуре, например, на OnClick :
if TShape(Sender).Tag = 1 then ... или
case TShape(Sender).Tag of
1: 'нажали первый шейп'
2: 'второй' ...
Код:
for i:=1 to n do
begin
Shape:=TShape.Create(Form3);
Shape.Parent:=Form3;
shape.left:=250;
shape.top:=500;
shape.height:= 20;
shape.width:= 40;
Shape.tag:=i;
shape.onmousedown:= ShapeMouseDown;
shape.onmousemove:= ShapeMousemove;
shape.onmouseup:= ShapeMouseup;
end;
Код:

procedure TForm3.Timer1Timer(Sender: TObject);
begin
      case TShape(Sender).Tag of
1:  shape.left:= shape.left+100;
2:   shape.left:=shape.left+200;
end;
end;
вот так исправила, все равно не выходит(( а если через name делаю, то в процедуре таймера пишет что shape1 не объявленная переменная. что делать? помогите плиззз
saltonik вне форума Ответить с цитированием
Старый 03.04.2011, 16:35   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
ну таймер сработал. С чего Вы решили, что в этом обработчике таймера Sender - это какой-то Shape?! Он имеет какое-то отношение к таймеру?! В данном случае sender - это исключительно сам Timer1 (кстати, подобное прямое приведение типов Sender'а без проверки вполне может закончится Access Violation !!!
я же не зря писал - в процедуре "OnClick" (ну, размеется, имелось в виду, процедуре, назначенной на OnClick Shape, а не какой-то там абстрактный объект!

Поймите, в процедурах обработки событий (events) Sender - это всегда тот объект, который "возбудил" данное событие! (OnClick - на какой объект кликнули, OnMouseDown - на каком объекте нажали кнопкой мышки и т.д.)

Вам же предлагаю:
1) Создавайте Shape'ы с именами!
Код:
Shape.Name := 'MyShape'+IntToStr(i);
2) поиск компонента осуществляйте через FindComponent()
и проверяйте, нашлось ли что-нибудь, или нет.
В случае, если таймер сработает до того, как будут созданы Shape - будут проблемы.
примерно так можно искать Ваш Shape1:
Код:
var
  MyComponent: TComponent;
  i : integer;
begin
  for i:=1 to 3 do begin
    MyComponent := Form3.FindComponent('MyShape'+IntToStr(i));
    if MyComponent <> nil then
          TShape(MyComponent).Left := TShape(MyComponent).Left + 100;
 end; 
...


3) может быть, Вы всё же расскажите, какая у Вас исходная задача? Может быть, Вы вообще не так её решаете...

Последний раз редактировалось Serge_Bliznykov; 03.04.2011 в 16:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2011, 19:16   #5
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Все эти проблемы хорошо разобраны тут: http://www.delphikingdom.com/asp/vie...?catalogid=342
eduard93 вне форума Ответить с цитированием
Старый 04.04.2011, 08:11   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Создайте массив шэйпов и обращайтесь к ним как к итому элементу массива
Код:
shape[1]:=,shape[2]:=......
SERG1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делимся или вставляем свои программы созданные Капитан Софт 16 19.10.2010 07:29
Уничтожать созданные формы при закрытии? Как? TwiX Общие вопросы Delphi 4 09.04.2010 09:49
Pascal цикл с Shape.Left and Shape.Top BanzoO Помощь студентам 1 13.12.2009 21:47
события на динамически созданные кнопки. Gambler Компоненты Delphi 13 26.11.2009 10:43
Как изменять динамически созданные Label МаксMorfey Компоненты Delphi 2 03.01.2009 10:23