![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по клонированию
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;