Текущий архив: 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