2013-05-03 3 views

답변

11
다음

만 해봤 코드가 마지막 행을 삭제하는 경우, 당신은 아마 단지를 감소시키는 것 : TCustomGrid의 모든 자손이 자동으로 다른 모든 그리드 방법처럼 호출 할 수있는 DelRow 방법을해야합니다 RowCount 속성 실제로 행 목록의 에서 항상 수정됩니다. 이를 염두에두고, 더 이상 필요없는 행이 마지막 행이되도록 코드를 작성하고 다음에 마지막 행을 삭제하십시오. (가장 직접적인 방법은 이동 행에있을 것이고, 당신은뿐만 아니라 단지 call DeleteRow 대신. 수 있지만, 거기에 MoveRow 방법은, 그러나 당신이 보호 된 메서드를 호출 할 경우가. 보호거야)

공공에만 사용 게시 된 멤버가 있으면 임의의 행을 삭제하는 루프를 작성할 수 있습니다. 다음 각 행

procedure DeleteRow(Grid: TStringGrid; ARow: Integer); 
var 
    i: Integer; 
begin 
    for i := ARow to Grid.RowCount - 2 do 
    Grid.Rows[i].Assign(Grid.Rows[i + 1]); 
    Grid.RowCount := Grid.RowCount - 1; 
end; 

이 복사 내용을 위의 행에 삭제할 하나 예를 들어, 다음 Scalabium Software's FAQ on this topic에서 영감을 몇 가지 코드가있다. 루프가 끝나면 삭제하려는 행이 바로 아래 행에 의해 덮어 쓰여지고 마지막 행의 사본이 두 개 있습니다. 그런 다음 최종 행을 삭제합니다.당신은 단지 객체를 필요로하는 경우 (자신처럼 동적으로 대신 셀 내용의 객체로부터 세포에서 데이터를 그리기),

DeleteRow(Grid, Grid.Row); 
+0

추가 :

이 같은 함수를 호출, 그리드의 현재 행을 삭제하려면 두번째 라인을'Grid.Objects [0, I] : = Grid.Objects [0, I + 1];로 대체한다. 이것은 심지어 사용되지 않는 전체 내용을 대체하는 것보다 약간 더 빠릅니다. –

9

그리드의 선택된 행은 속성으로 지정됩니다.

TCustomGrid에는 DeleteRow 메서드가 있지만 보호되어 있으므로 해당 클래스의 자손 내에서만 예외를 호출 할 수 있습니다. 그러나 이러한 제한을 우회하는 것은 쉽습니다. TCustomGrid 하위 항목을 선언하고 해당 새 형식으로 표 컨트롤을 입력합니다. 결과에 DeleteRow로 전화하십시오. 델파이, 보호 가시성 회원이 클래스의 선언과 같은 단위 내에서 암시 적으로 공공 때문에

type 
    TCustomGridAccess = class(TCustomGrid) end; 

procedure DeleteGridRow(g: TCustomGrid; row: Integer); 
begin 
    TCustomGridAccess(g).DeleteRow(row); 
end; 

이 작동합니다. TCustomGrid그리드 단위로 선언되어 있지만 TCustomGridAccess 클래스는 단위로 단위로 선언되므로 해당 단위는 DeleteRow을 비롯한 모든 보호 된 방법에 액세스 할 수 있습니다. 델파이 버전은 충분히 새로운 경우


, 당신은 클래스 헬퍼를 사용할 수 있습니다. 클래스 도우미는 보호 된 멤버에 액세스 할 수 있으며 기술적으로 관련이없는 유형에 대해서는 형변환을 요구하지 않습니다.

type 
    TCustomGridHelper = class helper for TCustomGrid 
    public 
    procedure DelRow(ARow: Integer); 
    end; 

procedure TCustomGridHelper.DelRow(ARow: Integer); 
begin 
    Self.DeleteRow(ARow); 
end; 

그런 다음 헬퍼를 선언 한 곳에서 장치를 사용하십시오.

grid.DelRow(grid.Row); 
관련 문제