Заборонити перерисовку 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;
Розуміти, інших рекомендацій товаришів це не отмняет, але я вважаю поліпшенням. Але я не тестіл.
> Підкажіть як оптимізувати або, взагалі, як зробити правильно
> Плавний виїзд, заїзд панелі?
Є у мене сильна підозра, що ідеально ніяк.