Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2011, 13:10   #1
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию SelectBox - как его правильнее сделать

Здравствуйте. Как сделать SelectBox? ТЕ при зажатии ЛКМ работал инструмент выделения прямоугольник? И как обработать его область?
Вот насколько я вижу вариант решения(с ходу):
Создаем шейп, без заливки с краями пунктирными.
Прячем его.
Обрабатывает OnMouseDown как то так:
Код:
x:=Mouse.X;
y:=Mouse.Y;
shp1.top:=y;
shp1.left:=x;
shp1.height:=2;
shp1.width:=2;
shp1.show;
flag:=true;
Потом в таймере с маленьким интервалом как то так:
Код:
if flag then
begin
  shp1.width:=Mouse.X-shp1.left;
  shp1.height:=Mouse.Y-shp1.top;
end;
Смотрим положение получившегося шейпа и делаем нужные действия с теми элементами которые попали в его область.
И под конец в OnMouseUp его прятать:
Код:
shp1.hide;
flag:=false;
Что то по рациональнее можно придумать?
Ненавижу быть как все, но люблю, чтобы все были как я.

Последний раз редактировалось MyLastHit; 11.02.2011 в 13:16.
MyLastHit вне форума Ответить с цитированием
Старый 11.02.2011, 13:54   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Кинте на форму TApplicationEvents (закладка Additional) и сделайте так:
Код:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  sp: TSmallPoint;
begin
  case Msg.message of
    WM_MOUSEMOVE: begin
      Integer (sp) := shp1.Tag;
      shp1.width  := Mouse.CursorPos.X - sp.x - shp1.Left;
      shp1.height := Mouse.CursorPos.Y - sp.y - shp1.Top;
    end;
    WM_LBUTTONUP: begin
      ClipCursor (nil);
      shp1.Visible := False;
      ApplicationEvents1.OnMessage := nil;
      ТУТ ВАШИ ДЕЙСТВИЯ
    end;
  end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  sp: TSmallPoint;
  r: TRect;
begin
  sp.x := Mouse.CursorPos.X - X;
  sp.y := Mouse.CursorPos.Y - Y;
  shp1.Tag := Integer (sp);

  shp1.Left := X;
  shp1.Top := Y;
  shp1.Width := 0;
  shp1.Height := 0;

  r := Rect (sp.x, sp.y, sp.x+ClientWidth, sp.y + ClientHeight);
  ClipCursor (@r);

  shp1.Visible := True;

  ApplicationEvents1.OnMessage := ApplicationEvents1Message;
end;

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  PostMessage (Handle, WM_LBUTTONUP, 0, 0);
end;

Последний раз редактировалось Sibedir; 11.02.2011 в 14:04.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильнее хранить настройки программы на хосте? Kottik Работа с сетью в Delphi 9 07.10.2009 14:06
С++. движение! как его сделать? HoOpe Помощь студентам 17 21.06.2009 02:07
как сделать на своем сайте возможность устанавливать его, как стартовую страницу при загрузке броузера Chaynik Помощь студентам 2 02.03.2009 23:10
Как и откуда правильнее загружать свой курсор? spamer Мультимедиа в Delphi 4 01.03.2009 00:14
Как правильнее, экономичнее и красивее? LakyWinter Microsoft Office Access 1 20.11.2008 09:51