Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

Вопрос по клонированию   Найти похожие ветки 

 
49 Cent   (2006-05-02 16:32) [0]

С помощью такого кода создаю 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 16:35) [1]

Понимаю, что вопрос не умно сформулирован, поэтому доп-но еще маленький простодушный комментарий.

Когда есть одна картинка и она точна известна, то ее можно управлять по простому: к примеру rotateimage1.angel:=90;
А если картинка сгенерирована в Run time, то фиг его знает как к ней обращаться! Подскажите, а?

Заранее благодарен.


 
KilkennyCat ©   (2006-05-02 16:37) [2]

Понятно. В этом случае я бы просто работал с TBitMap. Алгоритмов поворотов и прочей трансформаций в сети тьма-тьмущая.


 
49 Cent   (2006-05-02 16:40) [3]

Ну, признаться, я ламос и с Bitmap работать не умею да и текущий вариант меня бы очень устроили если бы возможность поворачивать клонированную картинку.


 
KilkennyCat ©   (2006-05-02 16:46) [4]

Пример работы с битмапом:

var
BitMap1,BitMap2 : TBitMap;
MyFormat : Word;
begin
  BitMap2 := TBitMap.Create;
  BitMap1 := TBitMap.Create;
try
  BitMap1.LoadFromFile("c:\Program Files\common Files\Borland Shared\Images\Splash\256color\factory.bmp");
  BitMap2.Assign(BitMap1);     // Copy BitMap1 into BitMap2
  BitMap2.Dormant;             // Free up GDI resources
  BitMap2.FreeImage;           // Free up Memory.
  Canvas.Draw(20,20,BitMap2);  // Note that previous calls don"t lose the image

  BitMap2.Monochrome := true;
  Canvas.Draw(80,80,BitMap2);
  BitMap2.ReleaseHandle;       // This will actually lose the bitmap;
finally
  BitMap1.Free;
  BitMap2.Free;
end;
end;

так что, все очень просто. можно грузить картинку из файла, ресурса, потока. Можно рисовать и конвертировать как угодно.


 
ЛшдлуттнСфе   (2006-05-02 16:46) [5]

примечание: пример из стандартной справки Делфи.


 
49 Cent   (2006-05-02 16:49) [6]

Вопросов нет! Круто! НО программа почти написана. Куча манипуляций заточенно именно на Rotateimage и на клонирование... наверняка должно быть решение задачи.


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

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

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

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


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


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


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


 
Zeqfreed ©   (2006-05-02 17:13) [9]

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


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


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

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


 
KilkennyCat ©   (2006-05-02 17:25) [11]

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

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


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

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


 
KilkennYcat ©   (2006-05-02 17:36) [13]

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

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


 
Zeqfreed ©   (2006-05-02 17:37) [14]

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


 
Zeqfreed ©   (2006-05-02 17:38) [15]

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


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


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


почему?


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

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


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


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

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


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

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

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


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


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


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


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


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


 
Zeqfreed ©   (2006-05-02 18:02) [20]

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

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


 
Zeqfreed ©   (2006-05-02 18:03) [21]

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

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;


 
KilkennyCat ©   (2006-05-02 18:05) [22]


> Zeqfreed ©   (02.05.06 18:03)


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


 
Zeqfreed ©   (2006-05-02 18:08) [23]

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


 
Zeqfreed ©   (2006-05-02 18:11) [24]

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


 
Glex ©   (2006-05-02 18:52) [25]

1. Tag?
2. TComponentList?


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

2 Zeqfreed и KilkennyCat

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.046 c
4-1141325287
NightLord
2006-03-02 21:48
2006.05.21
Вывод на рабочий стол


9-1129046372
Kerk
2005-10-11 19:59
2006.05.21
[GDI] Полупрозрачная надпись


15-1145563231
~ dancer ~
2006-04-21 00:00
2006.05.21
Реестр


3-1143615822
vopros
2006-03-29 11:03
2006.05.21
Если requestlive=true будет ли такой запрос доступен для редактир


9-1129234201
$noopy.MC
2005-10-14 00:10
2006.05.21
Зацените игруху мою (openGL)