Q&A

  • 여러개의 데이터를 한번에 서버로 보내줄려면 어떻게 해야하나요?
<!--CodeS-->
type           // 구조체입니다.
  TDEVICEINFO = record
      nPort          : integer;                        
      szPortCode     : array[0..3] of char;        
      szPortCodeName : array[0..63] of char;        
end;
<!--CodeE-->
var
  rst  : TResult;
  arr : TArray;
  ii : Integer;
  sLocalIp : String;
  FCaller: TCaller;
  FFunc : TFunction;
  nRet : Integer;
  arrCount,nCnt : Integer;
  sString,sData : String;
  RecDeviceInfo : TDEVICEINFO;  //가져다쓸 테이블 명
  sRecDeviceInfo : String;
  Items,ItemCnt : Integer;
  sRTUModem : String;
  EDITArr : array[0..15] of TFlatEdit;   //에디트박스 16개
  ComboArr : array[0..15] of TFlatComboBox;  //콤보박스 16개
  arrDeviceInfo : array[0..15] of TDEVICEINFO;

이게 처음 했던 소스.. 이렇게 했더니 에디트 박스와 콤보박스의 마지막 집어넣은 데이터만 입력됩니다.
<!--CodeS-->
//EditArr[0] := Edit1; 이런형식으로 에디트박스와 콤보박스도 16개씩 만들었습니다.
  ItemCnt := 0;
  for Items := 0 to 15 do   //1번~16번 까지의 에디트박스에 값이 있는 개수 구하는 것입니다.
  begin
    if EditArr[Items].Text <> '' then
    begin
      ItemCnt := ItemCnt + 1;
    end;
  end;

  FillChar(RecDeviceInfo, sizeof(RecDeviceInfo), #0);

  for Items := 0 to ItemCnt-1 do
  begin
    RecDeviceInfo.nPort := StrToInt(EditArr[Items].Text);
    sRTUModem := GetRTUModemCode(ComboArr[Items].Text);
    CopyMemory(@RecDeviceInfo.szPortCode, PChar(sRTUModem), Length(sRTUModem));
  end;

  SetLength(sRecDeviceInfo, SizeOf(RecDeviceInfo));
  CopyMemory(@(sRecDeviceInfo[1]), @RecDeviceInfo.nPort, SizeOf(RecDeviceInfo));
  FFunc.AddParamBase64String(sRecDeviceInfo);  // 이걸로 서버에 파라미터를 넘겨줍니다.
<!--CodeE-->
그래서 RecDeviceInfo.nPort과 RecDeviceInfo.szPortCode에 여러개의 값을 넣어줄려고
테이블을 배열로 선언해서 아래쪽 소스처럼 고쳤습니다. 그랬더니 이상한 문자열이 들어가서 입력되버립니다.
<!--CodeS-->
//값이 있는 개수를 구하는 소스는 위에 소스랑 똑같습니다.
FillChar(RecDeviceInfo, sizeof(RecDeviceInfo), #0);

  for Items := 0 to ItemCnt-1 do
  begin
    arrDeviceInfo[Items].nPort := StrToInt(EditArr[Items].Text);
    sRTUModem := GetRTUModemCode(ComboArr[Items].Text);
   CopyMemory(@arrDeviceInfo[Items].szPortCode, PChar(sRTUModem), Length(sRTUModem));
    SetLength(sRecDeviceInfo, SizeOf(arrDeviceInfo[Items]));
  end;

  CopyMemory(@(sRecDeviceInfo[1]), @RecDeviceInfo.nPort, SizeOf(RecDeviceInfo));
  FFunc.AddParamBase64String(sRecDeviceInfo);
<!--CodeE-->

16개씩 있는 에디트박스와 콤보박스의 들어있는 값을 서버로 보내줄려면 어떻게 해야 하나요?
5  COMMENTS
  • Profile
    최용일 2009.05.12 23:55
    당연한 코드인것 같은데요...
    서버로 보낼 데이터가 여러개니까 그만큼의 TDEVICEINFO가 배열로 되어야하고 거기에 데이터를 넣어서 보내야죠...

    ItemCnt를 구하는 것을 보면 EditArr배열의 0부터 ItemCnt까지 데이터를 전송하는것이 아니고 데이터가 있는 것만 카운팅하는것으로 보면
    두번재 for문에서 for문횟수는 ItemCnt가 아니라 15가 되어야죠. If문 (if EditArr[Items].Text <> '' then)으로 데이터 확인은 한번 더 해야 되구요...
  • Profile
    날개 2009.05.13 00:11
    이해가 잘 안되는데요....
    두번째 for문에서 15가 되어버리면 에디트박스에 값이 없을시 null값도 들어가버리잖아요?
    그래서 값이 있는것만 보내줄려고 ItemCnt를 구했는데요....

    그리고 If문으로 데이터확인 한다는게 무슨뜻인지?.. 가르쳐주세요.
  • Profile
    최용일 2009.05.13 05:34
    데이터가 2개 (첫번째, 15번째) 있는데 ItemCnt(2)로 루프를 돌면 첫번째와 두번째 에디트의 데이터를 전송하게 되죠... 첫번째와 15번째의 에디트에 있는 값을 보내야 하는데... 이때문에 데이터 확인이 필요하다는 것입니다.

    그리고 보내는 코드가 for문 밖에 있으면... 루프를 백날 돌려도 맨마지막 값만 서버로 보내게 되죠... 보내는 코드를 루프안으로 옮겨야죠...
    어차피 보내기 전에 확인해야 하니까 루프하나로 모두 하세요...


    for Items := 0 to 15 do
    begin
    If EditArr[Items].Text <> '' then
    begin
    FillChar(RecDeviceInfo, sizeof(RecDeviceInfo), #0);

    RecDeviceInfo.nPort := StrToInt(EditArr[Items].Text);
    sRTUModem := GetRTUModemCode(ComboArr[Items].Text);
    CopyMemory(@RecDeviceInfo.szPortCode, PChar(sRTUModem), Length(sRTUModem));

    SetLength(sRecDeviceInfo, SizeOf(RecDeviceInfo));
    CopyMemory(@(sRecDeviceInfo[1]), @RecDeviceInfo.nPort, SizeOf(RecDeviceInfo));
    FFunc.AddParamBase64String(sRecDeviceInfo); // 이걸로 서버에 파라미터를 넘겨줍니다.
    end;
    end;
  • Profile
    날개 2009.05.13 18:34
    데이터 확인은 이해가
  • Profile
    날개 2009.05.15 20:07

    SetLength(sRecDeviceInfo, SizeOf(RecDeviceInfo)* ItemCnt);

    for Items := 0 to ItemCnt-1 do
    begin
    FillChar(RecDeviceInfo, sizeof(RecDeviceInfo), #0);
    arrDeviceInfo[Items].nPort := StrToInt(EditArr[Items].Text);
    sRTUModem := GetRTUModemCode(ComboArr[Items].Text);
    CopyMemory(@(arrDeviceInfo[Items].szPortCode), PChar(sRTUModem), Length(sRTUModem));
    CopyMemory(@(sRecDeviceInfo[1+(Items)]), @arrDeviceInfo[0].nPort, SizeOf(RecDeviceInfo)* ItemCnt);
    end;

    FFunc.AddParamBase64String(sRecDeviceInfo);

    이렇게 소스를 다시 바꿔줬습니다. 그랬더니 디버깅 결과 마지막 CopyMemory(@(sRecDeviceInfo[1+(Items)]) 이 부분에
    개수만큼에 데이터가 들어있긴 한데요. 이상한 값이 들어옵니다. 왜 이상한 값이 들어오는지 가르쳐주세요.