Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
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 от кого происходит? Сам по себе?



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

Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1238955093
McSimm
2009-04-05 22:11
2009.06.14
Задачу школьную не могу решить


15-1238696236
Internal Tracking
2009-04-02 22:17
2009.06.14
Это баг в формах?


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


15-1239285021
12
2009-04-09 17:50
2009.06.14
Поддерживает.. Что за глупое выражение


15-1239264375
evgenij
2009-04-09 12:06
2009.06.14
Видимость значений переменных (String) в exe





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский