Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Запретить перерисовку DBGrida   Найти похожие ветки 

 
veb   (2006-04-04 10:58) [0]

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


 
Бугага ©   (2006-04-04 19:12) [1]

DisableControls?


 
veb   (2006-04-04 23:46) [2]

Нет!
DisableControls отключает обновление данных в DataSet
А мне нужна перерисовка DBGrid.
Конечно, я пробовал DisableControls - не помагает, панель сверху по DBGrid движется все равно очень медленно.


 
Германн ©   (2006-04-05 02:29) [3]

Скорее всего, никак. Каждое окно должно перерисовываться, если что изменилось.


 
Бугага ©   (2006-04-05 03:26) [4]

Я не могу понять: что за панель?


 
veb   (2006-04-05 21:33) [5]

думаю, что проще посмотреть, чем на пальцах объяснять:
скачайте
http://crimeasoft.narod.ru/Download/VideoCat.exe
и на вкладке фильмы нажмите кнопку скрытия панели.
Так вот, эта панель зависит от количества элементов DBGrida. При большом количестве все мигает и дергается.


 
ЮЮ ©   (2006-04-06 06:13) [6]

перед появлением панели:
 Сохранить изображение в битмап,
 сам грид скрыть,
 битмап выложить на обозрение.
При движении панели будет просто отрисовываться этот битмап
При сокрытии панели вернуть всё взад

З.Ы. Если раздражает только мигание, а не скорость, часто достаточно установить DobleBeffered в True (в run-time, ибо св-во не опубликовано) у компонента, на котором находится грид


 
KSergey ©   (2006-04-06 09:48) [7]

Предлагаю:
а) двигать панель не на пиксель каждый раз, а на кол-во пикселей, пропорционально затраченному времени прошлого сдвига. Ну и зафиксировать общее желаемое время сдвига. Тогда уезжать будет за одно (примерно) время.

А вообще, если уж хочется вообще красиво - есть подозрение, что ЮЮ прав... Хоть и противно лично мне такое решение :). Кроме того, панелька при "уезжании" тоже вень не приглядно выглядит - а в варианте с bitmap можно и ее забитмапить.

> ЮЮ ©   (06.04.06 06:13) [6]
>  Сохранить изображение в битмап,
>  сам грид скрыть,
>  битмап выложить на обозрение.
> При движении панели будет просто отрисовываться этот битмап

А на этом битмапе удасться ли отрисовать недостающие части грида?.. чего-то сомнение меня разбирать начали, что это вообще получится...


 
ЮЮ ©   (2006-04-06 09:59) [8]


> А на этом битмапе удасться ли отрисовать недостающие части
> грида?


Недостающие-то зачем? Насколько я понял, пока панель плывет, грид не меняется.


 
KSergey ©   (2006-04-06 11:29) [9]

> ЮЮ ©   (06.04.06 09:59) [8]
> > А на этом битмапе удасться ли отрисовать недостающие части
> > грида?
> Недостающие-то зачем? Насколько я понял, пока панель плывет,
>  грид не меняется.

Панель, уплывая, открывает грид. Т.е. становятся видимы новые колонки грида.


 
ЮЮ ©   (2006-04-06 11:35) [10]

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


 
Desdechado ©   (2006-04-06 12:15) [11]

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


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

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

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


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

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

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

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


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


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

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


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

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

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

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


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

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

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


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

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


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

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

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


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


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


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

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


 
Бугага ©   (2006-04-06 15:48) [19]


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

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


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

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

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


 
Бугага ©   (2006-04-06 18:56) [21]


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

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


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

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);

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


 
KSergey ©   (2006-04-07 09:43) [23]

> Игорь Шевченко ©   (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-07 11:03) [24]

KSergey ©   (07.04.06 09:43) [23]


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


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


 
KSergey ©   (2006-04-07 11:55) [25]

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

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

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


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

Панель уезжает по таймеру (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;


 
veb   (2006-04-07 12:07) [27]

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

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

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


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

KSergey ©   (07.04.06 11:55) [25]

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


 
KSergey ©   (2006-04-07 13:44) [29]

> 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;

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.045 c
15-1144167745
Kerk
2006-04-04 20:22
2006.04.23
Visual Fox Pro?


8-1132575902
wicked
2005-11-21 15:25
2006.04.23
кватернионы и преобразования...


15-1143661111
Piter
2006-03-29 23:38
2006.04.23
Лукьяненко - "Черновик"


15-1143693264
DelphiN!
2006-03-30 08:34
2006.04.23
Вывод чека на ККМ Меркурий-130Ф


15-1144048367
tria
2006-04-03 11:12
2006.04.23
Хочу портировать свою программу на Линукс. Посоветуйте плиз, как.