Вниз
Скачать: CL | DM;

Выбор нескольких элементов типа панель   Найти похожие ветки 

← →
mnj   (2009-04-22 15:26) [0]

Добрый день всем
Скажите пожалуйста, можно ли выбрать мышкой несколько панелей, лежащих на форме? Какое событие нужно при этом отлавливать?


← →
Юрий Зотов ©   (2009-04-22 15:48) [1]

OnClick.


← →
Сергей М. ©   (2009-04-22 16:22) [2]

"выбрать" - это как ?


← →
mnj   (2009-04-22 17:07) [3]

Выбрать - это выделить мышкой как фрагмент изображения набор панелей, находящихся на форме или другой панели. OnClick выдаст мне только одну, насколько я понимаю


← →
12 ©   (2009-04-22 17:10) [4]

onMouseDown координаты, Up координаты
и считать какие панели перекрываются прямоугольником с этими координатами


← →
mnj   (2009-04-22 17:19) [5]

Спасибо 12, попробую


← →
mnj   (2009-04-22 17:25) [6]

Еще вопрос - а как нарисовать прямоугольник выделения, если у панели нет свойства Canvas?


← →
Германн ©   (2009-04-22 17:56) [7]


> mnj   (22.04.09 17:25) [6]
>
> Еще вопрос - а как нарисовать прямоугольник выделения, если
> у панели нет свойства Canvas?
>

У панели есть канва, только она protected. Обманув компилятор можно получить к ней доступ.


← →
clickmaker ©   (2009-04-22 18:01) [8]

> а как нарисовать прямоугольник выделения, если у панели
> нет свойства Canvas?

а рисовать разве надо не поверх всех выделяемых панелей?


← →
mnj   (2009-04-22 22:39) [9]

Рисовать надо поверх выделяемых панелей. Но как - я пока не знаю.


← →
Игорь Шевченко ©   (2009-04-22 23:04) [10]


> Но как - я пока не знаю


если панели на форме, то рисовать на форме, у нее canvas есть и на событии FormPaint доступен


← →
StriderMan   (2009-04-22 23:14) [11]


> если панели на форме, то рисовать на форме, у нее canvas
> есть и на событии FormPaint доступен

все это рисование под панельками окажется


← →
mnj   (2009-04-22 23:18) [12]

А если на другой панели? Можно ли добраться до Canvas так:

TMyPanel = class(TPanel)
.....
private
.....
public
Canvas;
......
end;

TMyForm = class(TForm)
....
MyPanel: TMyPanel;
....
end;


← →
Игорь Шевченко ©   (2009-04-22 23:35) [13]


> все это рисование под панельками окажется


почему ?


← →
Германн ©   (2009-04-23 00:15) [14]


> mnj   (22.04.09 23:18) [12]
>
> А если на другой панели? Можно ли добраться до Canvas так:

Можно. Но не нужно.
Всё гораздо проще:
type
 THackPanel = class(TPanel); // Имя класса (с) Юрий Зотов о)
...
 with THackPanel(Panel1).Canvas do
...


← →
StriderMan   (2009-04-23 11:05) [15]


> Игорь Шевченко ©   (22.04.09 23:35) [13]
> почему ?

потому что панели с точки зрения ОС - тоже окна, со своей канвой.


← →
Игорь Шевченко ©   (2009-04-23 11:14) [16]

StriderMan   (23.04.09 11:05) [15]


> потому что панели с точки зрения ОС - тоже окна, со своей
> канвой.


рамку рисовать вокруг панели, а не на ней самой, компрене ву ?


← →
StriderMan   (2009-04-23 12:16) [17]


> рамку рисовать вокруг панели, а не на ней самой, компрене ву ?

топикстартер хотел отрисовывать рамку при выделении мышкой. В процессе выделения она частично будет проходить над(под) лежащими на форме панельками, а не только вокруг, нес па? ;)


← →
brother ©   (2009-04-23 12:23) [18]

а панели обязательно использовать?


← →
brother ©   (2009-04-23 12:26) [19]

может Bevel поможет?


← →
StriderMan   (2009-04-23 12:32) [20]

Можно положить прозрачный контрол с канвой и отслеживать чтобы он всегда был поверх всех и чтобы мессаджи сам не принимал. Рисовать рамку на нем.


← →
Юрий Зотов ©   (2009-04-23 13:31) [21]

А можно и ничего не рисовать, а выбирать панели кликом (с зажатой Ctrl) и выделять их цветом.


← →
StriderMan   (2009-04-23 14:13) [22]

я полагаю топикстартер свой визуальный редактор делает.

Я с вин-контролами извратился иначе: на форме выше всех лежит рисовабельная панелька, редактируемые вин-контролы лежат ПОД ней, но при помощи .PaintTo() рисуются на эту панельку. Соответственно выделение тоже можно нормально на этой панели отрисовать.

Не так давно тему тут поднимал об этом.


← →
Игорь Шевченко ©   (2009-04-23 18:58) [23]

StriderMan   (23.04.09 12:16) [17]


> топикстартер хотел отрисовывать рамку при выделении мышкой.
>  В процессе выделения она частично будет проходить над(под)
> лежащими на форме панельками, а не только вокруг, нес па?
>  ;)


вот придет топикстартер и сам скажет, что ему надо

Я же имел в виду вот что:

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = "Form1"
 ClientHeight = 286
 ClientWidth = 426
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "Tahoma"
 Font.Style = []
 OldCreateOrder = False
 OnPaint = FormPaint
 PixelsPerInch = 96
 TextHeight = 13
 object Panel1: TPanel
   Left = 108
   Top = 44
   Width = 185
   Height = 41
   Caption = "Panel1"
   TabOrder = 0
   OnClick = Panel1Click
 end
 object Panel2: TPanel
   Left = 108
   Top = 104
   Width = 185
   Height = 41
   Caption = "Panel2"
   TabOrder = 1
   OnClick = Panel1Click
 end
end


unit main;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Panel2: TPanel;
   procedure Panel1Click(Sender: TObject);
   procedure FormPaint(Sender: TObject);
 private
   FClickedPanel: TPanel;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
var
 Rect: TRect;
begin
 if Assigned(FClickedPanel) then
 begin
   Rect := FClickedPanel.BoundsRect;
   InflateRect(Rect, 1, 1);
   Canvas.Brush.Color := clRed;
   Canvas.FrameRect(Rect);
 end;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
 FClickedPanel := Sender as TPanel;
 Invalidate;
end;

end.


При желании можно и несколько выбрать, писать лень


← →
mnj   (2009-04-24 17:03) [24]

Жаль, что нельзя вставлять рисунки, я бы просто скриншот показал, так проще было бы. Я действительно делаю визуальный редактор моделей геоэлектрических разрезов. Разрез представлен набором раскрашенных в соответствии с заданной шкалой панелек(сколько-то в длину - Х и сколько-то в глубину - Z(Y в координатах экрана, вроде разноцветной плитки на стене). На самом деле мне нужно выделить группу элементов (панелек) внутри такого разреза (набора панелек). С одиночным выделением проблем нет, групповое можно сделать поиском панелек, попадающих между начальными и конечными X,Y по MouseDown-MouseUp, все панельки-элементы индексированы. Проблема в рисовании рамки выделения ПОВЕРХ этих панелек, чтобы пользователь видел, КАКИЕ панельки он выделяет. Вот.


← →
clickmaker ©   (2009-04-24 17:07) [25]

а почему именно панельки?
почему не рисовать прямо на канве, пользуясь коллекцией этих объектов, хранящихся в TList, например?
Тогда и рамку рисовать на этой же канве


← →
mnj   (2009-04-24 21:01) [26]


> clickmaker

А что лучше использовать для отображения отдельного элемента?


← →
Германн ©   (2009-04-24 21:55) [27]


> mnj   (24.04.09 21:01) [26]
>
>
> > clickmaker
>
> А что лучше использовать для отображения отдельного элемента?
>
>

TImage.


← →
mnj   (2009-04-24 23:19) [28]


> Германн ©   (24.04.09 21:55) [27]

А не будет ли слишком медленным вывод, скажем, 3000 TImage? Это ведь тоже критично.


← →
Игорь Шевченко ©   (2009-04-24 23:59) [29]

Я открою секрет - для вывода одного элемента не обязательно использовать какой-либо компонент - его можно просто нарисовать. У него будут координаты, с ними можно сравнивать координаты щелчка мышью и при совпадении перерисовывать.

А выводить 3000 панелек конечно можно, но муторно


← →
mnj   (2009-04-25 00:34) [30]


> Игорь Шевченко ©   (24.04.09 23:59) [29]

3000 панелек рисуются гораздо быстрее 3000 имаджей, это проверено. Пока я не очень себе представляю какие либо другие способы отображения нескольких тысяч элементов, каждый из которых должен обладать набором свойств и методов их изменения. Поясните, пожалуйста, что значит "нарисовать компонент"?


← →
ТД   (2009-04-25 00:43) [31]

Поясните, пожалуйста, что значит "элемент"?


← →
Германн ©   (2009-04-25 00:47) [32]


> mnj   (25.04.09 00:34) [30]
>
>
> > Игорь Шевченко ©   (24.04.09 23:59) [29]
>
> 3000 панелек рисуются гораздо быстрее 3000 имаджей, это
> проверено. Пока я не очень себе представляю какие либо другие
> способы отображения нескольких тысяч элементов, каждый из
> которых должен обладать набором свойств и методов их изменения.
>  Поясните, пожалуйста, что значит "нарисовать компонент"?
>
>

Поясни, пожалуйста, свою задачу.
А всё остальное потом решим.

P.S.
И чего ради я сюда влез? И сам не пойму.


← →
ТД   (2009-04-25 00:50) [33]


> Германн ©   (25.04.09 00:47) [32]
> И чего ради я сюда влез? И сам не пойму.

Поясните, пожалуйста, вы только это не поймёте?
-)


← →
Игорь Шевченко ©   (2009-04-25 00:54) [34]

mnj   (25.04.09 00:34) [30]

Вроде как я в прошлой ветке 2048 квадратиков рисовал - совсем быстро. Если интересно, как рисовать, можно поднять ту саму ветку, а по второму разу на ту же самую тему мне даже неудобно


← →
{RASkov} ©   (2009-04-25 00:58) [35]

> [30] mnj   (25.04.09 00:34)
> 3000 панелек рисуются гораздо быстрее 3000 имаджей

Если все правильно делать, то с рисованием на канве не только быстрее, но и выгоднее получится...
Например, рисование "поверх" всех своих элементов(имиджей)...
А с панелями одна только растрата хэндлов(ресурсов) неоправдана...


← →
AIK ©   (2009-04-25 15:20) [36]


> mnj   (24.04.09 23:19) [28]
> > Германн ©   (24.04.09 21:55) [27]А не будет ли слишком
> медленным вывод, скажем, 3000 TImage? Это ведь тоже критично.
>


Можно попробовать типа:

Procedure CanvasKomponent(Height, Width, x_position, y_position: Integer, Caption_Komponent: String);
Begin
...
End;


Вызываем процедуру

var x,y,size: integer;
Begin
x:=10;
y:=10;
Size:=10
For i:=1 to 3000 do
 Begin
  CanvasKomponent(Size, Size, x, y, "");
  x:=x+11;     // В одну длину с расстоянием между ними
 end;
...
end;


← →
AIK ©   (2009-04-25 15:27) [37]


> AIK ©   (25.04.09 15:20) [36]


Почему-то я представил себе что речь шла о канве, с TImage"м то же можно что то типа такое сообразить.


← →
clickmaker ©   (2009-04-27 11:28) [38]

> [26] mnj   (24.04.09 21:01)
>
> > clickmaker
>
> А что лучше использовать для отображения отдельного элемента?

TElement = class
 private FSelected: boolean;
 public
   procedure Draw(ACanvas: TCanvas); virtual;
   property Selected: boolean read FSelected write SetSelected;
 ...
end;

ElementList := TObjectList.Create;
for i := 0 to ElementCount do begin
 Element := TElement.Create;
 ElementList.Add(Element);
end;

procedure TElement.Draw(ACanvas: TCanvas);
begin
 // рисуем, например ACanvas.Rectangle или FillRect
 if FSelected
   // например, подсветить или нарисовать поверх рамку
end;

procedure TForm1Paint // или ТоНаЧемЛежатЭлементыPaint
begin
 for i := 0 to ElementList.Count do
   TElement(ElementList[i]).Draw(Form1.Canvas);
end;


← →
StriderMan   (2009-04-27 11:54) [39]

3000 панелек это 3000 объектов GDI. В какой-то момент винда может сказать - не дам больше. Рисуйте на канве.


← →
mnj   (2009-04-28 16:10) [40]


> clickmaker ©   (27.04.09 11:28) [38]


> TElement = class  private FSelected: boolean;  public  
>  procedure Draw(ACanvas: TCanvas); virtual;    property
> Selected: boolean read FSelected write SetSelected;  ...
> end;

А TElement от кого происходит? Сам по себе?


← →
Игорь Шевченко ©   (2009-04-28 16:11) [41]

а бабушки все падали и падали



Страницы: 1 2 вся ветка

Скачать: CL | DM;



Память: 0.56 MB
Время: 0.009 c
2-1240904224
Sowyer
2009-04-28 11:37
2009.06.14
Как зделать закладки в программе?


15-1239277793
Palladin
2009-04-09 15:49
2009.06.14
Delphi 6 и wine под Manrdiva 2009


15-1239134355
istok
2009-04-07 23:59
2009.06.14
восстановить delphi...


2-1240665137
Bohon_sky
2009-04-25 17:12
2009.06.14
команда в Делфи 7 , которая бы запускала некоторый exe-файл.


15-1238939521
@!!ex
2009-04-05 17:52
2009.06.14
Баланс белого на вебкамере.




   Наверх