Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/35: Рейтинг темы: голосов - 35, средняя оценка - 4.57
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
1

Мерцание

08.05.2010, 09:47. Показов 6904. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо перерисовывать картинку(изменяя размер). Во время перерисовки идет заметное моргание.
Как с этим справится?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2010, 09:47
Ответы с готовыми решениями:

Мерцание ячеек СтрингГрид
В СтрингГрид вставляю картинку и масштабирую ячейки по размеру этой картинки.//Вставка картинок в...

Временное мерцание RAD Studio XE 10.2
Здравствуйте. Помогите решить проблему мерцания RAD Studio XE 10.2 Раз в несколько секунд...

Мерцание изображения при табуляции
Здравствуйте! При загрузки формы фокус установлен на Edit1 (можно ли вообще убрать фокус при...

Мерцание компонента Timage и перемещение Timage при нажатии
Здравствуйте! Помогите убрать мерцание компонента Timage при изменении размера. Нашел в...

21
35 / 34 / 17
Регистрация: 28.04.2009
Сообщений: 67
08.05.2010, 10:16 2
Создать 2-ой буфер, рисовать в нем, потом за один раз выводить из буфера в рабочую область.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
11.05.2010, 12:05  [ТС] 3
Так и делаю но все равно мерцает
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
11.05.2010, 17:36 4
Не перерисовывать дважды ни одной области, даже из нескольких точек
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
12.05.2010, 11:53  [ТС] 5
Перерисовка происходит при изменении размера формы(resize), там много надо перерисовывать и при этом менять размер изображения.
Отлавливал сообщение о прекращении изменения размера, но там не смог определить когда форма на максимум развернется. Хотя б про это скажите.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
12.05.2010, 12:27 6
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// в interface формы
procedure WMExitSz(var msg: TMessage); message WM_EXITSIZEMOVE;
procedure WMSz(var msg: TMessage); message WM_SIZE;
procedure WMPos(var msg: TMessage); message WM_WINDOWPOSCHANGED;
 
// в implementation
procedure TForm1.WMExitSz(var msg: TMessage);
begin
  // окончание изменения размера/перемещения
  ShowMessage('ExitSzMove');
end;
 
procedure TForm1.WMPos(var msg: TMessage);
begin
  // любое изменение
  ShowMessage('Pos');
end;
 
procedure TForm1.WMSz(var msg: TMessage);
begin
  // изменение размера/восстановление из развернутого/развертывание
  ShowMessage('Sz');
end;
// еще есть WM_MOVING, WM_SIZING, WM_GETMINMAXINFO и другие
1
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
12.05.2010, 17:11  [ТС] 7
Delphi
1
2
3
4
5
procedure TForm1.WMExitSz(var msg: TMessage);
begin
  // окончание изменения размера/перемещения
  ShowMessage('ExitSzMove');
end;
Частично подходит. но мне не нужно знать о перемещении формы.
А максимализацию формы как отловить, что бы только ее окончание? WM_WINDOWPOSCHANGED слишком много сообщений.
Пытаюсь определить максимизацию
Delphi
1
2
  if form1.WindowState=wsMaximized then
  ShowMessage('q');
но не получается, только если убрать перехват сообщений

Добавлено через 1 час 8 минут
Вроде сделал
Потестите, можть что не так
Delphi
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    flag,maxFlag,minFlag:boolean;
    procedure WMExitSz(var msg: TMessage); message WM_EXITSIZEMOVE;
    procedure My_WM_ENTERSIZEMOVE(var msg: TMessage); message WM_ENTERSIZEMOVE;
    //procedure WMSysCommand(var Msg: TWMSysCommand);message WM_SYSCOMMAND;
    procedure My_WM_SIZE(var Msg:TMessage );message WM_SIZE;
  public
    { Public declarations }
 
  procedure q(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
    //if (Msg.CmdType = SC_MINIMIZE) then
  //ListBox1.AddItem('SC_MINIMIZE',nil);
  //if (Msg.CmdType = SC_MAXIMIZE) then
  //ListBox1.AddItem('SC_MAXIMIZE',nil);
  //if (Msg.CmdType = SC_RESTORE) then
  //ListBox1.AddItem('SC_RESTORE',nil);
inherited;
end;}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
flag:=false;
maxFlag:=false;
minFlag:=false;
end;
 
procedure TForm1.q(Sender: TObject);
begin
ShowMessage('qwe');
end;
 
procedure TForm1.WMExitSz(var msg: TMessage);
begin
  if flag then
  ListBox1.AddItem(('WMExitSz'),nil);
inherited;
end;
 
procedure TForm1.My_WM_ENTERSIZEMOVE(var msg: TMessage);
var
p:tpoint;
q:integer;
begin
GetCursorPos(p);
q:=SendMessage(form1.Handle,WM_NCHITTEST,0,MAKELPARAM(p.X,p.Y));
flag:=true;
  if q=HTCAPTION then
  flag:=false;
inherited;
//ListBox1.AddItem('HTCAPTION',nil);
end;
 
procedure tform1.My_WM_SIZE(var Msg:TMessage );
begin
inherited;
  if maxFlag then
  begin
  ListBox1.AddItem('WM_SIZE+Normal+maxFlag',nil);
  maxFlag:=false;
  end;
  if minFlag then
  begin
  ListBox1.AddItem('WM_SIZE+Normal+minFlag',nil);
  minFlag:=false;
  end;
  if form1.WindowState=wsMaximized then
  begin
  ListBox1.AddItem('WM_SIZE+wsMaximized',nil);
  maxFlag:=true;
  end;
  if form1.WindowState=wsMinimized then
  begin
  ListBox1.AddItem('WM_SIZE+wsMinimized',nil);
  minFlag:=true;
  end;
end;
 
end.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
12.05.2010, 17:39 8
Держать флаг состояния нет необходимости, т.к. то, что произошло с формой, указано в wParam хотя бы WM_SIZE. Подробности почитайте в MSDN или справке Delphi, только выберите раздел "Windows SDK"
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
14.05.2010, 17:52  [ТС] 9
А можете сказать как сделать класс, чтоб он перехватывал изменение размера по этому методу(см выше).
А перехват того же для листвью как сделать?
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
15.05.2010, 13:23 10
Цитата Сообщение от turboq Посмотреть сообщение
как сделать класс, чтоб он...
Так когда Вы сделали обычный проект в Delphi, то TForm1 = class(TForm) и есть класс. Обзовите его как-то по, хотя бы TMyForm - и будет отдельный класс со всем, что имеется на форме. Хотя, делать класс имеет смысел, когда у Вас все отлажено и все нормально работает. Ведь класс - грубо говоря - просто шаблон для создаваемого на его основе объекта.

Цитата Сообщение от turboq Посмотреть сообщение
перехват того же для листвью как сделать
Если под листвью понимается ListView, то зачем ловить сообщения о размере для отдельных дочерних элементов окна, если их размер все равно, как правило, меняется только при изменении размеров самой формы, ну или, при перемещении сплиттера, но опять же, не на элементе, а на его родителе. Если уж очень хочется, чтобы элемент сам себя менял, так проще послать ему хотя бы то же самое сообщение, а лучше определить какое-то свое особенное.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
15.05.2010, 14:49  [ТС] 11
Я хочу сделать что то типа ActionList, кидаешь его на форму и он отлавливает изменения формы.
А для listview мне надо чтоб перерисовывать только тогда когда изменится размер формы. Хочу запихнуть в свой класс на основе listview.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
15.05.2010, 22:03 12
Цитата Сообщение от turboq Посмотреть сообщение
А для listview мне надо чтоб перерисовывать только тогда когда изменится размер формы
Вообще-то перерисовывать только при изменении размера при полностью OwnerDraw-отрисовке неверно. Получится, что, например, когда ваш View перекроется другим окном, то он после этого будет просто белым пятном. Перерисовка д.б. по WM_PAINT, как и для любого Windows-окошка.

Ну а по реализации - наследуйте свой класс от CustomListView и переопределяйте реакцию на нужные message. А у самого ListView есть событие OnResize.

Добавлено через 3 минуты
Цитата Сообщение от turboq Посмотреть сообщение
что то типа ActionList
насколько знаю ActionList - вообще не визуальный компонент, поэтому строить свой визуальный компонент по его образцу будет, наверное, тяжеловато

лучше гляньте реализацию в CustomListView.DrawWorkAreas
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
15.05.2010, 22:37  [ТС] 13
Я не так выразился listview не перерисовывается а обновляются элементы при изменении размера (а то они они остаются на месте), как можно это обойти, может есть специальная настройка. Поверх listview есть панель и она перерисовывается (на ней пейнтбокс с событием онпейнт). Однако мерцание сильное.
Хочу чтобы форма сообщала когда применить обновление элементов.
Пытался добавить в класс listview сообщение WM_EXITSIZEMOVE, но оно не пошло, а WM_SIZE пошло но оно мне не надо.
Есть такой компонент ApplicationEvents (не визуальный), сделал клас на основе него, но сообщения о перемещении и размере он не ловит (см ниже), а сообщение WM_NCRBUTTONDOWN ловит
В общем странно.
Может не то событие надо брать.
Delphi
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
unit unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList, StdCtrls, StdActns, AppEvnts;
 
type
  TOnSpecResize = procedure (sMsg:string) of object;
  MyApplicationEvents=class(TApplicationEvents)
  private
    { Private declarations }
    FOnSpecResize:TOnSpecResize;
    flag,maxFlag,minFlag:boolean;
    procedure Message1(var Msg: tagMSG; var Handled: Boolean);// override;
    procedure DoSpecResize(sMsg:string);
  public
    { Public declarations }
  procedure M();
  property OnSpecResize: TOnSpecResize read FOnSpecResize write FOnSpecResize ;
  end;
implementation
 
procedure MyApplicationEvents.M();
begin
flag:=false;
maxFlag:=false;
minFlag:=false;
OnMessage:=Message1;
//OutputDebugString('qwe');
end;
 
procedure MyApplicationEvents.Message1(var Msg: tagMSG;
  var Handled: Boolean);
var
p:tpoint;
q:integer;
begin
{  if (Msg.message = WM_NCRBUTTONDOWN) then
  begin
  inherited;
  OutputDebugString('WM_NCRBUTTONDOWN');
  end;}
//inherited;
 
OutputDebugString(pansichar(IntToStr(msg.message)));
  if msg.message=5 then
  begin
  OutputDebugString('qwe');
  inherited;
  end;
 
  if msg.message=WM_SIZE then
  begin
  //OutputDebugString('qwe');
    if maxFlag then
    begin
    DoSpecResize('WM_SIZE+Normal+maxFlag');
    maxFlag:=false;
    end;
    if minFlag then
    begin
    DoSpecResize('WM_SIZE+Normal+minFlag');
    minFlag:=false;
    end;
    if tform(Owner).WindowState=wsMaximized then
    begin
    DoSpecResize('WM_SIZE+wsMaximized');
    maxFlag:=true;
    end;
    if tform(Owner).WindowState=wsMinimized then
    begin
    DoSpecResize('WM_SIZE+wsMinimized');
    minFlag:=true;
    end;
  end;
  if msg.message=WM_EXITSIZEMOVE then
  begin
      if flag then
      DoSpecResize('WMExitSz');
      inherited;
  end;
  if msg.message=WM_ENTERSIZEMOVE then
  begin
  GetCursorPos(p);
  q:=SendMessage(tform(owner).Handle,WM_NCHITTEST,0,MAKELPARAM(p.X,p.Y));
  flag:=true;
      if q=HTCAPTION then
      flag:=false;
  inherited;
  end;
end;
 
procedure MyApplicationEvents.DoSpecResize(sMsg:string);
begin
  if assigned(FOnSpecResize) then
  FOnSpecResize(sMsg);
//OutputDebugString('qwe');
end;
 
end.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
16.05.2010, 10:25 14
Не понял, как связаны ListView и панель поверх него. Панель отображает элементы списка?
Для своей отрисовки лучше бы применять OnCustomDraw, OnAdvancedCustomDraw, OnAdvancedCustomDrawItem/SubItem. Тогда никаких отслеживаний размера вообще не нужно-нужный Rect уже будет предоставлен.
Из приведенного кода и описания абсолютно неясно что вы пытаетесь сделать.
И вообще - попробуйте поискать в нете типа "отрисовка ListView", наверное на примерах будет более понятно, что и как делать.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
16.05.2010, 11:56  [ТС] 15
Нету ни какой отрисовки на listview, просто когда меняется ее размер ее элементы остаются на месте и мне приходится их обновлять чтоб они приняли более красивый вид. Может есть сво для этого.

Я все таки хочу узнать как можно создать класс. Он мне нужен.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
16.05.2010, 16:45 16
Цитата Сообщение от turboq Посмотреть сообщение
Нету ни какой отрисовки на listview, просто когда меняется ее размер ее элементы остаются на месте и мне приходится их обновлять чтоб они приняли более красивый вид
Так это и есть эта самая "отрисовка"-то бишь визуальное отображение элемента в том или другом виде.

По поводу создания класса уже говорил. Если хотите конкретный пример - объясните популярно, что и как хотите отобразить. Лучше выложите то, что у Вас есть, но в самое ближайшее время не обещаю - эта неделя обещает быть загруженной, так что... Но может и выдастся часок.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
16.05.2010, 18:22  [ТС] 17
На ресайзе формы (onresize) слишком много обращений и процесс перерисовки и обновления мигает.
пока обновится listview а затем надо нарисовать на пейнтбоксе картинку.
Можно ли пейнтбоксу назначит doublebufer:=true? гдето в глубине оно должно быть.

Внизу показана идея класса, вот ее я и хочу реализовать. Как перехватывать в классе сообщения о перемещении формы?
давайте отойдем от listview и займемся классом, просто стало интересно, а если сделаем то и первая проблема наверно отпадет.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
18.05.2010, 12:38 18
Цитата Сообщение от turboq Посмотреть сообщение
давайте отойдем от listview и займемся классом
Опять не показали ваш имеющийся мерцающий код.
Проблема у Вас в мерцании при отрисовке - а создание какого-то абстрактного класса, который будет реагировать на изменение своего размера, эту проблему совсем не решит. Используйте событие OnDrawItem или OnCustomDraw или их комбинацию - и никакого отслеживания размера абсолютно не потребуется - они будут происходить только тогда, когда необходимо обновить отображение элемента, в том числе и при изменении размера. Я тут попробовал на досуге, так никакого мерцания при изменении размера нет. Правда при прокрутке все равно мерцание в отдельные моменты есть. Но такое поведение проявляется практически у каждого многоэлементного контрола и победить его можно, насколько знаю, только снижением частоты отрисовки, вызванной прокруткой ScrollBar-ов.
И еще раз - выложите свой мерцающий код - только тогда можно будет сказать что-то конкретное.
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
18.05.2010, 19:58  [ТС] 19
Тут главное теория
вот часть кода, целый код занимает 9 страниц(только компанент)

Delphi
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
procedure TPhotoLV.A_ReDrawListView();
var
i:integer;
begin
try
items.Clear;
finally
Items.EndUpdate;
end;
  if iImgCountForMas=0 then exit;
items.BeginUpdate;
  for i:=0 to iImgCountForMas-1 do
  begin
  AddItem(masImgRec[i].FileName,nil);
  Items.Item[i].ImageIndex:=i;
  Items.Item[i].Checked:=masImgRec[i].checked;
  end;
items.EndUpdate;
end;
 
procedure TPhotoLV.Resize();
var
l,t:integer;
begin
  if iImgCountForMas>0 then
  A_ReDrawListView();
  if iCurItemIndex>-1 then
  ItemIndex:=iCurItemIndex;
  if ItemIndex=-1 then exit;
  SetImgSize;
end;
 
procedure TPhotoLV.SetImgSize();//Установить размер рисунка
var
k:double;
begin
k:=1;
img.AutoSize:=true;
  if img.Width>(Width div 2) then
  k:=img.Width/(Width div 2);
  if (img.Height/k)>(Height div 2) then
  k:=((img.Height/k/(Height div 2))*k);
img.AutoSize:=false;
img.Width:=round(img.Width/k);
img.Height:=round(img.Height/k);
panel.Width:=img.Width;
panel.Height:=img.Height;
end;
Алгоритм:
если число элементов листвью (iImgCountForMas>0 (счетчик введен для массива) ) больше 0 то обновляем весь листвью A_ReDrawListView();, если ройдено условие(выбран элемент) то обновляет и изображение на панели(SetImgSize img(timage) пропорционально сжимает картинку (размер картинки не больше 800*600), которая находится на панели.
Тем не менее мне интересен сам класс о котором писал выше, мне нужен класс родитель, способный предоставить событие перехватывающее сообщения о перемещении формы и зменении размера.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
20.05.2010, 09:29 20
Цитата Сообщение от turboq Посмотреть сообщение
нужен класс родитель, способный предоставить событие перехватывающее сообщения о перемещении формы и зменении размера
Первое: Такого в Pascal сделать невозможно, т.к., насколько помню, Pascal не поддерживает множественное наследование. Поэтому для получения какого-то дополнительного эффекта какого-то отдельного типа элемента нужно взять именно этот тип и добавить в него свой эффект, а получить новый тип из двух и более типов не получится. Обойти это можно (не переписывая всю VCL), насколько знаю, можно только через использование COM, но заморочки с регистрациями, интерфейсами и прочей лабудой явно не соответствуют полученному результату. И второе: об изменении размера/позиции родительского окна (формы) его дочерние окна не уведомляются, если только сам родитель об этом не позаботится. Ведь и позиция (по отношению к родительскому окну) и размер самого элемента при этом не меняется. И третье - код, пусть даже из 999 страниц можно упаковать и выложить.
Но если уж непременно надо пример класса, то я лично представляю примерно как
Delphi
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
type
  TOnSzEvent = procedure(Sender: TObject; NewClientWidth, NewClientHeight: Word) of object;
 
type
  // меняя тип класса - предка, получаем нужный
  // здесь взят TMemo, но лучше брать классы с префиксом Custom
  TMyClass = class(TMemo)
  private
    FOnSize: TOnSzEvent;
    procedure WMSize(var m: TMessage); message WM_SIZE;
  published
    property OnSzEvent: TOnSzEvent read FOnSize write FOnSize;
  end;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    sample1: TMyClass;
    Splitter1: TSplitter;
 
    // подмена WndProc
    OldWndProc: LongInt;
    procedure NewWndProc(var m: TMessage);
    procedure SubClassing;
 
    // использование Delphi-свойства
    procedure ObjResize(Sender: TObject; NewClientWidth, NewClientHeight: Word);
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
// всякая лабуда
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Align := alTop;
  Memo1.Lines.Clear;
  SubClassing;
 
  Splitter1 := TSplitter.Create(Self);
  with Splitter1 do begin
    Parent := Self;
    Align := alTop;
    Visible := True;
  end;
 
  sample1 := TMyClass.Create(Self);
  with sample1 do begin
    Parent := Self;
    Align := alClient;
    OnSzEvent := ObjResize;
    Lines.Clear;
    Visible := True;
  end;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  sample1.Free;
  Splitter1.Free;
end;
 
// что касается субклассинга
procedure TForm1.NewWndProc(var m: TMessage);
begin
  with m do begin
    if Msg = WM_SIZE then
      Memo1.Lines.Add(FormatDateTime('nn:ss', Time) + Format('=%d:%d', [LOWORD(LParam), HiWord(LParam)]));
  //else - если полностью обработаем все связанное с изменением размера элемента
  //       иначе - все равно вызовем стандартную обработку
    Result := CallWindowProc(Pointer(OldWndProc), Memo1.Handle, Msg, WParam, LParam);
  end;
end;
 
function NotObjMethodWndProc(wHandle: HWND; msg: LongWord; wParam: Integer; lParam: Integer): Integer; stdcall; // обязательно stdcall
begin
  if msg = WM_SIZE then
    Form1.Memo1.Lines.Add(FormatDateTime('nn:ss', Time) + Format('=%d:%d', [LOWORD(lParam), HIWORD(lParam)]));
  Result := CallWindowProc(Pointer(Form1.OldWndProc), wHandle, msg, wParam, lParam);
end;
 
procedure TForm1.SubClassing;
begin
  // если обработчик - в составе класса
  OldWndProc := SetWindowLong(Memo1.Handle, GWL_WNDPROC, LongInt(MakeObjectInstance(NewWndProc)));
  // если обработчик - отдельная фунция
  // OldWndProc := SetWindowLong(Memo1.Handle, GWL_WNDPROC, LongInt(@NotObjMethodWndProc));
end;
 
// -----------------------------------------------------------------------------
// собственно, только то, что нужно
procedure TMyClass.WMSize(var m: TMessage);
var
  W, H: Word;
begin
  if Assigned(FOnSize) then begin
    W := LOWORD(m.lParam);
    H := HIWORD(m.lParam);
    FOnSize(Self, W, H);
  end;
end;
 
procedure TForm1.ObjResize(Sender: TObject; NewClientWidth, NewClientHeight: Word);
begin
  sample1.Lines.Add(FormatDateTime('nn:ss', Time) + Format('=%d:%d', [NewClientWidth, NewClientHeight]));
end;
1
20.05.2010, 09:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2010, 09:29
Помогаю со студенческими работами здесь

мерцание
начала делать машину, в которой должны мерцать окошки и осталось совсем не много.. дело в том что...

Мерцание
При нажатии на кнопку картинка перемещается,как сделать чтобь она не мерцала?

Мерцание в ScrollBox`e
Есть скроллбокс, где храниться довольно много динамических едитов. Проблема в том, что если резко...

Мерцание формы
Есть переключатель RadioGroup. При каждом его значении изменяется размер компонента Panel (всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru