Форум: "Начинающим";
Текущий архив: 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.013 c