Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Господа еще один вопрос , сделал я на форме массив компонентов


Страницы:   1 2

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]

Поэтому индекс массива мне нужен


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо