|
가르쳐주신 방법, 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 식으로)
: : 설사 이걸 보내준다고 해도, 서버에서 이떻게 쪼개줘야 하는지 참 애매합니다.
: :
: : 프로그래밍은 말로는 "서버에서 이렇게 하면 되겠지" 라고 하는데, 직접 코딩이 힘들더군요;
: : 아는 프로그래머 분은 "그걸 잘하는 사람이 조낸 일류 프로그래머야." 라고 하는데 전 멀었나 봅니다;
|