C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[46414] Re:StringGrid 열의 너비 수정이 안되네요. ㅠ_ㅠ 고수님들, 답변 좀 부탁드립니다.
장성호 [nasilso] 1037 읽음    2006-09-01 18:57
전에도 똑같은 질문 올리셨죠?

기본적으로는 TStringGrid * 에서는 안되기 때문에.. 답변을 못해드렸는데...

아래코드는 직접 코딩으로 구현한것입니다.
MouseDown , MouseMove , MouseUp 이벤트를 이용했습니다.

급하게 만들어서 문제가 좀 있습니다.

[문제들]
  1. 스크롤바가 생겼을때 처리  ( 옆으로 옮긴 위치만큼 처리안됨)
  2. Paint문제가 좀 있는것 같아요
  3. Click할때 Cell이 선택되는 문제...

그대로 가져가셔서 붙인후 테스트 해보세요

위 몇가지 문제만 해결하면 쓸만할 겁니다.  (특히 1번문제 반드시 처리해야함)

시간이 없어서 이만..
조만간 시간되면 위에 문제도 해결해서 올려드릴께요

그럼




==========<<샘플>>===========================================================
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool bSize;
TPoint FsPoint,LaPoint;
int iColNum;
TColor clPenColor;
TPenMode  pmPenMode;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    //
    for(int r=0;r<sgrd->RowCount;r++)
    {
        for(int c=0;c<sgrd->RowCount;c++)
        {
            sgrd->Cells[r][c]=IntToStr(r)+" - "+IntToStr(c);
        }
    }

    pmPenMode=sgrd->Canvas->Pen->Mode;
    clPenColor=sgrd->Canvas->Pen->Color;
    sgrd->Options=sgrd->Options>>goColSizing;
}
//---------------------------------------------------------------------------
int __fastcall IABS(int a ,int b)
{
    if(a>b)return a-b;
    else b-a;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::sgrdMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    if(sgrd->Cursor==crHSplit)
    {
        bSize=true;
        FsPoint.x=X;
        FsPoint.y=0;
        LaPoint.x=X;
        LaPoint.y=sgrd->RowCount*(sgrd->DefaultRowHeight+sgrd->GridLineWidth);


        sgrd->Canvas->Pen->Mode=pmNot;
        sgrd->Canvas->Pen->Color=clBlack;
        sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
        sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);
        sgrd->Canvas->Pen->Mode=pmPenMode;
        sgrd->Canvas->Pen->Color=clPenColor;

    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::sgrdMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    if(bSize)
    {
        sgrd->Canvas->Pen->Mode=pmNot;
        sgrd->Canvas->Pen->Color=clBlack;
        sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
        sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);

        FsPoint.x=X;
        FsPoint.y=0;
        LaPoint.x=X;
        LaPoint.y=sgrd->RowCount*(sgrd->DefaultRowHeight+sgrd->GridLineWidth);
        sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
        sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);
        sgrd->Canvas->Pen->Mode=pmPenMode;
        sgrd->Canvas->Pen->Color=clPenColor;
        //enum TPenMode {pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy, pmMergePenNot, pmMaskPenNot, pmMergeNotPen, pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor};


    }
    else
    {
        if(!Shift.Contains(ssLeft))
        {
            int iX=0;
            for(int c=0;c<sgrd->RowCount;c++)
            {
                iX=iX+sgrd->ColWidths[c]+1;
                if(IABS(iX,X)<2)
                {
                    sgrd->Cursor=crHSplit;
                    iColNum=c;
                    sgrd->Options>>goRangeSelect;
                    return;
                }
            }
        }
        if(sgrd->Cursor==crHSplit)
        {
            sgrd->Cursor=crDefault;//
            sgrd->Options=sgrd->Options<<goRangeSelect;
        }
    }

}
//---------------------------------------------------------------------------


void __fastcall TForm1::sgrdMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{

    sgrd->Invalidate();
    sgrd->Canvas->Pen->Color=clWhite;
    if(bSize)
    {
        int iX=0;
        for(int c=0;c<iColNum;c++)
        {
            iX=iX+sgrd->ColWidths[c]+1;
        }

        sgrd->ColWidths[iColNum]=X-iX;
    }
    bSize=false;
    sgrd->Cursor=crDefault;
    sgrd->Options=sgrd->Options<<goRangeSelect;

}
//---------------------------------------------------------------------------



쥐르미온 님이 쓰신 글 :
: 회섹으로 된 고정셀의 경우, 마우스를 셀의 경계선쪽으로 가져가면 열이나 너비를 수정할 수가 있게 되는데요. 일반 셀에서는 그것이 불가능합니다.
:
: 맨윗줄을 회색의 고정셀로 하지 않고도 너비 수정을 할 수 있었으면 좋겠는데요. 어떻게 해야하죠?

+ -

관련 글 리스트
46405 StringGrid 열의 너비 수정이 안되네요. ㅠ_ㅠ 고수님들, 답변 좀 부탁드립니다. 쥐르미온 912 2006/09/01
46414     Re:StringGrid 열의 너비 수정이 안되네요. ㅠ_ㅠ 고수님들, 답변 좀 부탁드립니다. 장성호 1037 2006/09/01
46417         Re:Re:StringGrid 열의 너비 수정... 위 답변을 조금 수정하여... 장성호 1058 2006/09/02
46425             Re:Re:Re:StringGrid 열의 너비 수정, 위 답변을 또 조금 수정하여...( 설명 포함 ) 장성호 1357 2006/09/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.