안녕하십니까?
고수님들 정말 급해서 다시 글을 올립니다.
저는 고객데이타를 읽어 고객의 후원인이 Table1에 존재하면
고객의 후원인 Index의 다음 번호로 레코드를 추가하고
후원인이 존재하지 않으면 Table1의 레코드수를 Index로 하여
가장 마지막 부분에 추가하려고 합니다.
그런데 처음 아래의 루틴을 실행하면 제가 원하는 데로 잘 실행되나
다시 아래의 루틴을 실행하면 실행하다가
access violation at 0x4be42b91:read of address ....라든
에러가 발생합니다.
정말, 무엇이 잘못인지 모르겠습니다.
고수님의 답변을 부탁드립니다.
procedure TFormOrgChart.NewBtnClick(Sender: TObject);
var
i,k:integer;
tInx,tLevel,tID,uLevel:integer;
tName,tPart:string;
procedure TableAppend;
begin
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add('Update ' + TreeTable.TableName + ' T');
SQL.Add('Set T."INDEX" = T."INDEX" + 1');
SQL.Add('Where T."INDEX" >= ' + IntToStr(tInx));
ExecSQL;
Close;
SQL.Clear;
end;
Table1.Append;
Table1.FieldByName('Index').AsInteger := tInx;
Table1.FieldByName('Level').AsInteger := tLevel;
Table1.FieldByName('이름').AsString := tName;
Table1.FieldByName('고객ID').AsInteger := tID;
Table1.Post;
end;
Table1.IndexName := '고객ID_Inx'; // Primary Key 'Index';
Table1.Close;
TableCreateTable; // 초기화 부분
Table1.Open;
CustomQuery.Close;
CustomQuery.SQL.Add(Select * from Custom.db';
CustomQuery.SQL.Add('Order by 직급, 등록일자, 고객ID');
if not CustomQuery.Prepared then CustomQuery.Prepare;
CustomQuery.Open;
while not CustomQuery.Eof do
begin
if Table1.FindKey(CustomQuery.FieldByName('후원인').AsInteger) then
tInx := Table1.FieldByName('Index').AsInteger + 1
else tInx := Table1.RecourdCount;
tName := CustomQuery.FieldByName('고객명').AsString;
tID := CustomQuery.FieldByName('고객ID').AsInteger;
tLevel := CustomQuery.FieldByName('직급').AsInteger;
TableAppend;
CustomQuery.Next;
end;
나타나는 에러입니다.
가령 다음과 같은 경우 일어납니다.
procedure AccessViolation;
var
ListView: TListView;
begin
ListView.Items[1000].Caption := 'Access Violation Error'; // <---- 에러 발생
end;
위의 경우 ListView는 생성이 되지 않았고 ListView의 1000번째 아이템도 마찬가지 입니
다. 아래의 루틴만 보고는 어디에서 Violation에러가 발생했는지 잘 모르겠군요.. 처음
에는 됐는데 두번째는 안된다는 것은 그 사이에서 어떤 객체나 포인터를 프리하였을 것
입니다. 어느 부분에서 violation에러가 나는지 디버깅해보세요... 대분의 경우 객체의
참조값이 nil일 것입니다...
이호환 wrote:
> 안녕하십니까?
>
> 고수님들 정말 급해서 다시 글을 올립니다.
>
>
> 저는 고객데이타를 읽어 고객의 후원인이 Table1에 존재하면
> 고객의 후원인 Index의 다음 번호로 레코드를 추가하고
> 후원인이 존재하지 않으면 Table1의 레코드수를 Index로 하여
> 가장 마지막 부분에 추가하려고 합니다.
>
> 그런데 처음 아래의 루틴을 실행하면 제가 원하는 데로 잘 실행되나
> 다시 아래의 루틴을 실행하면 실행하다가
> access violation at 0x4be42b91:read of address ....라든
> 에러가 발생합니다.
>
> 정말, 무엇이 잘못인지 모르겠습니다.
>
> 고수님의 답변을 부탁드립니다.
>
>
>
>
> procedure TFormOrgChart.NewBtnClick(Sender: TObject);
> var
> i,k:integer;
> tInx,tLevel,tID,uLevel:integer;
> tName,tPart:string;
>
> procedure TableAppend;
> begin
> with Query1 do
> begin
> Close;
> SQL.Clear;
> SQL.Add('Update ' + TreeTable.TableName + ' T');
> SQL.Add('Set T."INDEX" = T."INDEX" + 1');
> SQL.Add('Where T."INDEX" >= ' + IntToStr(tInx));
> ExecSQL;
> Close;
> SQL.Clear;
> end;
>
> Table1.Append;
> Table1.FieldByName('Index').AsInteger := tInx;
> Table1.FieldByName('Level').AsInteger := tLevel;
> Table1.FieldByName('이름').AsString := tName;
> Table1.FieldByName('고객ID').AsInteger := tID;
> Table1.Post;
> end;
>
>
>
> Table1.IndexName := '고객ID_Inx'; // Primary Key 'Index';
> Table1.Close;
> TableCreateTable; // 초기화 부분
> Table1.Open;
>
>
> CustomQuery.Close;
> CustomQuery.SQL.Add(Select * from Custom.db';
> CustomQuery.SQL.Add('Order by 직급, 등록일자, 고객ID');
> if not CustomQuery.Prepared then CustomQuery.Prepare;
> CustomQuery.Open;
>
> while not CustomQuery.Eof do
> begin
> if Table1.FindKey(CustomQuery.FieldByName('후원인').AsInteger) then
> tInx := Table1.FieldByName('Index').AsInteger + 1
> else tInx := Table1.RecourdCount;
> tName := CustomQuery.FieldByName('고객명').AsString;
> tID := CustomQuery.FieldByName('고객ID').AsInteger;
> tLevel := CustomQuery.FieldByName('직급').AsInteger;
>
>
> TableAppend;
>
> CustomQuery.Next;
> end;