Текущий архив: 2007.10.21;
Скачать: CL | DM;
ВнизГоспода еще один вопрос , сделал я на форме массив компонентов Найти похожие ветки
← →
smartleds (2007-09-26 15:14) [0]Shape , каждый раз при нажатии кнопки прорисовывается на форме новый компонент Shape
var i:integer;
ArrOfShape:array of TShape;
procedure TForm1.Button3Click(Sender: TObject);
begin
i:=i+1;
SetLength(ArrOfShape,i);
ArrOfShape[i-1]:=TShape.Create(self);
ArrOfShape[i-1].Parent:=Form1;
ArrOfShape[i-1].Width:=20;
ArrOfShape[i-1].Height:=20;
ArrOfShape[i-1].Left:=X;
ArrOfShape[i-1].Top:=Y;
X:=X+40;
ArrOfShape[i-1].Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBar3.Position);
OnMouseUp:=Shape1MouseUp;
end;
У всех этих Shape разный цвет.
Теперь нужно кликнув мышкой на нужный Shape получить его цвет, как это сделать?
Остался один момент как
← →
Kolan © (2007-09-26 15:15) [1]Ну в
> Shape1MouseUp;
Получаешь цвет(Color).
← →
Вася Правильный (2007-09-26 15:17) [2]прочитать Brush.Color у сендера
← →
Германн © (2007-09-26 15:23) [3]
> smartleds (26.09.07 15:14)
О! Продвижение вперед уже очевидно. Вот бы еще выкинуть несколько ненужных глобальных переменных, так и совсем бы было хорошо.
← →
smartleds (2007-09-26 15:33) [4]Господа , глянте если не трудно , написал обработчик Shape1MouseUp
который считывает цвет, у выбранного Shape ?
Помогите разобраться как нужно указать с какого элемента Shape из массива ArrOfShape[] считывается цвет?
Я написал RGBmix:=Brush.Color; , но тут еще должен быть элнемент ArrOfShape на который кликнули мышью.
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
RGBmix:=Brush.Color;
R:=RGBmix mod 256;
G:=(RGBmix div 256) mod 256;
B:=RGBmix div 65536;
Memo1.Lines.Append("R="+Inttostr(R)+","+" "+
"G="+Inttostr(G)+","+" "+
"B="+Inttostr(B));
end;
← →
Германн © (2007-09-26 15:36) [5]
> Помогите разобраться как нужно указать с какого элемента
> Shape из массива ArrOfShape[] считывается цвет?
А пока никак не получится.
← →
Вася Правильный (2007-09-26 15:36) [6]как нужно указать с какого элемента Shape
еще раз - у сендера
← →
Kolan © (2007-09-26 15:37) [7]> но тут еще должен быть элнемент ArrOfShape на который кликнули
> мышью
Он у тебя есть!procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Обратится к нему можно так:
if Sender is TShape then
(Sender as TShape).Brush.Color
← →
Вася Правильный (2007-09-26 15:38) [8]и у тебя сработает не на клик (нажатие), а на ОТклик (отжатие)
← →
Германн © (2007-09-26 15:39) [9]
> Вася Правильный (26.09.07 15:36) [6]
Но сендер-то не знает пока какой у него индекс в массиве.
← →
Kolan © (2007-09-26 15:43) [10]
> Но сендер-то не знает пока какой у него индекс в массиве.
Ты прикалываешься? Зачем ему нужено знать «какой у него индекс в массиве»?
ЗЫ
Да и массив тоже не нужон в принципе.
← →
smartleds (2007-09-26 15:47) [11]Получилась так, но цвет считывается только у последнего Shape, и то только когда я кликаю на форму , а не на него.
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Sender is TShape then
RGBmix:=(Sender as TShape).Brush.Color;
R:=RGBmix mod 256;
G:=(RGBmix div 256) mod 256;
B:=RGBmix div 65536;
Memo1.Lines.Append("R="+Inttostr(R)+","+" "+
"G="+Inttostr(G)+","+" "+
"B="+Inttostr(B));
end;
end.
← →
Германн © (2007-09-26 15:49) [12]
> Ты прикалываешься? Зачем ему нужено знать «какой у него
> индекс в массиве»?
Нет. Отвечаю строго на вопрос.
← →
smartleds (2007-09-26 15:50) [13]Не, массив будет нужен потом , когда пользователь отрегулирует все цвета в Shapах , из этого массива Shapoв данные о цвете каждого Shape будут считаны и дальше на обработку.
← →
Германн © (2007-09-26 15:51) [14]
> smartleds (26.09.07 15:47) [11]
>
> Получилась так, но цвет считывается только у последнего
> Shape, и то только когда я кликаю на форму , а не на него.
>
Ну а чего ждать, если у тебя:
> OnMouseUp:=Shape1MouseUp;
>
← →
smartleds (2007-09-26 15:52) [15]Поэтому индекс массива мне нужен
← →
Kolan © (2007-09-26 15:56) [16]> Получилась так, но цвет считывается только у последнего
>
> > Shape, и то только когда я кликаю на форму , а не на него.
ArrOfShape[i-1].OnClick := ShepeClick;
нужен потом
Вот потом ибудешь узнавать индекс…
← →
smartleds (2007-09-26 16:02) [17]Kolan © Спасибо ОГРОМНОЕ Вы мне очень помогли, ВСЕ заработало!!!
← →
Kolan © (2007-09-26 16:11) [18]> Kolan © Спасибо ОГРОМНОЕ Вы мне очень помогли, ВСЕ заработало!
> !!
За огромное поработаю еще :)
Избавимся от глобальной I — Это всегда плохо.
var
ArrOfShape: array of TShape;procedure TForm1.Button3Click(Sender: TObject);
begin
SetLength(ArrOfShape, Length(ArrOfShape)+1);
ArrOfShape[High(ArrOfShape)]:=TShape.Create(self);
{…}
end;
Пройтись по масиву можно так:for I := Low(ArrOfShape) to High(ArrOfShape) do
ArrOfShape[I].{…}
← →
smartleds (2007-09-26 16:44) [19]Спасибо , из массива очень хорошо считывается.
Я еще сделал чтобы при клике на нужный Shape можно было изменить его цвет. Точнее так, выставить цвет при помощи трех TrackBar ов,(R,G,B) а потом закрасит нужный shape кликнув на нем мышкой.
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with (Sender as TShape) do begin
Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBar3.Position);
end;
end;
Теперь думаю как сделать чтобы кликнув на нужный Shape выделить его и при помощи Трэк баров установить цвет.
← →
Kolan © (2007-09-26 16:51) [20]> Теперь думаю как сделать чтобы кликнув на нужный Shape
> выделить его и при помощи Трэк баров установить цвет.
Как выделить визуально думай сам, а вот как сделать чтобы работало…
Заведи переменную типа TShape, сделай её полем формы:private
{ Private declarations }
FShape: TShape;
При клике запоминаем «кликнуты» шэйпprocedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Sender is TShape then
FShape := Sender as TShape;
end;
Все теперь у тебя есть сохраненный шэйп.
При изменении TrackBar делай так:if Assigned(FShape) then
FShape.Brush.Color := {…}
PSwith (Sender as TShape) do begin
Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBar3.Position);
end;
До приведения типа ((Sender as TShape)) надо проверять что это действительно он.
То естьif (Sender is TShape) then
← →
smartleds (2007-09-26 16:53) [21]Т.е вопрос в том, как в процедуре Shape1MouseUp получить индекс выделенного Shape, если я это буду знать тогда в обработчике трэк бара
напишу
ArrOfShape[index].Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBa r3.Position);
Только не совсем понятно как выделить переменную index
← →
smartleds (2007-09-26 16:56) [22]Все понял спасибо, все что писал в [21] это я еще Ваше сообщение не читал
← →
icWasya © (2007-09-26 16:58) [23]А вот после
ArrOfShape[i-1]:=TShape.Create(self);
сделай
ArrOfShape[i-1].tag:=i-1;
и у Sender"а Tag будет равен нужному индексу
← →
Anatoly Podgoretsky © (2007-09-26 16:58) [24]Индекс можешь получить просканировав массив и сравнить с Sender
← →
smartleds (2007-09-26 17:07) [25]Все работает замечательно, ОЧЕНЬ ВАМ признателен!
← →
Malik © (2007-09-26 17:44) [26]Ма держи
...
procedure Button3Click(Sender: TObject);
procedure ShapeMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y:Integer);
...
var {Form var"s}
Shapes: array of TShape;
...
procedure TForm1.Button3Click(Sender: TObject);
var m:cardinal;
begin
m:=length(Shapes);//определяем длинну
SetLength(shapes,m+1);//задаем длинну
Shapes[m]:=TShape.Creat(self);
with Shapes[m] do begin
Parent:=Form1;
Width:=20;
Height:=20;
Left:=X;
Top:=Y;
Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBar3.Position);
OnMouseUp:=ShapeMouseUp;
end;
X:=X+40;
end;
....
pocedure ThisIMustDoWithShapeWithPressed(Shp:TShape;i:cardinal);
{Здесь соотвественно Shp и i нашатая Shape и её номер в массиве}
begin
end;
....
procedure ShapeMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y:Integer);
var i:cardinal;
begin
for i:=0 to length(Shapes) do begin
if Shapes[i]=Sender then begin
ThisIMustDoWithShapeWithPressed(Shapes[i],i);
end;
end;
end;
...
← →
Kolan © (2007-09-26 17:46) [27]> Ма держи
Ну и зачем искать в цикле то, что уже дадено в Sender?
← →
Malik © (2007-09-26 17:48) [28]
> Kolan © (26.09.07 17:46) [27]
>
> > Ма держи
>
> Ну и зачем искать в цикле то, что уже дадено в Sender?
Он же написал:
> smartleds (26.09.07 15:52) [15]
>
> Поэтому индекс массива мне нужен
>
← →
Kolan © (2007-09-26 17:52) [29]> ThisIMustDoWithShapeWithPressed
Тогда уж
ThisIsWhatIMustDoWithShapePressed :)
← →
Malik © (2007-09-26 17:58) [30]Сори опечатка)))
ThisIsThatIMustDoWithShapeWhichPressed
← →
Kolan © (2007-09-26 18:01) [31]> ThisIsThatIMustDoWithShapeWhichPressed
ThisIsWhatIMustDoWithTheShapeWhichIsCurrentlyPressed
That — нправильно
Получается
вот то я должен сделать
а
надо
вот что я должен сделать
← →
smartleds (2007-09-26 18:16) [32]ОГРОМНОЕ спасибо ВСЕМ за помощь в голове многое прояснилось!
← →
Германн © (2007-09-26 18:29) [33]
> icWasya © (26.09.07 16:58) [23]
Вот наконец и про бирку вспомнили :-)
← →
Германн © (2007-09-27 03:41) [34]
> Kolan © (26.09.07 16:11) [18]
>
> > Kolan © Спасибо ОГРОМНОЕ Вы мне очень помогли, ВСЕ заработало!
>
> > !!
>
>
> За огромное поработаю еще :)
За огромное стОит поработать побольше! :-)
От глобальной i избавились. Теперь на подходе X и Y. Справишься?
:-)
Страницы: 1 вся ветка
Текущий архив: 2007.10.21;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.127 c