Delphi. TStringGrid

На предыдущую страницу…


В процессе формирования…



function StringGrid_AddRow(SG : TStringGrid; YesMoveCursor : boolean=true) : integer;
//добавить пустую строку в TStringGrid
//SG - переменная типа TStringGrid

//YesMoveCursor - если =TRUE, то курсор перемещается на новую строку
//Возвращаемое значение - кол-во строк в SG
begin
  Result:=0;
  if SG<>NIL then begin
     SG.RowCount:=SG.RowCount+1;
     SG.Rows[SG.RowCount-1].Clear;
     if YesMoveCursor then SG.Row:=SG.RowCount-1;
     Result:=SG.RowCount;
  end;
end;

function StringGrid_AddCol(SG : TStringGrid; YesMoveCursor : boolean) : integer;
//добавить пустой столбец в TStringGrid
//SG - переменная типа TStringGrid
//YesMoveCursor - если =TRUE, то курсор перемещается на новый столбец
//Возвращаемое значение - кол-во столбцов в SG
begin
  Result:=0;
  if SG<>NIL then begin
     SG.ColCount:=SG.ColCount+1;
     SG.Cols[SG.ColCount-1].Clear;
     if YesMoveCursor then SG.Col:=SG.ColCount-1;
     Result:=SG.ColCount;
  end;
end;

function StringGrid_InsertRow(SG : TStringGrid; ARow : integer) : boolean;
//вставить пустую строку в TStringGrid в заданную позицию
//SG - переменная типа TStringGrid
//ARow - номер (индекс строки, начиная с нуля), после которой нужно вставить новую строку
//Возвращаемое значение - результат операции
Var
  i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if ARow>=SG.FixedRows then begin
        if ARow<=(SG.RowCount-1) then begin
           SG.RowCount:=SG.RowCount+1;
           for i:=(SG.RowCount-1) downto (ARow+1) do
            begin
              SG.Rows[i].Assign(SG.Rows[i-1]);
           end;
           SG.Rows[ARow].Clear;
           Result:=TRUE;
        end;
     end;
  end;
end;

function StringGrid_InsertCol(SG : TStringGrid; ACol : integer) : boolean;
//вставить пустой столбец в TStringGrid в заданную позицию
//SG - переменная типа TStringGrid
//ACol - номер (индекс столбца, начиная с нуля), после которого нужно вставить новый столюец
//Возвращаемое значение - результат операции
Var
  i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if ACol>=SG.FixedCols then begin
        if ACol<=(SG.ColCount-1) then begin
           SG.ColCount:=SG.ColCount+1;
           for i:=(SG.ColCount-1) downto (ACol+1) do
            begin
              SG.Cols[i].Assign(SG.Cols[i-1]);
           end;
           SG.Cols[ACol].Clear;
           Result:=TRUE;
        end;
     end;
  end;
end;

function StringGrid_DeleteRow(SG : TStringGrid; ARow : integer) : boolean;
//удалить заданную строку из TStringGrid
//SG - переменная типа TStringGrid
//ARow - номер (индекс строки, начиная с нуля), которую нужно удалить
//Возвращаемое значение - результат операции
Var
  N1,N2,i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     N1:=ARow;
     N2:=(SG.RowCount-2);
     if (SG.RowCount-1)>SG.FixedRows then begin
        for i:=N1 to N2 do
         begin
           SG.Rows[i].Assign(SG.Rows[i+1]);
        end;
        SG.Rows[SG.RowCount-1].Clear;
        SG.RowCount:=SG.RowCount-1;
        Result:=TRUE;
     end
     else begin
        SG.Rows[SG.FixedRows].Clear;
        Result:=TRUE;
     end;
  end;
end;

function StringGrid_DeleteCol(SG : TStringGrid; ACol : integer) : boolean;
//удалить заданный столбец из TStringGrid
//SG - переменная типа TStringGrid
//ACol - номер (индекс столбца, начиная с нуля), который нужно удалить
//Возвращаемое значение - результат операции
Var
  N1,N2,i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     N1:=ACol;
     N2:=(SG.ColCount-2);
     if (SG.ColCount-1)>SG.FixedCols then begin
        for i:=N1 to N2 do
         begin
           SG.Cols[i].Assign(SG.Cols[i+1]);
        end;
        SG.Cols[SG.ColCount-1].Clear;
        SG.ColCount:=SG.ColCount-1;
        Result:=TRUE;
     end
     else begin
        SG.Cols[SG.FixedCols].Clear;
        Result:=TRUE;
     end;
  end;
end;

function StringGrid_CopyFromRowToRow(SG : TStringGrid; ARowFrom,ARowTo : integer) : boolean;
//скопировать одну строку в другую
//SG - переменная типа TStringGrid
//ARowFrom - номер (индекс строки, начиная с нуля), которую нужно скопировать
//ARowTo - номер (индекс строки, начиная с нуля), куда нужно скопировать
//Возвращаемое значение - результат операции
Var
  i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if ARowFrom<>ARowTo then begin
        if ARowFrom>=0 then begin
           if ARowFrom<=(SG.RowCount-1) then begin
              if ARowTo>=0 then begin
                 if ARowTo<=(SG.RowCount-1) then begin
                    SG.Rows[ARowTo].Assign(SG.Rows[ARowFrom]);
                    Result:=TRUE;
                 end;
              end;
           end;
        end;
     end;
  end;
end;

function StringGrid_CopyFromColToCol(SG : TStringGrid; AColFrom,AColTo : integer) : boolean;
//скопировать один столбец в другой
//SG - переменная типа TStringGrid
//AColFrom - номер (индекс столбца, начиная с нуля), который нужно скопировать
//AColTo - номер (индекс столбца, начиная с нуля), куда нужно скопировать
//Возвращаемое значение - результат операции
Var
  i : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if AColFrom<>AColTo then begin
        if AColFrom>=0 then begin
           if AColFrom<=(SG.ColCount-1) then begin
              if AColTo>=0 then begin
                 if AColTo<=(SG.ColCount-1) then begin
                    SG.Cols[AColTo].Assign(SG.Cols[AColFrom]);
                    Result:=TRUE;
                 end;
              end;
           end;
        end;
     end;
  end;
end;


function StringGrid_MoveRow(SG : TStringGrid; ARowFrom,ARowTo : integer) : boolean;
//переместить строку из одной позиции (по индексу) - другую
//SG - переменная типа TStringGrid
//ARowFrom - номер (индекс строки, начиная с нуля), которую нужно переместить
//ARowTo - номер (индекс строки, начиная с нуля), куда нужно переместить
//Возвращаемое значение - результат операции
Var
  N : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if ARowFrom<>ARowTo then begin
        if ARowFrom>=SG.FixedRows then begin
           if ARowFrom<=(SG.RowCount-1) then begin
              if ARowTo>=SG.FixedRows then begin
                 if ARowTo<=(SG.RowCount-1) then begin
                    if StringGrid_InsertRow(SG, ARowTo) then begin
                       N:=ARowFrom;
                       if ARowFrom>ARowTo then N:=ARowFrom+1;
                       if StringGrid_CopyFromRowToRow(SG, N, ARowTo) then begin
                          if StringGrid_DeleteRow(SG, N) then begin
                             Result:=TRUE;
                          end;
                       end;
                    end;
                 end;
              end;
           end;
        end;
     end;
  end;
end;


function StringGrid_MoveCol(SG : TStringGrid; AColFrom,AColTo : integer) : boolean;
//переместить столбец из одной позиции (по индексу) - другую
//SG - переменная типа TStringGrid
//AColFrom - номер (индекс столбца, начиная с нуля), который нужно переместить
//AColTo - номер (индекс столбца, начиная с нуля), куда нужно переместить
//Возвращаемое значение - результат операции
Var
  N : integer;
begin
  Result:=FALSE;
  if SG<>NIL then begin
     if AColFrom<>AColTo then begin
        if AColFrom>=SG.FixedCols then begin
           if AColFrom<=(SG.ColCount-1) then begin
              if AColTo>=SG.FixedCols then begin
                 if AColTo<=(SG.ColCount-1) then begin
                    if StringGrid_InsertCol(SG, AColTo) then begin
                       N:=AColFrom;
                       if AColFrom>AColTo then N:=AColFrom+1;
                       if StringGrid_CopyFromColToCol(SG, N, AColTo) then begin
                          if StringGrid_DeleteCol(SG, N) then begin
                             Result:=TRUE;
                          end;
                       end;
                    end;
                 end;
              end;
           end;
        end;
     end;
  end;
end;
function StringGrid_ChangeRow(SG : TStringGrid; ARow1,ARow2 : integer) : boolean;
//поменять строки местами
//SG - переменная типа TStringGrid
//ARow1 и ARow1 - строки (их индексы, начиная с нуля), которые нужно поменять местами
//Возвращаемое значение - результат операции
begin
  Result:=FALSE;
  if SG<>NIL then begin
  if ARow1<>ARow2 then begin
     if ARow1>=SG.FixedRows then begin
        if ARow1<=(SG.RowCount-1) then begin
           if ARow2>=SG.FixedRows then begin
              if ARow2<=(SG.RowCount-1) then begin
                 StringGrid_AddRow(SG,FALSE);
                 if StringGrid_CopyFromRowToRow(SG, ARow1, SG.RowCount-1) then begin
                    if StringGrid_CopyFromRowToRow(SG, ARow2, ARow1) then begin
                       if StringGrid_CopyFromRowToRow(SG, SG.RowCount-1, ARow2) then begin
                          SG.Rows[SG.RowCount-1].Clear;
                          SG.RowCount:=SG.RowCount-1;
                          Result:=TRUE;
                       end;
                    end;
                 end;
              end;
           end;
        end;
     end;
  end;
  end;
end;

function StringGrid_ChangeCol(SG : TStringGrid; ACol1,ACol2 : integer) : boolean;
//поменять столбцы местами
//SG - переменная типа TStringGrid
//ACol1 и ACol2 - столбцы (их индексы, начиная с нуля), которые нужно поменять местами
//Возвращаемое значение - результат операции
begin
  Result:=FALSE;
  if SG<>NIL then begin
  if ACol1<>ACol2 then begin
     if ACol1>=SG.FixedCols then begin
        if ACol1<=(SG.ColCount-1) then begin
           if ACol2>=SG.FixedCols then begin
              if ACol2<=(SG.ColCount-1) then begin
                 StringGrid_AddCol(SG,FALSE);
                 if StringGrid_CopyFromColToCol(SG, ACol1, SG.ColCount-1) then begin
                    if StringGrid_CopyFromColToCol(SG, ACol2, ACol1) then begin
                       if StringGrid_CopyFromColToCol(SG, SG.ColCount-1, ACol2) then begin
                          SG.Cols[SG.ColCount-1].Clear;
                          SG.ColCount:=SG.ColCount-1;
                          Result:=TRUE;
                       end;
                    end;
                 end;
              end;
           end;
        end;
     end;
  end;
  end;
end;


Продолжение следует…


На предыдущую страницу…


Дата: 23.10.2022