Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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;

нужен потом
Вот потом ибудешь узнавать индекс&#133


 
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);
 {&#133}

end;


Пройтись по масиву можно так:

for I := Low(ArrOfShape) to High(ArrOfShape) do
 ArrOfShape[I].{&#133}


 
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
> выделить его и при помощи Трэк баров установить цвет.

Как выделить визуально думай сам, а вот как сделать чтобы работало&#133

Заведи переменную типа 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 := {&#133}


PS
with (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.55 MB
Время: 0.025 c
4-1176881042
Грициан
2007-04-18 11:24
2007.10.21
Подмена сиволов в окне сторонней программы


2-1190796642
F@T@L_Err0r
2007-09-26 12:50
2007.10.21
TColor


4-1176989866
Dmitry_177
2007-04-19 17:37
2007.10.21
Правильно завершить ожидающий поток


2-1190800881
Yogan
2007-09-26 14:01
2007.10.21
mssql


15-1190230717
Джо
2007-09-19 23:38
2007.10.21
msoeapi.idl