2009-10-03 3 views
1

질문은 간단하지만 나는 그 답을 찾을 수 없습니다.DBGrid의 오른쪽 부분에있는 빈 공간을 제거하는 방법 Delphi

많은 열이있는 DBGrid 구성 요소가있어서 결과적으로 페이지에 맞지 않고 스크롤 막대가 나타납니다. 또한 각 열을 테이블에서 가장 긴 요소 너비로 만드는 열 자동 수정 메커니즘이 있습니다. DBGrid를 오른쪽 끝까지 스크롤하면 마지막 열 다음에 빈 공간이 생깁니다. 이 공간을 없애는 방법?

하나의 해결책은 마지막 열을 빈 공간에 맞게 늘리는 것입니다. 그러나 나는이 빈 공간의 길이를 찾는 법을 모른다. DbGrid.Width 및 DbGrid.ClientWidth는 구성 요소 부분의 길이 만 제공하지만 테이블의 실제 길이는 제공하지 않습니다. 어떤 힌트?

답변

1

솔루션을 찾은 것 같습니다. (조금 이상하게 보일지라도). DBgrid의 열 너비와 실제 너비의 차이를 확인하려면 (즉, 마지막 열 뒤의 빈 공간의 너비를 찾으라는 의미입니다.) 왼쪽에 현재 표시된 열을 추적해야합니다 (현재 열은 무엇입니까? 그것은에 스크롤됩니다). OnDrawColumnCell 이벤트를 사용하면 스크롤 할 수있는 열만 그릴 것이기 때문에이를 수행 할 수 있습니다. 그런 다음 가시적 인 모든 열의 너비 합계를 계산하여 DBGrid의 너비에서 뺍니다. 추신 나쁜 영어

예 코드에 대한 죄송합니다 :

 For i:=0 to Last do 
    if Vis[i] then 
    Begin 
     Sum:=Sum+DBG.Columns[i].Width; 
     Inc(Cnt); 
    End; 

    if dgColLines in DBG.Options then 
    Sum := Sum + Cnt; 

    //add indicator column width 
    if dgIndicator in DBG.Options then 
    Sum := Sum + IndicatorWidth; 
    Dif:=DBG.ClientWidth - Sum; 
5

DBGrid가 원하는대로 작동하도록 만드는 것이 항상 쉬운 것은 아닙니다. 표준 구현으로 한 프로젝트를 수행 한 후 대체 db 그리드를 사용하기로 결정했기 때문에 결코 뒤돌아 보지 않았습니다.

대체 격자를 사용할 수있는 경우 선택할 수있는 옵션이 많습니다. 포인터가 많은 here on SO이라는 주제도 있습니다. 프리 - 소스 옵션 중, 나는 항상 JVCL 프로젝트를 아주 좋아했습니다.

마지막으로 한 가지 팁 : 꿈을 꿀 수있는 것 이상으로 옵션과 맞춤 설정 가능성을 제공하는 그리드가 있습니다. 이 자유도에 비용이 부과됩니다 (예 : 구성 요소를 느리게 만들거나 코드에 통합하기가 어려울 수 있습니다.

1

아래의 대답은 꽤 좋은,하지만이 OnDrawColumnCell 이벤트에 배치됩니다 전혀 때문에 효과가 없습니다, 그래서 많은 수의 행이있는 경우 및/또는 collumns, 성능이 떨어질 수 있습니다.

대신에 페인팅 이벤트에는 없지만 소스 데이터 셋의 AfterOpen (및 AfterRefresh) 이벤트와 동일한 코드를 각 결과 집합에 대해 한 번만 실행하십시오.

관련 문제