Главная страница
    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.53 MB
Время: 0.127 c
15-1190121793
dimonf
2007-09-18 17:23
2007.10.21
Нужен программист Delphi + MSSQL (Москва)


15-1190600574
Slider007
2007-09-24 06:22
2007.10.21
С днем рождения ! 24 сентября 2007 понедельник


15-1190093011
boriskb
2007-09-18 09:23
2007.10.21
Домен su живет и побеждает


15-1190604782
Slider007
2007-09-24 07:33
2007.10.21
С днем рождения ! 23 сентября 2007 воскресенье


15-1190586044
Kostafey
2007-09-24 02:20
2007.10.21
Конфигурирование FTP доступа к виртуальным директориям в IIS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский