powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как передать сендер в обработчик сообщений
22 сообщений из 47, страница 2 из 2
Как передать сендер в обработчик сообщений
    #39548917
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докпри достаточных ресурсах машины GTK-виджет работает нормально даже при выше приведенном коде
Фигня это, если резко дёрнуть мышь, то она всё равно уйдёт из области контрола.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39548924
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Код: pascal
1.
2.
3.
4.
5.
6.
  if PtInRect(Rect(Self.ClientWidth - sizeGripSize, Self.ClientHeight - sizeGripSize,
              Self.ClientWidth, Self.ClientHeight), ScreenToClient(Mouse.CursorPos))
    then
      Cursor := crSizeNWSE
    else
      Cursor:= crDefault;


Любишь же ты всё переусложнять... :)
Код: pascal
1.
2.
3.
4.
 if (x > panel1.ClientWidth - sizeGripSize) and (y > panel1.ClientHeight - sizeGripSize) then
  panel1.Cursor := crSizeNWSE
 else
  panel1.Cursor:= crDefault;
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39548931
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...ещё и mouseUp там не нужен.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549296
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey...ещё и mouseUp там не нужен.
Да, ты прав. Теперь не нужен :)

Поковырялся еще в коде, добавил "ограничители" мин/макс размеров.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure TSizeablePanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  Self.DisableAutoSizing;

  if (GetCaptureControl = Self) and FResize then
    begin
      if (X >= MaxConstrX) and (Y >= MaxConstrY)
        then Self.SetBounds(Self.Left, Self.Top, MaxConstrX, MaxConstrY)
        else if (X >= MaxConstrX)
          then Self.SetBounds(Self.Left, Self.Top, MaxConstrX, y + Fdy)
          else if (Y >= MaxConstrY)
            then Self.SetBounds(Self.Left, Self.Top, x + Fdx, MaxConstrY)
            else if (X <= MinConstrX) and (Y <= MinConstrY)
              then Self.SetBounds(Self.Left, Self.Top, MinConstrX, MinConstrY)
              else if (X <= MinConstrX)
                then Self.SetBounds(Self.Left, Self.Top, MinConstrX, y + Fdy)
                else if (Y <= MinConstrY)
                  then Self.SetBounds(Self.Left, Self.Top, x + Fdx, MinConstrY)
                  else  Self.SetBounds(Self.Left, Self.Top, x + Fdx, y + Fdy);
    end;

  Self.EnableAutoSizing;

if (x > Self.ClientWidth - sizeGripSize) and (y > Self.ClientHeight - sizeGripSize)
  then
    Self.Cursor := crSizeNWSE
  else
    Self.Cursor:= crDefault;
end;   


Пришлось добавить кода в OnResize формы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.FormCreate(Sender: TObject);
begin
  FPnl := TSizeablePanel.Create(Self);

  with FPnl do
  begin
    Parent := Self;
    Left := 10;
    Top := 10;
    Color:= clMoneyGreen;
    Caption := FPnl.ClassName;
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  FPnl.MaxConstrX:= Self.ClientWidth - 50;
  FPnl.MaxConstrY:= Self.ClientHeight - 50;
end; 


Фризов, по-прежнему, не наблюдаю. Ну, или почти. Все-таки одновременно запущенные Screen2Gif и VMWare жрут ресурсы встроенной видюхи :)


Правленный модуль с проектом приложил
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549300
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПоковырялся еще в коде, добавил "ограничители" мин/макс размеров.
Ты пугаешь меня... Вместо использования стандартного свойства Constrains, городишь огород, который ещё и не работает (сходу смог уменьшить панель до 1 пикселя. хоть по вертикали, хоть по горизонтали) :) Ну и раз уж курсор меняется в mouseMove, то из mouseDown назначение курсора тоже можно убрать.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549303
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причесал чуть-чуть...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
type

  { TSizeablePanel }

  TSizeablePanel = class(TPanel)
  private
    Fdx, Fdy : Integer;
    FResize : boolean;
  protected
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  public
    constructor Create(TheOwner: TComponent); override;
  end;


implementation

const
 sizeGripSize = 12;

procedure TSizeablePanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

  inherited;

  Fdx:= ClientWidth - x;
  Fdy:= ClientHeight - y;

  FResize := (Fdx < sizeGripSize) and (Fdy < sizeGripSize);

end;

procedure TSizeablePanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin

  inherited;

  if (GetCaptureControl = self) and fresize then
   SetBounds(left, top, x + fdx, y + fdy);

  if (x > ClientWidth - sizeGripSize) and (y > ClientHeight - sizeGripSize) then
   Cursor := crSizeNWSE
  else
   Cursor:= crDefault;

end;

constructor TSizeablePanel.Create(TheOwner: TComponent);
begin

  inherited Create(TheOwner);

  Width := 200;
  Height := 100;

  Constraints.MinWidth := 50;
  Constraints.MinHeight := 30;
  Constraints.MaxWidth := 200;
  Constraints.MaxHeight := 100;

end;

procedure TSizeablePanel.Paint;
const
  EdgeMarg = 3;
begin

  inherited Paint;

  with Canvas do
  begin
    Pen.Style:= psSolid;
    Pen.Width:= 1;
    Pen.Color:= clGray;
    MoveTo(ClientWidth - 5, ClientHeight - EdgeMarg);
    LineTo(ClientWidth - EdgeMarg, ClientHeight - 5);
    MoveTo(ClientWidth - 8, ClientHeight - EdgeMarg);
    LineTo(ClientWidth - EdgeMarg, ClientHeight - 8);
    MoveTo(ClientWidth - 11, ClientHeight - EdgeMarg);
    LineTo(ClientWidth - EdgeMarg, ClientHeight - 11);
  end;

end;

...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549348
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТы пугаешь меня...
я сам себя пугаюсь иногда: то self пропущу, то constraints искаропки

Рано мне еще в программисты ...
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549351
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я правую и нижнюю границу не зря вручную ограничил. Там может лежать контролл или граница формы, за которую заходить не следует
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549388
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКстати, я правую и нижнюю границу не зря вручную ограничил. Там может лежать контролл или граница формы, за которую заходить не следует
Ну так и это Constraints решает: Constraints.MaxWidth := Xmax - Panel.Left;
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39549398
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНу так и это Constraints решает: Constraints.MaxWidth := Xmax - Panel.Left;
хм, тоже верно.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39550997
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, добавил перерисовку панели при ресайзе
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  if (GetCaptureControl = Self) and FResize then
    begin
      if (X >= MaxConstrX) and (Y >= MaxConstrY)
        then Self.SetBounds(Self.Left, Self.Top, MaxConstrX, MaxConstrY)
        else if (X >= MaxConstrX)
          then Self.SetBounds(Self.Left, Self.Top, MaxConstrX, y + Fdy)
          else if (Y >= MaxConstrY)
            then Self.SetBounds(Self.Left, Self.Top, x + Fdx, MaxConstrY)
            else  Self.SetBounds(Self.Left, Self.Top, x + Fdx, y + Fdy);

      Self.Invalidate;
    end;

иначе артефакты появлялись


зы. MaxConstrX/Y оставил. имхо, код менее громоздкий и пользоваться удобнее
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39551009
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докзы. MaxConstrX/Y оставил. имхо, код менее громоздкий и пользоваться удобнее
Это отсутствие кода более громоздкое чем вот эта вот лесенка?

Если так уж хочется иметь свойство Max/MaxY, то можно таки вспомнить об ООП, в частности об инкапсуляции, и соордуить свойство с сеттером типа этого:
Код: pascal
1.
2.
3.
4.
procedure Mypanel.setMaxX(value : Integer);
begin
 constraints.MaxWidth := value - Left;
end;
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39551141
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Фиг его знает, тут подумать надо. Похоже, пока тестовое приложение напишу, из этой панельки полноценный компонент с разными фишками получится :)
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39553939
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПохоже, пока тестовое приложение напишу, из этой панельки полноценный компонент с разными фишками получится :)
Похоже, получилось. Заодно сделал двуязычным для пробы :). Кому интересно, исподники и демка в аттаче.

Заодно, гляньте, плз, на линуксе. Че-та кнопка редактирования квадратной через раз отрисовывается (баг, какой-то, похоже).
А также, если английские комменты в коде безграмотные, поправьте, плз. Буду благодарен. У меня грамматика хромает. "Оно хорошее, но почему-то хромает" ©
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39553953
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Посмотрел на линуксе - вроде нормально кнопка отрисовывается. А нафига ты продублировал мышинные события и назначаешь имена создаваемым в рантайме компонентам?

p.s. Ты меня там из копирайтов-то удали.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554021
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТы меня там из копирайтов-то удали.
стыдно за компонент? Там половина твоих идей и их реализаций.

Kazantsev AlexeyА нафига ты продублировал мышинные события и назначаешь имена создаваемым в рантайме компонентам?
Я пока по-другому не умею ;) Все-таки всю жизнь другим занимался. Потом посмотрю, чего лишнее, доделаю-переделаю. Пока удовлетворяет текущим нуждам, буду писать основной проект дальше.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554037
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyнафига ты продублировал мышинные события и назначаешь имена создаваемым в рантайме компонентам?
Вспомнил, осталось после отладки. Поправлю.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554042
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос: почему в русской версии капшены системного диалога здесь
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
  //Note:
  //Msg.wParam = 0  - pressed "Cancel" button
  //Msg.wParam = 1  - pressed "Save" button

  if Assigned(FPnl) then
    case Msg.wParam of
      0:begin
          if FPnl.IsUseCloseQuery //use of the CloseQuery dialog
            and FPnl.MemoPnl.Modified then
              if Application.MessageBox(PChar(QueryWarningMessage),PChar(QuertWarningCaption), MB_ICONINFORMATION + MB_YESNO) = IDYES
                then
                  {$IFDEF UNIX}
                  edtText.Text:= UTF8StringReplace(FPnl.MemoPnl.Text,#10,'~', [rfReplaceAll]);
                  {$ELSE}
                  edtText.Text:= UTF8StringReplace(FPnl.MemoPnl.Text,#13#10,'~',[rfReplaceAll]);
                  {$ENDIF}
        end;
      1:begin
          {$IFDEF UNIX}
          edtText.Text:= UTF8StringReplace(FPnl.MemoPnl.Text,#10,'~', [rfReplaceAll]);
          {$ELSE}
          edtText.Text:= UTF8StringReplace(FPnl.MemoPnl.Text,#13#10,'~',[rfReplaceAll]);
          {$ENDIF}
        end;
    end;

  FreeAndNil(FPnl); 


все остаются английскими? Винда же русская...
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554094
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Если ты про системный "MessageBox", то он использует локализацию винды для кнопок.
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554097
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доквсе остаются английскими? Винда же русская...
Это не винда. Механизм аналогичный дельфовому: переводи ресурсы.

https://stackoverflow.com/questions/35848393/lazarus-messagebox-how-to-localize-buttons
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39554135
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

ага, везде так, просто не обращал раньше внимания. Нафиг, оставлю на потом
...
Рейтинг: 0 / 0
Как передать сендер в обработчик сообщений
    #39557308
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, кажись, допилил до приемлемого уровня, КМК


...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как передать сендер в обработчик сообщений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]