procedure 를 dll 로 만들어서 프로그램을 하려 합니다.
근데 그리드의 RowCount에 값을 넣으려 하면 error가 나요...
procedure SearchFail( sqlOra : TQuery; tmpgrid : TAdvStringGrid; acc, perd : Integer;
perdS, idno, taxno, ownr_name : String );
var i : integer;
TempF : String;
begin
With sqlOra, tmpgrid do begin
Close;
Sql.Clear;
Sql.Add('select LVY_NO FROM ENVTNA2BCR');
Sql.Add(' Where PERD Like :PERD and (RECPT_AMT = 0 or RECPT_AMT IS NULL) ');
If acc >= 1 then
Sql.Add(' and BEA_MNEY_GBN = ' + IntToStr(acc) );
If Length(Trim(idno)) <> 0 then
Sql.Add(' and OWNR_SID like ''' + idno + '%''' );
If Length(Trim(taxno)) <> 0 then
Sql.Add(' and BEA_MNEY_NO = ''' + taxno + '''' );
If Length(Trim(ownr_name)) <> 0 then
Sql.Add(' and OWNR_NM = ''' + ownr_name + '''' );
If perd = 0 Then
ParamByName('PERD').AsString := '%'
Else
ParamByName('PERD').AsString := perdS+'%';
Sql.Add(' Group By OWNR_SID, PERD, OWNR_NM, LVY_NO ');
Open;
if recordcount = 0 then begin
Showmessage('해당 자료가 없습니다');
Close;
Exit;
End;
TempF := '';
While Not Eof do begin
TempF := TempF + ''''+Fields[0].AsString + '''';
Next;
if not eof then TempF := TempF + ',';
end;
Close;
SQL.Clear;
SQL.Add( 'select LVY_NO, OWNR_NM, BEA_MNEY_NO, OWNR_SID, PERD from ENVTNA2BCR ' +
' where LVY_NO in ( ' + TempF + ' )' );
Open;
i := 0;
While not EOF do begin
i := i + 1;
Cells[1, i] := ConvertDataToLength( FieldByName('OWNR_SID').AsString );
Cells[2, i] := FieldByName('OWNR_NM').AsString;
Cells[3, i] := FieldByName('BEA_MNEY_NO').AsString;
Cells[8, i] := FieldByName('LVY_NO').AsString;
Cells[9, i] := FieldBYName('PERD').AsString;
Next;
end;
if i = 0 then i := 1;
RowCount := i + 1;
Close;
SQL.Clear;
SQL.Add( 'select LVY_NO, ANC_AMT, RECPT_AMT ' +
'from CMMTNINCMRSLT where LVY_NO in ( ' + TempF + ' )' );
Open;
While not EOF do begin
for i := 1 to RowCount - 1 do begin
if Cells[8, i] = FieldByName('LVY_NO').AsString then begin
Cells[4, i] := FormatFloat( '#,##0', FieldByName('ANC_AMT').AsInteger );
Break;
end;
end;
Next;
end;
Close;
SQL.Clear;
SQL.Add( 'select LVY_NO, RECPT_YMD, CHENAP_AMT, HAD_AMT from CMMTNINCMARR ' +
' where LVY_NO in ( ' + TempF + ' )' );
Open;
While not EOF do begin
for i := 1 to RowCount - 1 do begin
if Cells[8, i] = FieldByName('LVY_NO').AsString then begin
Cells[5, i] := FormatFloat( '#,##0', FieldByName('CHENAP_AMT').AsInteger );
Cells[6, i] := FormatFloat( '#,##0', FieldByName('HAD_AMT').AsInteger );
if FieldByName('RECPT_YMD').AsString = '' then
Cells[7, i] := '압류';
Break;
end;
end;
Next;
end;
Close;
i := 1;
While i <= RowCount - 1 do begin
if ( Cells[4, i] = '' ) or ( Cells[4, i] = '0' ) then
RemoveRows( i, 1 )
else
i := i + 1;
end;
end;
end;
이부분이 dll에서 코딩한 내용입니다.
SearchFail( DM1.qryOra1, sg2, cbAcct2.ItemIndex, cb_PERD2.ItemIndex,
cb_PERD2.Text, EDT_OWNR_SID.Text, EDT_BEA_MNEY_NO2.Text, EDT_OWNR_NM2.Text );
main에서 호출하는 부분이구요
procedure SearchFail( sqlOra : TQuery; tmpgrid : TAdvStringGrid; acc, perd : Integer;
perdS, idno, taxno, ownr_name : String ); far; external 'search_fail.dll';
main에서 정의를 내린 부분입니다.
멀 잘못한건지 몰것거든요...
즉, 메인의 어떤 포인터 변수를 가지고 DLL에서 GetMem을
하면 문제가 발생하는거죠 , 그 반대도 마찬가지이고요
아래의 문제에서 RowCount에 값을 넣는다는 것은
곧 tmpgrid(객체변수, 포인터)의 내부의 변수를
GetMem을 하여 Size를 재조정하는 것으로 위의문제에 걸리죠
일반적인 스탠다드 DLL은 아래방식으로는 불가능 하다고 봅니다..
볼랜드에서 제공하는 뭐더라 BorlandMem.dll 인가뭔가 하는거
첨부해서 해보세요(DLL 프로젝트 만들때 처음에 주석으로 뭐라고
나오는데 그거 한번 써보세요) 확인은 안했지만 될지도 모름
제가 쓰는 방법은 확장DLL 즉, bpl인가 이것도 까먹네 쩝,
이것을 만들어 쓰는방법, 또는 스탠다드에서는 미리 GetMem을 끝내고
전송하는 방법, 그리고 꼭 리사이즈잉 꼭 필요할때는 TMemoryStream을
사용해서 전송해요 이놈은 다른 Memory heap을 쓰는듯 해서 무리없이
통신이 됩니다.
여기까지 제 경험상 이고요 내용상 제가 틀린부분도 있을거에요
틀린점 있으면 지적하시고요 그럼이만,