Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запретить перерисовку DBGrida [D7, XP]


Страницы:   1 2

veb ©   (2006-04-04 10:58:00) 

Здравствуйте! Подскажите, пожалуйста, как запретить перерисовку DBGrida, когда по нему движется другой объект(панель).
Смысл такой:
- запретить перерисовку
- по таймеру выдвигается панель
- разрешить перерисовку.
Сейчас панель двигается очень медленно, когда в DBGride много элементов, особенно разукрашенных.


KSergey   (2006-04-07 13:44:00) [1]

> veb   (07.04.06 12:07) [27]
> Панель с GRIDOM имеет свойство align=alClient. а панель,
>  которая двигается  align=alRight. Двигающаяся панель просто
> уменьшается в размерах. А панель c DBGridom занимает все
> пространство.

тада лучше, думаю, так.

Сразу после нажатия кнопки:
Grid.align := none;
Panel.align := none; (именно в таком порядке!)

По таймеру:
Panel.Left = Panel.Left - 1;
Grid.Bounds.Right := Grid.Bounds.Right + 1;

После того, как панель уехала - восстанавливаем
Grid.align := client;

Разумется, прочих рекомендаций сотоварищей это не отмняет, но представляется мне улучшением. Но я не тестил.


> Подскажите как оптимизировать или, вообще, как сделать правильно
> плавный выезд, заезд панели?

Есть у меня сильное подозрение, что идеально никак.


Игорь Шевченко   (2006-04-07 12:08:00) [2]

KSergey ©   (07.04.06 11:55) [25]

Я все понимаю, но любую проблему обычно можно пересказать словами. Может, вы совместно с автором попробуете ? :)


veb   (2006-04-07 12:07:00) [3]

Господа, прошу прощения, за некорректно заданный вопрос. Постил код и понял насколько я ввел всех в заблуждение. Правда проблема осталась.
Панель с GRIDOM имеет свойство align=alClient. а панель, которая двигается  align=alRight. Двигающаяся панель просто уменьшается в размерах. А панель c DBGridom занимает все пространство.

Подскажите как оптимизировать или, вообще, как сделать правильно плавный выезд, заезд панели?

to Игорь
 Гарантирую отстутствие вредоносного кода! А шутка про скачку ехе-шников понравилась.


veb   (2006-04-07 11:59:00) [4]

Панель уезжает по таймеру (tmVisPanel), который включается кнопкой. Однозначно все время перерисовывается GRID. Поэтому хочу отключить перерисовку GRIDa.

procedure TfmDisks.tmVisPanelTimer(Sender: TObject);
var dx : Integer;
begin
 if sbVisiblePanel.Down then dx := -20 else dx := 20; // кнопка нажата
 paMRight.Width := paMRight.Width - dx;
 if paMRight.Width < 1 then begin
   paMRight.Width := 1;
   tmVisPanel.Enabled := false;
 end;
 if paMRight.Width >= 300 then  begin
   paMRight.Width := 300;
   tmVisPanel.Enabled := false;
 end;
end;


KSergey   (2006-04-07 11:55:00) [5]

> Игорь Шевченко ©   (07.04.06 11:03) [24]
> Нет. Я EXEшники не скачиваю, мне своих вирусов хватает :
> ) А что там такого интересного ?

Ничего кроме понимания того, что на самом деле беспокоит автора и что действительно сложно передать словами, пожалуй :)

Хотя по поводу перерисовки собственно панели во время уезжания (с чем тоже есть некая проблема) вероятно Ваша идея очень не плоха. Но основная-то проблема автора не в том, увы...


Игорь Шевченко   (2006-04-07 11:03:00) [6]

KSergey ©   (07.04.06 09:43) [23]


> Я прошу прощения, вы файлик смотрели? :)


Нет. Я EXEшники не скачиваю, мне своих вирусов хватает :) А что там такого интересного ?


KSergey   (2006-04-07 09:43:00) [7]

> Игорь Шевченко ©   (06.04.06 22:28) [22]

Я прошу прощения, вы файлик смотрели? :)

К стати, автор, а нельзя ли посмотеть код "уезжания" панели? А то высказываем тут идеи какие-то, а как оно на самом деле - устроено - и не ведаем...

У меня возникло сильное подозрение, что устроено примерно так:

for i := Panel1.Left to Panel1.Bounds.Right do
begin
  Panel1.Left := i;
  Application.ProcessMessages;
end;


Очевидно, что после каждого сдвига панели на пиксель отрисовывается грид (я сильно подозреваю, что практически весь, не особо это у них оптимизированно). Отсюда и предложил собственно решение [7] а)


Игорь Шевченко   (2006-04-06 22:28:00) [8]

veb   (06.04.06 17:24) [20]


>  т.е. предлагается создать свой компонент панель?


Ну не совсем свой компонент, а наследник имеющегося. Можно, конечно, попробовать у имеющегося окна панели установить стиль класса:

 SetClassLong (Panel1.Handle, GCL_STYLE, GetClassLong(Panel1.Handle, GCL_STYLE) or CS_SAVEBITS);
 Panel1.Perform (CM_RECREATEWND, 0, 0);

но сомеваюсь, что этот способ поможет...


Бугага   (2006-04-06 18:56:00) [9]


> Но все равно, допустим  что нет разукрашивания.

Так... Не понял... Так есть или нет?


veb   (2006-04-06 17:24:00) [10]

to Бугага
 ну в принципе логика железная! Действительно поймал. Но все равно, допустим  что нет разукрашивания.

to Игорь
 т.е. предлагается создать свой компонент панель?


Бугага   (2006-04-06 15:48:00) [11]


> особенно разукрашенных.

Почему DrawCell тогда пуст?


Игорь Шевченко   (2006-04-06 15:29:00) [12]


>   Можно немного поподробнее, в каком свойстве выставляется
> флаг?


У панели перекрывается метод CreateParams, в нем пишется:

procedure TMyPanel.CreateParams (var Params: TCreateParams);
begin
 inherited;
 WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
end;


veb   (2006-04-06 15:20:00) [13]

По пунктам
то Бугага
 1. Выставить его в Enabled := false ни к чему не приводит. Т.е. все так же медленная перерисовка, только с недоступными данными.
 2. Что значит выключить DrawCell, а если он пуст?
 3. Файл можно забрать еще тут
http://download.ware.ru:8080/win/8763_SetupVideoCat.exe

to Игорь
  Можно немного поподробнее, в каком свойстве выставляется флаг?


Игорь Шевченко   (2006-04-06 14:50:00) [14]

Если при движении панели размер/содержимое грида не меняется, то достаточно у оконного класса панели установить флаг CS_SAVEBITS.
Грид ведь не перерисовывается, когда на нем ComboBox открывается.
Ибо нефиг.


Бугага   (2006-04-06 14:47:00) [15]

А вот интуитивно:
Если отключить сам грид? Т.е. например выставить его в Enabled?
Или отключить DrawCell? Так как он вызывается именно при отрисовке? Выключить DrawCell - спрятать панель - включить DrawCell?

Если что, чур ногами не бить... Хотя бы по лицу :)


Бугага   (2006-04-06 14:31:00) [16]


> У DBGrid метода DisableControls нет!

Естественно. DisableControls принадлежит Dataset'у.


> Disables data display in data-aware controls associated
> with the dataset.

Переведи. Где-то видишь слово "обновление"?

Хотя если все равно не помогает, то надо искать что-то другое.

Кстати, что-то у меня качать твой файл не хочет. Выложи в другое место.


veb   (2006-04-06 12:42:00) [17]

to Desdechado
 DBGRID.DataSource.DataSet.DisableControls
 Disables data display in data-aware controls associated with the dataset.

 У DBGrid метода DisableControls нет!

И главное, написал же, что проверял.


veb   (2006-04-06 12:20:00) [18]

Какой ужас!
- выключить панель
- забитмапить Grid
- скрыть Grid
- нарисовать Bitmap
- включить панель
- уехать
- уничтожить витмап
- включить грид

Не дай бог, кто-нибудь увидит такое.


Desdechado   (2006-04-06 12:15:00) [19]

> DisableControls отключает обновление данных в DataSet
Чушь. Отключает именно перерисовку.


ЮЮ   (2006-04-06 11:35:00) [20]

Так я и предлагаю запомнить всю видимую часть грида до появления панели.
А затем при полетах панели будет отрисовываться не грид, а битмап.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо