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
[46502] Re:재질문 드립니다
장성호 [nasilso] 1111 읽음    2006-09-11 14:45
@첫번째 질문에 대해...

먼저 답변의 샘플 코드에 보면 if ( ARow == 3 )  이런 경우에만 빨간색 줄을 긋도록 되어있습니다.
저부분을 상황에따라  Delete클릭한 row만 되도록 바꾸면 되겠죠...

아래 샘플은 row가 128개 이하로 가정하고 코딩한것입니다.
1. bool형 배열을 grid의  rowcount이상으로 선언해 놓습니다.
2. popupmenu에서 delete클릭한 row의 해당  bool 배열에 true로 합니다.
3. grid의 DrawCell이벤트에서 bool형 배열에서 ture로 되어있는 row만 빨간 줄을 긋습니다.


[샘플]
bool bGridRowDel[128]={false};
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    if(ARow<128)
    {
        if(bGridRowDel[ARow])
        {
            StringGrid1->Canvas->Pen->Color=clRed;
            StringGrid1->Canvas->MoveTo(Rect.left,(Rect.top+Rect.bottom)/2);
            StringGrid1->Canvas->LineTo(Rect.right,(Rect.top+Rect.bottom)/2);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pm_DelGridRowClick(TObject *Sender)
{
    if(StringGrid1->Row<128)
    {
        bGridRowDel[StringGrid1->Row]=true;
        StringGrid1->Refresh();
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::pmm_CancelDeleterowClick(TObject *Sender)
{
    if(StringGrid1->Row<128)
    {
        bGridRowDel[StringGrid1->Row]=false;
        StringGrid1->Refresh();
    }
}
//---------------------------------------------------------------------------

위와같이 하면 Grid의 RowCount가 bool형 배열에 선언된  숫자보다 작거나 같은경우에는 문제없는데
RowCount가 많아지가나 계속 가변인 경우는 어떻게 할것인지 의문이 생기지 않습니까?

* 무식한 방법이지만 bool형 배열을 엄청 크게 잡아 놓는 방법이 있구
* Grid의 특정컬럼의 wid를 0로 만들어 그 컬럼에 delete정보를  숨겨두는 방법도 있습니다.
* 그리고 또  rowcount가 증가하면 증가한 만큼 bool형 배열을 new 해서 head에 잡아주는 방법이 있죠


@ 두번째 질문에 대해....
음....
뭐라 답해야 하남.....

간단하게 String 변수에 아래와 같이 변수에 값이 들어있다고 가정합시다.
String str="abcd,23d,3,4,5,6,1,2,31,23,23,23,2,3";
위 str에서 콤마(",")를 기준으로 짤라는 겁니다.

어떻게 짜르느냐는 질문까지는 하시렵니까?
AnsiString클래스에   파싱관련 함수들이 많습니다.
pos , substring ...등등...

위 str 변수에서 첫번째 abcd만 짤라 내려면 ..
int ipos=str.Pos(",");
String tstr=str.SubString(1,ipos); //이렇게 하면 맨첫번째 콤마 까지의 string인 abcd만 짤려나올겁니다.

그럼 두번째 세번째.. 는?
효율적이라고는 할수 없지만
위에 두 함수를 반복해서 잘 이용하면  충분히 가능합니다. (pos , substring)


이승현 님이 쓰신 글 :
: 가르쳐주신 방법, DrawCell 이벤트에 코딩을 하면, 프로그램이 시작되니 바로 선이 긋고 시작하더군요.
: 그리고 줄이 그어졌는데, 그 위에 글 위에 겹쳐지는것이 아니라, 줄이 그어지고 그 위에 글씨가 올라가더군요(첨부파일참고).
: 현재 제가 필요한 방법은 마우스 오른쪽으로 팝업창을 호출하고, 그 안에 있는 삭제를 눌렀을시에
: 줄이 그어지는 것이 필요합니다만, switch문을 사용해야 하는건가... 활용을 어떻게 해야할지 모르겠습니다.
:
: 그리고 묶어서 보내는 것을 예시로 적어주셨는데, 반대로 서버에서 이것을 풀어주는 걸 어떻게 해야 할런지...
: 죄송하지만 한번 더 질문하겠습니다.
:
:
: 장성호 님이 쓰신 글 :
: : 답변1 ) 질문 : StringGrid에 특정Row에 글자Font를 바꾼다던가? 줄글 긋는 작업을 할수 있나요?
: :
: : 답변 :  DrawCell이벤트때  내가 원하는 코딩을 하시면 됩니다.
: :
: : void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
: :       int ARow, TRect &Rect, TGridDrawState State)
: : {
: :    TCanvas *canvas=StringGrid1->Canvas;
: :     if(ARow==3)     // row==3인 모든 Cell에 가운데 빨간 줄을 긋는다.
: :     {
: :         canvas->Pen->Color=clRed;
: :         canvas->MoveTo(Rect.left,(Rect.top+Rect.bottom)/2);
: :         canvas->LineTo(Rect.right,(Rect.top+Rect.bottom)/2);
: :     }
: :     else if(ARow==4)//row==4인 모든 Cell은 모두 text를 오른쪽 정렬 한다.
: :     {
: :         String cell=StringGrid1->Cells[ACol][ARow];
: :         int LeftPos = Rect.Right - canvas->TextWidth(cell) + canvas->Font->Height / 4;//str_gap;
: :         int gab = ((Rect.Height() - canvas->TextHeight(cell)) / 2);
: :         canvas->FillRect(Rect);
: :         canvas->Brush->Color=clRed;
: :        canvas->TextOut(LeftPos, Rect.Top+gab, cell);
: :         canvas->Brush->Color=clWhite;
: :     }
: : }
: : //---------------------------------------------------------------------------
: :
: :
: : 답변2 ) ; 각 Grid의 Cell의 string을 Socket 으로 서버에 빨리 보낼수 있는 방법 있나요?
: :
: : 답변:
: :    - 방법은 여러가지가 있습니다만
: :    - 먼저 님의 코딩에서는 Timer를 통해서 한 Cell씩 text를 보내는 방법을  수정해야 할것 같습니다.
: :
: :   1)
: :    -  계속 반복해서 보내시구요,
: :    - Data가 많으면 전송 끝날때 까지 Program이 먹통이 되는것을 막기위해서는 메세지 처리하도록 코딩을...
: :    - 샘플 : GridCellTextSend1
: :
: :    2)
: :     -  한줄씩 묶어서 보냅니다. (한 row씩 text 를 구분자로 구분해서 붙여서...)
: :     -  문론 이때는 받는쪽에서 구분자를 기준으로 짤라야 되죠..
: :     - 구분자는  cells에 text에 없는것으로 해야 되겠죠...
: :     - 샘플 :GridCellTextSend2
: :   
: :    3) 기타
: :     - 괭장이 Data가 커서 ... 한번에 여러줄씩 묶어서 보내는데도 몇십초에서 몇분이 걸리는 경우는?
: :     -  압축해서 보내는 방법이 있을것같습니다. (전송시간이 10초 안이면  그냥 1,2번 방법 적절히 활용해서...)
: :     -  샘플 : 없음
: :
: : 참고로...
: : text를 전송할때 패킷을 정의 해서 보내는 것을 권장합니다.
: : 이런식으로 :  stx , cmd , len , data , etx
: :
: :    
: : void __fastcall GridCellTextSend1(TStringGird *sGrid);
: : void __fastcall GridCellTextSend2(TStringGird *sGrid);
: :
: : void __fastcall TMain::Btn_SendClick(TObject *Sender)
: : {
: :     try
: :     {
: :         Btn_Send->OnClick=NULL;
: :         GridCellTextSend1(StringGrid1);
: :     }
: :     __finally
: :     {
: :         Btn_Send->OnClick=Btn_SendClick;
: :     }
: : }
: : void __fastcall GridCellTextSend1(TStringGird *sGrid)
: : {
: :     for(int  iRow=0;iRow<sGrid->RowCount;iRow++)
: :     {
: :         for(int iCol=0; iCol<sGrid->ColCount;iCol++)
: :         {
: :             cs1->Socket->SendText(sGrid->Cells[iCol][iRow]);
: :             Application->ProcessMessages();
: :         }
: :     }
: : }
: : void __fastcall GridCellTextSend2(TStringGird *sGrid)
: : {
: :     String sRowStr;
: :     for(int  iRow=0;iRow<sGrid->RowCount;iRow++)
: :     {
: :         sRowStr="ROW"+IntToStr(iRow)+":";
: :         for(int iCol=0; iCol<sGrid->ColCount;iCol++)
: :         {
: :             sRowStr=sRowStr+sGrid->Cells[iCol][iRow]+",";
: :         }
: :         cs1->Socket->SendText(sRowStr);
: :         Application->ProcessMessages();
: :     }
: : }
: :
: : //---------------------------------------------------------------------------
: :
: : 
: :
: : 이승현 님이 쓰신 글 :
: : : 일전에 임프님이 올려주신 StringGrid 컴포넌트를 사용중입니다.
: : : 현재 마우스 오른쪽 버튼을 눌러서 팝업창을 생성 시킨 후,
: : : 삭제라는 것을 클릭하면 그 해당 Row 한 줄이 중간에 줄이 좌악 거지거나,
: : : 아니면 특정 셀의 색깔이 빨간색으로 변하면서(글씨도 괜찮고, 셀 자체도 괜찮습니다)
: : : 삭제된걸 표시해주는 프로그래밍을 해보려고 합니다.
: : :
: : : 사실, 원래 C에서 지원해주는 StringGrid에서 그것을 지원하는지도 잘 모르겠고,
: : : 특히 임프님이 만들어주신 컴포넌트에도 그것이 있는지 잘 모르겠더군요.
: : : 혹시 이것이 가능하다면 자세히 설명 좀 부탁드리겠습니다.
: : :
: : : 추가적으로...
: : :
: : : 지금은 한 Row에 1번부터 10번이 있으면
: : : 1번을 보내고, 2번을 보내고, 3번을 보내고 이렇게 각 Col의 데이터를 하나씩 보내게 되어있습니다.
: : : 보내진 데이터는 리스트박스에 일단 들어간 후, 서버에 있는 그리드에 각기 분배되게 되어있지요.
: : : 개선사항으로, 1번부터 10번까지 데이터를 한꺼번에 보내고, 그 데이터를 잘라서 개시될 수 있다면
: : : 데이터 전송 속도가 비약적으로 상승할것이라 기대 되지만....
: : : 제가 워낙 초짜라서 어떻게 하는지 잘 모르겠습니다.
: : :
: : : 지금 제가 하고 있는 프로그래밍 소스입니다.
: : :
: : :
: : : void __fastcall TF1::senTimer(TObject *Sender)
: : : {
: : :   AnsiString Srt = S->Cells[q][w];                //Srt에 셀의 데이터를 넣어 줌(q와 w는 이미 정수선언이 되어있음)
: : :
: : :   cs1->Socket->SendText(Srt);                    //서버에 Srt 데이터를 전송
: : :
: : :   if ( q < S->ColCount )                    //그리드의 col이 ColCount보다 적으면 시작
: : :      {
: : :      q = q + 1;                            //q에 +1
: : :      exit->Enabled = false;
: : :      U1->Enabled = false;
: : :      D1->Enabled = false;
: : :      re->Enabled = false;
: : :      insert->Enabled = false;                    //이건 전송중에는 종료 및 수정 등을 막아주는 소스;
: : :
: : :      sb->Panels->Items[3]->Text = "데이터 전송중... 종료시 서버에서 오류가 발생됩니다.";
: : :      }
: : :
: : :   if ( q == S->ColCount )
: : :      {
: : :       q = 0;
: : :       w = w + 1;
: : :      }                                //Col이 Colcount면, Row를 에 +1
: : :
: : :   if ( w == S->RowCount )
: : :      {
: : :         cs1->Socket->SendText("END");                //서버에 END문자를 보내주면서, 서버는 데이터 전송이 끝났다고 인식.
: : :
: : :         sen->Enabled = false;
: : :
: : :         exit->Enabled = true;
: : :         U1->Enabled = true;
: : :         D1->Enabled = true;
: : :         re->Enabled = true;
: : :         insert->Enabled = true;                    //막혔던 오브젝트를 다시 뚫어줌.
: : :
: : :         sb->Panels->Items[3]->Text = "데이터 전송 완료.";
: : :      }
: : : }
: : :
: : :
: : : 이 코드를 어떻게 바꿔야 한 줄의 데이터가 주욱 넘어갈런지...
: : : 보내주는 데이터 한 줄 사이에 !를 추가해서, 서버에서 !는 빼고 집어넣는다, 라는걸 해야 할 듯 싶은데
: : : (예를 들어 1!2!3!4 식으로)
: : : 설사 이걸 보내준다고 해도, 서버에서 이떻게 쪼개줘야 하는지 참 애매합니다.
: : :
: : : 프로그래밍은 말로는 "서버에서 이렇게 하면 되겠지" 라고 하는데, 직접 코딩이 힘들더군요;
: : : 아는 프로그래머 분은 "그걸 잘하는 사람이 조낸 일류 프로그래머야." 라고 하는데 전 멀었나 봅니다;

+ -

관련 글 리스트
46496 초보)StringGrid 셀 한 Row에 줄긋기나 특정 셀 색깔 변화 시키기 이승현 1456 2006/09/11
46497     Re:초보)StringGrid 셀 한 Row에 줄긋기나 특정 셀 색깔 변화 시키기 장성호 2901 2006/09/11
46500         재질문 드립니다 이승현 1037 2006/09/11
46502             Re:재질문 드립니다 장성호 1111 2006/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.