<!--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개씩 있는 에디트박스와 콤보박스의 들어있는 값을 서버로 보내줄려면 어떻게 해야 하나요?
서버로 보낼 데이터가 여러개니까 그만큼의 TDEVICEINFO가 배열로 되어야하고 거기에 데이터를 넣어서 보내야죠...
ItemCnt를 구하는 것을 보면 EditArr배열의 0부터 ItemCnt까지 데이터를 전송하는것이 아니고 데이터가 있는 것만 카운팅하는것으로 보면
두번재 for문에서 for문횟수는 ItemCnt가 아니라 15가 되어야죠. If문 (if EditArr[Items].Text <> '' then)으로 데이터 확인은 한번 더 해야 되구요...