![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выбор нескольких элементов типа панель
mnj © (2009-04-22 15:26:00)Добрый день всем
Скажите пожалуйста, можно ли выбрать мышкой несколько панелей, лежащих на форме? Какое событие нужно при этом отлавливать?
Игорь Шевченко (2009-04-28 16:11:00) [1]а бабушки все падали и падали
mnj (2009-04-28 16:10:00) [2]
> 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 от кого происходит? Сам по себе?
StriderMan (2009-04-27 11:54:00) [3]3000 панелек это 3000 объектов GDI. В какой-то момент винда может сказать - не дам больше. Рисуйте на канве.
clickmaker (2009-04-27 11:28:00) [4]> [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;
AIK (2009-04-25 15:27:00) [5]
> AIK © (25.04.09 15:20) [36]
Почему-то я представил себе что речь шла о канве, с TImage'м то же можно что то типа такое сообразить.
AIK (2009-04-25 15:20:00) [6]
> 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;
{RASkov} (2009-04-25 00:58:00) [7]> [30] mnj (25.04.09 00:34)
> 3000 панелек рисуются гораздо быстрее 3000 имаджей
Если все правильно делать, то с рисованием на канве не только быстрее, но и выгоднее получится...
Например, рисование "поверх" всех своих элементов(имиджей)...
А с панелями одна только растрата хэндлов(ресурсов) неоправдана...
Игорь Шевченко (2009-04-25 00:54:00) [8]mnj (25.04.09 00:34) [30]
Вроде как я в прошлой ветке 2048 квадратиков рисовал - совсем быстро. Если интересно, как рисовать, можно поднять ту саму ветку, а по второму разу на ту же самую тему мне даже неудобно
ТД (2009-04-25 00:50:00) [9]
> Германн © (25.04.09 00:47) [32]
> И чего ради я сюда влез? И сам не пойму.
Поясните, пожалуйста, вы только это не поймёте?
-)
Германн (2009-04-25 00:47:00) [10]
> mnj (25.04.09 00:34) [30]
>
>
> > Игорь Шевченко © (24.04.09 23:59) [29]
>
> 3000 панелек рисуются гораздо быстрее 3000 имаджей, это
> проверено. Пока я не очень себе представляю какие либо другие
> способы отображения нескольких тысяч элементов, каждый из
> которых должен обладать набором свойств и методов их изменения.
> Поясните, пожалуйста, что значит "нарисовать компонент"?
>
>
Поясни, пожалуйста, свою задачу.
А всё остальное потом решим.
P.S.
И чего ради я сюда влез? И сам не пойму.
ТД (2009-04-25 00:43:00) [11]Поясните, пожалуйста, что значит "элемент"?
mnj (2009-04-25 00:34:00) [12]
> Игорь Шевченко © (24.04.09 23:59) [29]
3000 панелек рисуются гораздо быстрее 3000 имаджей, это проверено. Пока я не очень себе представляю какие либо другие способы отображения нескольких тысяч элементов, каждый из которых должен обладать набором свойств и методов их изменения. Поясните, пожалуйста, что значит "нарисовать компонент"?
Игорь Шевченко (2009-04-24 23:59:00) [13]Я открою секрет - для вывода одного элемента не обязательно использовать какой-либо компонент - его можно просто нарисовать. У него будут координаты, с ними можно сравнивать координаты щелчка мышью и при совпадении перерисовывать.
А выводить 3000 панелек конечно можно, но муторно
mnj (2009-04-24 23:19:00) [14]
> Германн © (24.04.09 21:55) [27]
А не будет ли слишком медленным вывод, скажем, 3000 TImage? Это ведь тоже критично.
Германн (2009-04-24 21:55:00) [15]
> mnj (24.04.09 21:01) [26]
>
>
> > clickmaker
>
> А что лучше использовать для отображения отдельного элемента?
>
>
TImage.
mnj (2009-04-24 21:01:00) [16]
> clickmaker
А что лучше использовать для отображения отдельного элемента?
clickmaker (2009-04-24 17:07:00) [17]а почему именно панельки?
почему не рисовать прямо на канве, пользуясь коллекцией этих объектов, хранящихся в TList, например?
Тогда и рамку рисовать на этой же канве
mnj (2009-04-24 17:03:00) [18]Жаль, что нельзя вставлять рисунки, я бы просто скриншот показал, так проще было бы. Я действительно делаю визуальный редактор моделей геоэлектрических разрезов. Разрез представлен набором раскрашенных в соответствии с заданной шкалой панелек(сколько-то в длину - Х и сколько-то в глубину - Z(Y в координатах экрана, вроде разноцветной плитки на стене). На самом деле мне нужно выделить группу элементов (панелек) внутри такого разреза (набора панелек). С одиночным выделением проблем нет, групповое можно сделать поиском панелек, попадающих между начальными и конечными X,Y по MouseDown-MouseUp, все панельки-элементы индексированы. Проблема в рисовании рамки выделения ПОВЕРХ этих панелек, чтобы пользователь видел, КАКИЕ панельки он выделяет. Вот.
Игорь Шевченко (2009-04-23 18:58:00) [19]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.
При желании можно и несколько выбрать, писать лень
StriderMan (2009-04-23 14:13:00) [20]я полагаю топикстартер свой визуальный редактор делает.
Я с вин-контролами извратился иначе: на форме выше всех лежит рисовабельная панелька, редактируемые вин-контролы лежат ПОД ней, но при помощи .PaintTo() рисуются на эту панельку. Соответственно выделение тоже можно нормально на этой панели отрисовать.
Не так давно тему тут поднимал об этом.