Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1145781398
ArtemESC
2006-04-23 12:36
2006.05.21
Помогите перевести...


3-1143344801
DevilDevil
2006-03-26 07:46
2006.05.21
Вопрос элементарный: как использовать псевдоним


6-1138373276
BSimon
2006-01-27 17:47
2006.05.21
Вопрос по TidHTTP (Indy)


3-1142927135
Lexiy
2006-03-21 10:45
2006.05.21
вставка данных в dbf


2-1146156377
Padre
2006-04-27 20:46
2006.05.21
прочитать 2 последние строчки текстового файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский