Q&A

  • StringGrid의 데이터 배열로 전송하기...


안녕하십니까?



StringGrid로 입력 받은 자료를 서버로 전송하여 DB에 저장하려 합니다.



StringGrid에 자료를 입력 하는 일(입력,삭제,추가)은 어느정도 마무리 되었습니다.



StringGrid의 각 Cell에 있는 데이터를(모두 String) Send_Buf라는 버퍼에 집어 넣어서 일괄 전송하려고 합니다.(데이터 간의 구분은 구분자를 이용하려 합니다.)



StringGrid의 입력된 전체 Cell의 크기는 산출 했는데, 배열에 어떻게 넣어야 하는지 알려 주세요.



ClientSocket의 SendBuf를 사용하려고 하는데, 고수님들의 의견은 어떠신지요?



StringGrid.Cells의 전체 구조는 [1..3, 1..10] 입니다. 최대 전송크기도 위와 같습니다.



어제 오늘 이것 찾느라 여러 곳을 다녀 봤지만, 못 찾겠습니다. 도와 주시기 바랍니다. -.-;









unit Form1;



.....



var

Form1: TForm1;

NowCol, NowRow, IncRow : Integer;

NIp : String;



type

Send_Buf = array[1..64] of Char;



implementation



{$R *.DFM}



........



procedure TForm1.Delete_BtnClick(Sender: TObject);

var

NowRow2nd, FirstCnt, SecondCnt, PriCnt, NextCnt, LastCnt : Integer;

begin

LastCnt := 1;

NowRow2nd := StringGrid1.Row;



//현재 라인을 삭제한다.

StringGrid1.Rows[NowRow2nd].Clear;



// 현재 몇라인까지 입력이 되었는가를 집계 LastCnt

for FirstCnt := 1 to StringGrid1.RowCount - 1 do

begin

if StringGrid1.Cells[1, FirstCnt] <> '' then

LastCnt := LastCnt + 1;

end;



//선택 Row를 삭제하고 한 Row씩 끌어올린다.

for FirstCnt := NowRow2nd to LastCnt do

begin

NextCnt := FirstCnt + 1;

for SecondCnt := 0 to 3 do

begin

StringGrid1.Cells[SecondCnt,FirstCnt] := StringGrid1.Cells[SecondCnt,NextCnt];

PriCnt := NextCnt - 1;

if STringGrid1.Cells[1, NextCnt] = '' then

StringGrid1.Cells[0,FirstCnt] := ''

else StringGrid1.Cells[0, FirstCnt] := IntToStr(PriCnt);

end;

end;

IncRow := IncRow - 1 ;

Form1.Search_Edt.SetFocus;

end;







procedure TForm1.ClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket);

begin

ClientSocket1.Address := NIp;

ClientSocket1.Port := 23;

ClientSocket1.Active := True;

end;



procedure TForm1.Send_BtnClick(Sender: TObject);

var

S1_Cnt, S2_Cnt, S3_Cnt, S4_Cnt, Size_Cnt, Size_Cnt2, Size_Arr : Integer;

S_B : Send_Buf;



// 입력된 전체 Cell 의 크기를 측정한다. 값은 Size_Cnt2에 저장한다.

begin

Size_Cnt := 0;

Size_Cnt2 := 0;



for S1_Cnt := 1 to IncRow do

begin

for S2_Cnt := 1 to 3 do

begin

Size_Cnt := Length(StringGrid1.Cells[S2_Cnt, S1_Cnt]);

Size_Cnt2 := Size_Cnt2 + Size_Cnt + 1; // +1은 구분자의 크기.

end;

end;



for S3_Cnt := 1 to IncRow do

begin

for S4_Cnt := 1 to 3 do

begin

for Size_Arr := 1 to Size_Cnt2 do

begin

S_B[Size_Arr] := StringGrid1.Cells[S4_Cnt, S3_Cnt] + #13;



// 배열에 StringGrid1.Cells 의 데이터를 집어 넣으려고 하는데 방법이 틀린 듯 합니다. Cells의 데이터는 모두 String 입니다.



end;

end;

end;



end;



end.

1  COMMENTS
  • Profile
    최용일 2000.06.21 19:51
    안녕하세요. 최용일입니다.



    2차원인 스트링그리드의 내용을 1차원 바이트 배열로 바꾸는 예제를 간단히 만들어 보았



    습니다. 객체의 속성을 var파라매터로 넣어줄수 없기때문에 변수가 좀 많습니다.



    이렇게 1차원 배열로 만들어주었으니까 일정한 크기로 끊어서 보내는 것을 하시겠죠?



    배열의 전체크기는 High함수로 알 수 있습니다. 사용이 끝난후 SetLength(Flat, 0)을



    호출하여 할당받은 메모리를 해제해주세요.



    type

    TFlatArray = array of Char; // 1차원 바이트 배열 타입

    // Char로 하나 Byte로 하나 차이는 없습니다. 똑같이 1 byte이니까요...

    var

    Flat: TFlatArray; // 1차원 바이트 배열 변수



    procedure SaveToFlatArray(Grid: TStringGrid; var Flat: TFlatArray);

    // 스트링그리드의 내용을 1차원 바이트 배열에 저장.

    var

    I, SaveSize, SavePos, FlatSize: Integer;

    SourceStr: string;

    SaveStr: array of Char;

    begin

    FlatSize := 0;

    for I := 0 to Grid.ColCount - 1 do

    begin

    SourceStr := Grid.Cols[I].Text;

    SaveSize := Length(SourceStr);

    SetLength(SaveStr, SaveSize);

    Move(SourceStr[1], SaveStr[1], SaveSize);

    SavePos := FlatSize;



    FlatSize := FlatSize + SaveSize + SizeOf(SaveSize);

    SetLength(Flat, FlatSize);

    Move(SaveSize, Flat[SavePos], SizeOf(SaveSize));

    Move(SaveStr[1], Flat[SavePos + SizeOf(SaveSize)], SaveSize);

    end;

    end;



    procedure LoadFromFlatArray(Grid: TStringGrid; var Flat: TFlatArray);

    // 1차원 바이트 배열을 스트링그리드에 복원.

    var

    I, LoadSize, LoadPos: Integer;

    LoadStr: string;

    begin

    LoadPos := 0;

    for I := 0 to Grid.ColCount - 1 do

    begin

    Move(Flat[LoadPos], LoadSize, SizeOf(LoadSize));

    SetLength(LoadStr, LoadSize);



    Move(Flat[LoadPos + SizeOf(LoadSize)], LoadStr[1], LoadSize);

    Grid.Cols[I].Text := LoadStr;

    LoadPos := LoadPos + SizeOf(LoadSize) + LoadSize;

    end;

    end;



    ^^ 항상 즐코하세요.



    강진호 wrote:

    >

    > 안녕하십니까?

    >

    > StringGrid로 입력 받은 자료를 서버로 전송하여 DB에 저장하려 합니다.

    >

    > StringGrid에 자료를 입력 하는 일(입력,삭제,추가)은 어느정도 마무리 되었습니다.

    >

    > StringGrid의 각 Cell에 있는 데이터를(모두 String) Send_Buf라는 버퍼에 집어 넣어서 일괄 전송하려고 합니다.(데이터 간의 구분은 구분자를 이용하려 합니다.)

    >

    > StringGrid의 입력된 전체 Cell의 크기는 산출 했는데, 배열에 어떻게 넣어야 하는지 알려 주세요.

    >

    > ClientSocket의 SendBuf를 사용하려고 하는데, 고수님들의 의견은 어떠신지요?

    >

    > StringGrid.Cells의 전체 구조는 [1..3, 1..10] 입니다. 최대 전송크기도 위와 같습니다.

    >

    > 어제 오늘 이것 찾느라 여러 곳을 다녀 봤지만, 못 찾겠습니다. 도와 주시기 바랍니다. -.-;

    >

    >

    >

    >

    > unit Form1;

    >

    > .....

    >

    > var

    > Form1: TForm1;

    > NowCol, NowRow, IncRow : Integer;

    > NIp : String;

    >

    > type

    > Send_Buf = array[1..64] of Char;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > ........

    >

    > procedure TForm1.Delete_BtnClick(Sender: TObject);

    > var

    > NowRow2nd, FirstCnt, SecondCnt, PriCnt, NextCnt, LastCnt : Integer;

    > begin

    > LastCnt := 1;

    > NowRow2nd := StringGrid1.Row;

    >

    > //현재 라인을 삭제한다.

    > StringGrid1.Rows[NowRow2nd].Clear;

    >

    > // 현재 몇라인까지 입력이 되었는가를 집계 LastCnt

    > for FirstCnt := 1 to StringGrid1.RowCount - 1 do

    > begin

    > if StringGrid1.Cells[1, FirstCnt] <> '' then

    > LastCnt := LastCnt + 1;

    > end;

    >

    > //선택 Row를 삭제하고 한 Row씩 끌어올린다.

    > for FirstCnt := NowRow2nd to LastCnt do

    > begin

    > NextCnt := FirstCnt + 1;

    > for SecondCnt := 0 to 3 do

    > begin

    > StringGrid1.Cells[SecondCnt,FirstCnt] := StringGrid1.Cells[SecondCnt,NextCnt];

    > PriCnt := NextCnt - 1;

    > if STringGrid1.Cells[1, NextCnt] = '' then

    > StringGrid1.Cells[0,FirstCnt] := ''

    > else StringGrid1.Cells[0, FirstCnt] := IntToStr(PriCnt);

    > end;

    > end;

    > IncRow := IncRow - 1 ;

    > Form1.Search_Edt.SetFocus;

    > end;

    >

    >

    >

    > procedure TForm1.ClientSocket1Connect(Sender: TObject;

    > Socket: TCustomWinSocket);

    > begin

    > ClientSocket1.Address := NIp;

    > ClientSocket1.Port := 23;

    > ClientSocket1.Active := True;

    > end;

    >

    > procedure TForm1.Send_BtnClick(Sender: TObject);

    > var

    > S1_Cnt, S2_Cnt, S3_Cnt, S4_Cnt, Size_Cnt, Size_Cnt2, Size_Arr : Integer;

    > S_B : Send_Buf;

    >

    > // 입력된 전체 Cell 의 크기를 측정한다. 값은 Size_Cnt2에 저장한다.

    > begin

    > Size_Cnt := 0;

    > Size_Cnt2 := 0;

    >

    > for S1_Cnt := 1 to IncRow do

    > begin

    > for S2_Cnt := 1 to 3 do

    > begin

    > Size_Cnt := Length(StringGrid1.Cells[S2_Cnt, S1_Cnt]);

    > Size_Cnt2 := Size_Cnt2 + Size_Cnt + 1; // +1은 구분자의 크기.

    > end;

    > end;

    >

    > for S3_Cnt := 1 to IncRow do

    > begin

    > for S4_Cnt := 1 to 3 do

    > begin

    > for Size_Arr := 1 to Size_Cnt2 do

    > begin

    > S_B[Size_Arr] := StringGrid1.Cells[S4_Cnt, S3_Cnt] + #13;

    >

    > // 배열에 StringGrid1.Cells 의 데이터를 집어 넣으려고 하는데 방법이 틀린 듯 합니다. Cells의 데이터는 모두 String 입니다.

    >

    > end;

    > end;

    > end;

    >

    > end;

    >

    > end.