Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по клонированию


Страницы:   1 2

49 Cent ©   (2006-05-02 16:32:00) 

С помощью такого кода создаю TRotateimage(обычный Image, только можно менять угол)
Fa:=TRotateimage.Create(Self);
Fa.Picture.LoadFromFile(IntToStr(i)+'.bmp');
Fa.OnMouseMove:=rotateimage1.OnMouseMove;
Fa.OnMouseUp:=rotateimage1.OnMouseUp;
Fa.OnMouseDown:=rotateimage1.OnMouseDown;
Fa.PopupMenu:=PopupMenu1;


Также есть PopupMenu1. В этом компоненте заложены 4 варианта положения картинки: 45,90,180,270 градусов.

Теоритически все должно смотреться следующим образом:
Юзер кликает на кнопку, происходит клонирование картинки, затем пользователь кликает на правую кнопку, всплывает менюшка PopupMenu и уже в этом меню пользователь выбирает нужный угол и как следствие клонированная картника поворачивается.

Вопрос собственно такой! Какой код может выполнить одну и туже задачу для только что кланированной картинки?


49 Cent   (2006-05-02 19:11:00) [1]

2 Zeqfreed и KilkennyCat

Спасибо! Громадный респект! Теперь очень модная программа получилась. :)


Glex   (2006-05-02 18:52:00) [2]

1. Tag?
2. TComponentList?


Zeqfreed   (2006-05-02 18:11:00) [3]

[23], точнее придется скорее наоборот, назначать обработчику пунка меню обработчик кнопки тулбара.


Zeqfreed   (2006-05-02 18:08:00) [4]

Назначаем нажатию на кнопку тулбар обработчик пункта меню ;)
Ну а отказаться и того легче :)


KilkennyCat   (2006-05-02 18:05:00) [5]


> Zeqfreed ©   (02.05.06 18:03)


ага. так красиво, но вот если придется отказаться от попапменю, или добавить возможность от тулбаттона....


Zeqfreed   (2006-05-02 18:03:00) [6]

Вот на всякий случай код моих изысканий. Работает :)

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TImage.Create(Self) do begin
  Top := 8;
  Left := 8;
  Canvas.FillRect(Canvas.ClipRect);
  Parent := Self;
  PopupMenu := PopupMenu1;
 end;
end;

{PopupMenu item click handler}
procedure TForm1.Clickme1Click(Sender: TObject);
begin
with ((Sender as TMenuItem).GetParentMenu as TPopupMenu) do begin
 if (PopupComponent is TImage) then
  with (PopupComponent as TImage) do begin
   Canvas.Brush.Color := clLime;
   Canvas.Ellipse(10, 10, 30, 30);
  end;
end;
end;


Zeqfreed   (2006-05-02 18:02:00) [7]

Да, несколько поторопился :)
Код будет несколько сложнее:

with ((Sender as TMenuItem).GetParentMenu as TPopupMenu) do begin
 if (PopupComponent is TRotateImage) then
  with (PopupComponent as TRotateImage) do begin
   angle := 90;
  end;
end;


ЛшдлуттнСфе   (2006-05-02 17:52:00) [8]


>  [17] Zeqfreed ©   (02.05.06 17:45)


Извини, неубедительно :) я не спорю, мне самому не нравится, неизящно...


> > N равен цифре в имени текущей картинке. Где его определять,
> >  думаю, проблем нет.
>
> Проблемы есть, т.к местами туп.


Ну как-то же известно, что эта картинка - текущая? Я не могу предполагать, в каком месте происходит выбор картинки.


49 Cent   (2006-05-02 17:49:00) [9]


> N равен цифре в имени текущей картинке. Где его определять,
>  думаю, проблем нет.

Проблемы есть, т.к местами туп.


> if (PopupComponent is TRotateImage) then (PopupComponent
> as TRotateImage).angle := 90;

Эээ... говорить, что не знает что такое PopupComponent

Уважаемые! Мы вот вот решим указанную задачу! Подскажите пож-та последний раз.


Zeqfreed   (2006-05-02 17:45:00) [10]

С одной стороны по моим религиозным соображениям. А с другой, медленно это и выглядит дико, ну не знаю. Способ [14], по моему скромному мнению, гораздо изящней. Зачем создавать что-то лишнее, если все что надо уже есть. Возможно, есть случаи где использование FindComponent оправдано, но они скорее не из «повседневной практики».


ЛшдуттнСфе   (2006-05-02 17:39:00) [11]


>  [15] Zeqfreed ©   (02.05.06 17:38)


почему?


Zeqfreed   (2006-05-02 17:38:00) [12]

P.S. Шаманить с именами и FindComponent не советую. Не здорово это %)


Zeqfreed   (2006-05-02 17:37:00) [13]

Можно хранить их в списке/массиве. Не имена только, а дескрипторы.
А можно (здесь будет вполне приемлемо) в обработчике щелчка по пункту меню:
if (PopupComponent is TRotateImage) then (PopupComponent as TRotateImage).angle := 90;
VCL все-таки не дураки писали :)


KilkennYcat   (2006-05-02 17:36:00) [14]

Имя по-любому давать надо, как же без имени-то?
Имя можно давать закономерное, Fa1, Fa2 и т.д
тогда TRotateImage(FindComponent('Fa' + inttostr(N))).angle := 90;

N равен цифре в имени текущей картинке. Где его определять, думаю, проблем нет.


49 Cent   (2006-05-02 17:30:00) [15]

Т.е получается мне нужно каждому клонированному объекту давать имя.... а как дальше искать? Например я сделал 10 картинок и у каждой свое имя... а затем я решил поменять угол 5 картинки? Как определить, что я вызвал Popupmenu именно 5 картинки?


KilkennyCat   (2006-05-02 17:25:00) [16]

с другой стороны, раз мы имеем имя Fa, то можно явно к нему обратиться
это раз.
проверка не происходит, потому как я забыл про попапменю...
предлагаю по имени:

TRotateImage(FindComponent(имя)).angle := 90


49 Cent   (2006-05-02 17:17:00) [17]


> if (Sender is TRotateImage) then (Sender as TRotateImage).
> angle := 90;

Ну...эээ... ничего не происходит!
Опыты показали, что не проходит проверку на этапе
if (Sender is TRotateImage)


Zeqfreed   (2006-05-02 17:13:00) [18]

Просто if (Sender is TRotateImage) then (Sender as TRotateImage).angle := 90;.


49 Cent   (2006-05-02 17:10:00) [19]


> procedure TForm1.N451Click(Sender: TObject);
> begin
> (TComponent(Sender) as TRotateimage).angle := 90;
> end;


Выдает ошибку! Говорит: "Invalid class typecast".


Лшдлуттнсфе   (2006-05-02 16:58:00) [20]

ага.
Почему тогда не написать так:

в обработчике события, вызывающего поворот:

(TComponent(Sender) as TRotateimage).angle := 90;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо