Главная страница
    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.52 MB
Время: 0.015 c
2-1144059818
Khim
2006-04-03 14:23
2006.04.23
TActionMainMenuBar


2-1144660404
Jolik
2006-04-10 13:13
2006.04.23
Инсталляторы.


15-1143647617
Сатир
2006-03-29 19:53
2006.04.23
DAX Error


1-1142710002
Volf_555
2006-03-18 22:26
2006.04.23
Как скопировать текст в буффер обмена с минималь. размером файла?


15-1143797930
Kolan
2006-03-31 13:38
2006.04.23
Пример из книги не соответствует действительности.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский