Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 767

/ вопрос открыт /

Здравствуйте!
Столкнулся с проблемой мерцания контролов при ресайзе формы. Все конролы расположены на Tpanel, сама же панель выронена, так, что при изменении размеров формы, меняются размеры панели.
Если контролы переместить на панель, которая не меняет своих размеров, то и контролы не мерцают.
Использование свойства формы DoubleBuffered:=True; не решает проблемы.
Так как же избавиться от мерацания? Заранее спасибо за ответы.

Phoenix Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 13 февраля 2010, 13:40
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Цитата (Phoenix):

Использование свойства формы DoubleBuffered:=True; не решает проблемы.

Попробуй поставить в True это свойство у панели и/или у контролов на ней.

// Рекурсивная установка свойства DoubleBuffered у контрола и всех контролов, лежащих на нём.
procedure SetDoubleBuffered(Parent: TWinControl; const DoubleBuffered: Boolean);
var
  Control: TControl;
  Index: Integer;
begin
  if not Assigned(Parent)
    then Exit;
 
  Parent.DoubleBuffered:= DoubleBuffered;
  for Index:= 0 to Parent.ControlCount - 1 do
     begin
       Control:= Parent.Controls[Index];
       if Control is TWinControl
         then SetDoubleBuffered(TWinControl(Control), DoubleBuffered); // Рекурсия !!!
     end;
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 13 февраля 2010, 13:55
Оценка за ответ: 5

Комментарий к оценке: ставил и так и сяк, результат прежний.

Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 13 февраля 2010, 19:52; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 13 февраля 2010, 14:53 [#1]:

Цитата (Phoenix):

ставил и так и сяк, результат прежний.

Я наблюдал такой эффект с моими прогами на компах со слабой/интегрированной видюхой. У тебя не этот случай?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Phoenix

Phoenix (статус: Посетитель), 13 февраля 2010, 14:56 [#2]:

нет, видео отдельное, неслабое.
самое интересное, что мерацают все контролы кроме BitBtn
min@y™

min@y™ (статус: Доктор наук), 13 февраля 2010, 15:08 [#3]:

А как регулируюутся размеры панели при изменении размеров формы? Через Anchors?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Phoenix

Phoenix (статус: Посетитель), 13 февраля 2010, 15:16 [#4]:

через aling=alLeft
Alexey6522

Alexey6522 (статус: 1-ый класс), 13 февраля 2010, 18:10 [#5]:

Привет min@y™ сотри свою процедуру procedure SetDoubleBuffered(Parent: TWinControl; const DoubleBuffered: Boolean); и в обработчике событий Form1.OnCreate напиши просто

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:= True;
end;

и все будет нормально ;)
min@y™

min@y™ (статус: Доктор наук), 13 февраля 2010, 19:00 [#6]:

Цитата (Alexey6522):

Привет min@y™ сотри свою процедуру procedure SetDoubleBuffered(Parent: TWinControl; const DoubleBuffered: Boolean); и в обработчике событий Form1.OnCreate напиши просто

procedure TForm1.FormCreate(Sender: TObject); begin Form1.DoubleBuffered:= True; end;

и все будет нормально ;)


Я вижу, ты такой умный. Мозги в черепе не жмут? Посмотри Controls.pas:
procedure TWinControl.WMPaint(var Message: TWMPaint);
var
  DC, MemDC: HDC;
  MemBitmap, OldBitmap: HBITMAP;
  PS: TPaintStruct;
begin
  if not FDoubleBuffered or (Message.DC <> 0) then
  begin
    if not (csCustomPaint in ControlState) and (ControlCount = 0) then
      inherited
    else
      PaintHandler(Message);
  end
  else
  begin
    DC := GetDC(0);
    MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
    ReleaseDC(0, DC);
    MemDC := CreateCompatibleDC(0);
    OldBitmap := SelectObject(MemDC, MemBitmap);
    try
      DC := BeginPaint(Handle, PS);
      Perform(WM_ERASEBKGND, MemDC, MemDC);
      Message.DC := MemDC;
      WMPaint(Message);
      Message.DC := 0;
      BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
      EndPaint(Handle, PS);
    finally
      SelectObject(MemDC, OldBitmap);
      DeleteDC(MemDC);
      DeleteObject(MemBitmap);
    end;
  end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Alexey6522

Alexey6522 (статус: 1-ый класс), 13 февраля 2010, 19:47 [#7]:

Зачем придумывать велосипед, я при рисовании на Canvas или перетаскивании какого-либо компонента на форме, во время выполнения, подчеркиваю, всегда вставляю Form1.DoubleBuffered:= True; ибо при перетаскивании картинки по форме, если это компонент Image, она мерцает, мигает, как хочешь называй, а с этим параметром не ммерцает
Alexey6522

Alexey6522 (статус: 1-ый класс), 13 февраля 2010, 19:52 [#8]:

вот пример мой пример, на форму поместить Image и в него закинуть какую-нибудь картинку, а дальше, думаю разберетесь... это пример перетаскивания компонента на форме, если убрать двойной буффер, картинка будет мерцать, а так все нормально
var
x0, y0: integer; //начальные координаты картинки
drag: boolean = false;{определяет режим буксировки
она будет устанавливаться в True
вначале и в False в конце }
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin //если нажата левая кнопка мыши
x0:=x; //запоминаем первоначальные
y0:=y; //координаты курсора
drag:=true; //перемещение началось
{методом BringToFront выдвигаем компонент
в котором произошло событие не передний план}
(Sender as TImage).BringToFront;
end else //если нажата не левая кнопка мыши
drag:=false; //нет перемещения
end;
 
procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=Source is TImage;
end;
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if drag then
with TImage(Sender) do begin
Left:=Left+x-x0;
Top:=Top+y-y0;
end;
end;
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
drag:=false;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:= true; //Для Того что бы картинка не мигала при перетаскивании, конечно есть и другие способы
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.05 сек.