![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запретить перерисовку DBGrida [D7, XP]
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]Так я и предлагаю запомнить всю видимую часть грида до появления панели.
А затем при полетах панели будет отрисовываться не грид, а битмап.