2010-09-14 4 views
9

Я добавляю несколько строк в сетку строк из CSV-файла @ runtime. Однако StringGrid, кажется, мерцает, когда он перестраивается, я предположил, что для этого будет начата команда beginupadate/Endupdate. Однако я не могу его найти. Есть ли другой способ остановить мерцание при обновлении идентификатора сетки.Delphi TStringGrid Flicker

Колин

ответ

1
Эти методы объекта `TStrings`. Использование StringGrid1.Rows [i]/Cols [i] .BeginUpdate; ... StringGrid1.Rows [i]/Cols [i] .EndUpdate;

Update

Вы пытались установить DoubleBuffered := true?

+0

Это то, что я думал, однако я использую Delphi 7, и это, похоже, не поддерживается. – colin

+0

Это помогает, однако, полосы прокрутки все еще мелькают – colin

+2

Теперь, когда я просматриваю код, для меня очевидно, что 'TStringGrid' не лучший контроль на планете. Одна вещь, которая мне действительно не нравится с этим контролем, заключается в том, что она не имеет тематики - она ​​выглядит странно в тематическом приложении. Вы уверены, что не можете сделать это с помощью «TListView»? –

-2

Вы можете использовать функцию LockWindowUpdate (AHandle) Windows, чтобы предотвратить обновление элемента управления, а затем LockWindowUpdate (0), чтобы перерисовать его.

Как рукоятка проходит Grid.Handle.

+5

[С какими операциями стоит использовать LockWindowUpdate?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/02/21/1735472.aspx) [С какими операциями LockWindowUpdate не предназначен используется?] (http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx) Используйте ['wm_SetRedraw'] (http://msdn.microsoft.com/en-us /library/dd145219.aspx). –

+0

ОК, тогда вы должны поместить его в ответ не на комментарий –

+1

Я думаю, что Роб объяснял вам, почему ваш ответ был неправильным и ниспровергался, и, следовательно, его комментарий был правильным комментарием (вам). –

2

Да, нет BeginUpdate/EndUpdate в TStringGrid, но есть по рядам или Col:

StringGrid1.Rows[0].BeginUpdate;
StringGrid1.Cols[0].BeginUpdate;

+0

это работает? особенно если приставка переполняется с помощью .Cells? –

14

Лучше поздно, чем никогда ... я использую WM_SETREDRAW. Например:

... 
StringGrid1.Perform(WM_SETREDRAW, 0, 0); 
try 
    // StringGrid1 is populated with the data here 
finally 
    StringGrid1.Perform(WM_SETREDRAW, 1, 0); 
    StringGrid1.Invalidate; // important! to force repaint after all 
end; 
... 
Смежные вопросы