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

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

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


Страницы:   1 2 3

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() рисуются на эту панельку. Соответственно выделение тоже можно нормально на этой панели отрисовать.

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


Страницы:   1 2 3

Наверх

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