Вставка и удаление строк в StringGrid
Вставка и удаление строк в StringGrid
Автор: Dennis Passmore
...я не нашел никаких методов для вставки и удаления
строк...
Поскольку свойство Cols[x] компонента TStringGrid реально является
компонентом TStrings, все методы TStrings применимы также и к Cols[x].
Недавно в интернете я нашел реализацию расширенных функций TStringGrid:
(*
Создано: Dennis Passmore
1929 Mango Tree Drive
Edgewater, Fl. 32141
CIS: 71640,2464
Март 1, 1996
Данный код свободен в использовании при одном условии:
в исходном коде должна присутствовать указанная выше кредитка
со ссылкой на автора.
Примечание по использованию кода:
Всякий раз при удалении Row (строки) или Column (колонки)
проверяйте наличие и удаляйте любые объекты, которые могли
быть назначены любой ячейке в строке или колонке, которые вы
собираетесь удалять, поскольку данный код не может знать ни
размера, ни типа ассигнованных ими объектов.
*)
unit GridFunc;
interface
uses
Sysutils, WinProcs, Grids;
procedure InsertRow(Sender: TStringGrid; ToIndex: Longint);
procedure DeleteRow(Sender: TStringGrid; FromIndex: Longint);
procedure InsertColumn(Sender: TStringGrid; ToIndex: Longint);
procedure DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
implementation
type
TCSGrid = class (TStringGrid)
private
public
procedure MoveRow(FromIndex, ToIndex: Longint);
procedure MoveColumn(FromIndex, ToIndex: Longint);
end ;
procedure TCSGrid.MoveRow(FromIndex, ToIndex: Longint);
begin
RowMoved(FromIndex, ToIndex); { Защищенный метод TStringGrid }
end ;
procedure TCSGrid.MoveColumn(FromIndex, ToIndex: Longint);
begin
ColumnMoved(FromIndex, ToIndex); { Защищенный метод TStringGrid }
end ;
procedure InsertRow(Sender: TStringGrid; ToIndex: Longint);
var
xx, yy: Integer;
begin
if ToIndex >= 0 then
with TCSGrid(Sender) do
if (ToIndex <= RowCount) then
begin
RowCount := RowCount + 1;
xx := RowCount - 1;
for yy := 0 to ColCount - 1 do
begin
Cells[yy, xx] := ' ';
ObJects[yy, xx] := nil ;
end ;
if ToIndex < RowCount - 1 then
MoveRow(RowCount - 1, ToIndex);
end
else
MessageBeep(0)
else
MessageBeep(0);
end ;
procedure DeleteRow(Sender: TStringGrid; FromIndex: Longint);
begin
if FromIndex > l;
= 0 then
with TCSGrid(Sender) do
if (RowCount > 0) and (FromIndex < RowCount) then
begin
if (FromIndex < RowCount - 1) then
MoveRow(FromIndex, RowCount - 1);
Rows[RowCount - 1].Clear;
RowCount := RowCount - 1;
end
else
MessageBeep(0)
else
MessageBeep(0);
end ;
procedure InsertColumn(Sender: TStringGrid; ToIndex: Longint);
var
xx, yy: Integer;
begin
if ToIndex >= 0 then
with TCSGrid(Sender) do
if (ToIndex <= ColCount) then
begin
ColCount := ColCount + 1;
xx := ColCount - 1;
Cols[xx].BeginUpdate;
for yy := 0 to RowCount - 1 do
begin
Cells[xx, yy] := ' ';
ObJects[xx, yy] := nil ;
end ;
Cols[xx].EndUpdate;
if ToIndex < ColCount - 1 then
MoveColumn(ColCount - 1, ToIndex);
end
else
MessageBeep(0)
else
MessageBeep(0);
end ;
procedure DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
begin
if FromIndex >= 0 then
with TCSGrid(Sender) do
if (ColCount > 0) and (FromIndex < ColCount) then
begin
if (FromIndex < ColCount - 1) then
MoveColumn(FromIndex, ColCount - 1);
Cols[ColCount - 1].Clear;
ColCount := ColCount - 1;
end
else
MessageBeep(0)
else
MessageBeep(0);
end ;
end .
Here's the translation of the content into Russian:
Код с комментариями, улучшениями и альтернативным решением.
unit GridFunc ;
interface
uses
Sysutils , WinProcs , Grids ;
procedure InsertRow ( Sender : TStringGrid ; ToIndex : Longint ) ;
procedure DeleteRow ( Sender : TStringGrid ; FromIndex : Longint ) ;
procedure InsertColumn ( Sender : TStringGrid ; ToIndex : Longint ) ;
procedure DeleteColumn ( Sender : TStringGrid ; FromIndex : Longint ) ;
implementation
type
TCSGrid = class ( TStringGrid )
private
procedure MoveRow ( FromIndex , ToIndex : Longint ) ;
procedure MoveColumn ( FromIndex , ToIndex : Longint ) ;
public
constructor Create ;
end ;
constructor TCSGrid . Create ;
begin
end ;
procedure TCSGrid . MoveRow ( FromIndex , ToIndex : Longint ) ;
begin
RowMoved ( FromIndex , ToIndex ) ; { защищенный метод TStringGrid }
end ;
procedure TCSGrid . MoveColumn ( FromIndex , ToIndex : Longint ) ;
begin
ColumnMoved ( FromIndex , ToIndex ) ; { защищенный метод TStringGrid }
end ;
procedure InsertRow ( Sender : TStringGrid ; ToIndex : Longint ) ;
var
xx , yy : Integer ;
begin
if ( ToIndex >= 0 ) then
with TCSGrid ( Sender ) do
if ( ToIndex <= RowCount ) then
begin
RowCount := RowCount + 1 ;
xx := RowCount - 1 ;
for yy := 0 to ColCount - 1 do
begin
Cells [ yy , xx ] := ' ' ; { Альтернативное решение: очистка ячейки пробелом }
ObJects [ yy , xx ] := nil ;
end ;
if ToIndex < RowCount - 1 then
MoveRow ( RowCount - 1 , ToIndex ) ;
end
else
MessageBeep ( 0 )
else
MessageBeep ( 0 ) ;
end ;
procedure DeleteRow ( Sender : TStringGrid ; FromIndex : Longint ) ;
begin
if ( FromIndex > 0 ) then
with TCSGrid ( Sender ) do
if ( RowCount > 0 ) and ( FromIndex < RowCount ) then
begin
if ( FromIndex < RowCount - 1 ) then
MoveRow ( FromIndex , RowCount - 1 ) ;
Rows [ RowCount - 1 ] . Clear ;
RowCount := RowCount - 1 ;
end
else
MessageBeep ( 0 )
else
MessageBeep ( 0 ) ;
end ;
procedure InsertColumn ( Sender : TStringGrid ; ToIndex : Longint ) ;
var
xx , yy : Integer ;
begin
if ( ToIndex >= 0 ) then
with TCSGrid ( Sender ) do
if ( ToIndex <= ColCount ) then
begin
ColCount := ColCount + 1 ;
xx := ColCount - 1 ;
Cols [ xx ] . BeginUpdate ;
for yy := 0 to RowCount - 1 do
begin
Cells [ xx , yy ] := ' ' ; { Альтернативное решение: очистка ячейки пробелом }
ObJects [ xx , yy ] := nil ;
end ;
Cols [ xx ] . EndUpdate ;
if ToIndex < ColCount - 1 then
MoveColumn ( ColCount - 1 , ToIndex ) ;
end
else
MessageBeep ( 0 )
else
MessageBeep ( 0 ) ;
end ;
procedure DeleteColumn ( Sender : TStringGrid ; FromIndex : Longint ) ;
begin
if ( FromIndex >= 0 ) then
with TCSGrid ( Sender ) do
if ( ColCount > 0 ) and ( FromIndex < ColCount ) then
begin
if ( FromIndex < ColCount - 1 ) then
MoveColumn ( FromIndex , ColCount - 1 ) ;
Cols [ ColCount - 1 ] . Clear ;
ColCount := ColCount - 1 ;
end
else
MessageBeep ( 0 )
else
MessageBeep ( 0 ) ;
end ;
end .
В этом коде включен конструктор для класса TCSGrid
, который не был предоставлен в оригинальном коде. Процедуры MoveRow
и MoveColumn
вызываются при вставке или удалении строк или столбцов, чтобы обеспечить правильный порядок таблицы.
Альтернативное решение - очистка ячейки пробелом вместо оставления ее пустой.
В статье рассмотрено вставку и удаление строк в StringGrid, а также создано расширенное утилита, позволяющее выполнять эти операции с использованием методов TStrings.
Комментарии и вопросы Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: TStringGrid и TDrawGrid ::