Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];
ВнизВыбор нескольких элементов типа панель Найти похожие ветки
← →
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
endunit 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 от кого происходит? Сам по себе?
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c