Заборонити перерисовку dbgrida

Заборонити перерисовку DBGrida

Вітаю! Підкажіть, будь ласка, як заборонити перерисовку DBGrida, коли по ньому рухається інший об'єкт (панель).
Сенс такої:
- заборонити перерисовку
- за таймером висувається панель
- дозволити перерисовку.
Зараз панель рухається дуже повільно, коли в DBGride багато елементів, особливо оздоблених.

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

Швидше за все, ніяк. Кожне вікно має перемальовуватись, якщо що змінилося.

Я не можу зрозуміти: що за панель?

перед появою панелі:
# XA0; Зберегти зображення в бітмапами,
# XA0; сам грід приховати,
# XA0; бітмапами викласти на огляд.
При русі панелі буде просто отрісовиваться цей бітмапами
При приховуванні панелі повернути все взад

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


> А на цьому бітмапи чи вдасться отрисовать відсутні частини
> Гріда?

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

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

> DisableControls відключає оновлення даних в DataSet
Нісенітниця. Відключає саме перерисовку.

Який жах!
- вимкнути панель
- забітмапіть Grid
- приховати Grid
- намалювати Bitmap
- включити панель
- поїхати
- знищити вітмап
- включити грід

Не дай бог, хтось побачить таке.

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

# XA0; У DBGrid методу DisableControls немає!

І головне, написав же, що перевіряв.


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

Природно. DisableControls належить Dataset "у.


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

Переведи. Десь бачиш слово "оновлення"?

Хоча якщо все одно не допомагає, то треба шукати щось інше.

До речі, щось у мене качати твій файл не хоче. Виклади в інше місце.

А ось інтуїтивно:
Якщо відключити сам грід? Тобто наприклад виставити його в Enabled?
Або відключити DrawCell? Так як він викликається саме при відображенні? Вимкнути DrawCell - заховати панель - включити DrawCell?

Якщо що, чур ногами не бити. Хоча б по лицу :)

Якщо при русі панелі розмір / вміст гріда не змінюється, то досить у віконного класу панелі встановити прапор CS_SAVEBITS.
Грід ж не перемальовує, коли на ньому ComboBox відкривається.
Бо нєфіг.

to Ігор
# XA0; Можна трохи детальніше, в якому властивості виставляється прапор?


> # XA0; Можна трохи детальніше, в якому властивості виставляється
> Прапор?

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

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


> Особливо оздоблених.

Чому DrawCell тоді порожній?

to Бугага
# XA0; ну в принципі логіка залізна! Дійсно зловив. Але все одно, припустимо # XA0; що немає прикрашення.

to Ігор
# XA0; тобто. пропонується створити свій компонент панель?


> Але все одно, припустимо # XA0; що немає прикрашення.

Так. Не зрозумів. Так є чи ні?

veb # XA0; (06.04.06 17:24) [20]


> # XA0; тобто. пропонується створити свій компонент панель?

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

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

але сомеваюсь, що цей спосіб допоможе.

У мене виникло сильне підозра, що влаштовано приблизно так:

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

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


> Я прошу вибачення, ви файлик дивилися. )

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

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

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

Господа, прошу вибачення, за некоректно поставлене запитання. Постил код і зрозумів наскільки я ввів всіх в оману. Правда проблема залишилася.
Панель з GRIDOM має властивість align = alClient. а панель, яка рухається # XA0; align = alRight. Рухається панель просто зменшується в розмірах. А панель c DBGridom займає весь простір.

Підкажіть як оптимізувати або, взагалі, як зробити правильно плавний виїзд, заїзд панелі?

to Ігор
# XA0; Гарантую ВІДСУТНІСТЬ шкідливого коду! А жарт про стрибка ехе-шників сподобалася.

> veb # XA0; (07.04.06 12:07) [27]
> Панель з GRIDOM має властивість align = alClient. а панель,
> # XA0; яка рухається # XA0; 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;

Розуміти, інших рекомендацій товаришів це не отмняет, але я вважаю поліпшенням. Але я не тестіл.


> Підкажіть як оптимізувати або, взагалі, як зробити правильно
> Плавний виїзд, заїзд панелі?

Є у мене сильна підозра, що ідеально ніяк.

Схожі статті