![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Господа еще один вопрос , сделал я на форме массив компонентов
smartleds © (2007-09-26 15:14:00)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 получить его цвет, как это сделать?
Остался один момент как
Германн (2007-09-27 03:41:00) [1]
> Kolan © (26.09.07 16:11) [18]
>
> > Kolan © Спасибо ОГРОМНОЕ Вы мне очень помогли, ВСЕ заработало!
>
> > !!
>
>
> За огромное поработаю еще :)
За огромное стОит поработать побольше! :-)
От глобальной i избавились. Теперь на подходе X и Y. Справишься?
:-)
Германн (2007-09-26 18:29:00) [2]
> icWasya © (26.09.07 16:58) [23]
Вот наконец и про бирку вспомнили :-)
smartleds (2007-09-26 18:16:00) [3]ОГРОМНОЕ спасибо ВСЕМ за помощь в голове многое прояснилось!
Kolan (2007-09-26 18:01:00) [4]> ThisIsThatIMustDoWithShapeWhichPressed
ThisIs WhatIMustDoWith TheShapeWhich IsCurrentlyPressed
That нправильно
Получается
вот то я должен сделать
а
надо
вот что я должен сделать
Malik (2007-09-26 17:58:00) [5]Сори опечатка)))
ThisIsThatIMustDoWithShapeWhichPressed
Kolan (2007-09-26 17:52:00) [6]> ThisIMustDoWithShapeWithPressed
Тогда уж
ThisIsWhatIMustDoWithShapePressed :)
Malik (2007-09-26 17:48:00) [7]
> Kolan © (26.09.07 17:46) [27]
>
> > Ма держи
>
> Ну и зачем искать в цикле то, что уже дадено в Sender?
Он же написал:
> smartleds (26.09.07 15:52) [15]
>
> Поэтому индекс массива мне нужен
>
Kolan (2007-09-26 17:46:00) [8]> Ма держи
Ну и зачем искать в цикле то, что уже дадено в Sender?
Malik (2007-09-26 17:44:00) [9]Ма держи
...
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;
...
smartleds (2007-09-26 17:07:00) [10]Все работает замечательно, ОЧЕНЬ ВАМ признателен!
Anatoly Podgoretsky (2007-09-26 16:58:00) [11]Индекс можешь получить просканировав массив и сравнить с Sender
icWasya (2007-09-26 16:58:00) [12]А вот после
ArrOfShape[i-1]:=TShape.Create(self);
сделай
ArrOfShape[i-1]. tag:=i-1;
и у Sender'а Tag будет равен нужному индексу
smartleds (2007-09-26 16:56:00) [13]Все понял спасибо, все что писал в [21] это я еще Ваше сообщение не читал
smartleds (2007-09-26 16:53:00) [14]Т.е вопрос в том, как в процедуре Shape1MouseUp получить индекс выделенного Shape, если я это буду знать тогда в обработчике трэк бара
напишу
ArrOfShape[index].Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBa r3.Position);
Только не совсем понятно как выделить переменную index
Kolan (2007-09-26 16:51:00) [15]> Теперь думаю как сделать чтобы кликнув на нужный 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 := { }
PS
with (Sender as TShape) do begin
Brush.Color:=RGB(TrackBar1.Position,TrackBar2.Position,TrackBar3.Position);
end;
До приведения типа ((Sender as TShape)) надо проверять что это действительно он.
То естьif (Sender isTShape) then
smartleds (2007-09-26 16:44:00) [16]Спасибо , из массива очень хорошо считывается.
Я еще сделал чтобы при клике на нужный 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:11:00) [17]> 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:02:00) [18]Kolan © Спасибо ОГРОМНОЕ Вы мне очень помогли, ВСЕ заработало!!!
Kolan (2007-09-26 15:56:00) [19]> Получилась так, но цвет считывается только у последнего
>
> > Shape, и то только когда я кликаю на форму , а не на него.
ArrOfShape[i-1].OnClick := ShepeClick;
нужен потом
Вот потом ибудешь узнавать индекс
smartleds (2007-09-26 15:52:00) [20]Поэтому индекс массива мне нужен