text문서에서 한 row씩 읽어서 리포트를 출력하려고 합니다..
근데....첫 줄을 읽은 후에 읽어온 값을 a, b, c, ....에 넣어주고...
마지막 p까지 넣어준후 다음줄(end)로 커서가 이동하면..
배열과, str값이 clear되고, a.caption, b.caption....p.caption에
커서를 위치시키면 'Variable 'self' inaccessible here due to optimization'이라는 메세지가 나오는데....왜 그러는거죠????
test화일의 내용을 일정하지 않고, 항상 변하는 값입니다.
내용은 변하지만, 한 row에 16개의 값이 들어있는건 일정하고,
값은 공백일수도 있고, 아닐수도 있습니다..
고수님들...많이 조언 부탁드립니다..
procedure Tqram847101.QuickRepNeedData(Sender: TObject;
var MoreData: Boolean);
begin
if sw = True then
MoreData := True
else begin
MoreData := False;
CloseFile(TestFile);
end;
end;
procedure Tqram847101.DetailBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
if Not Eof(TestFile) then
sw := True
else
sw := False;
end;
procedure Tqram847101.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
len : Array[1..16] of String;
i, j, k : Integer;
begin
//배열 초기화
for i := 1 to 16 do
len[i] := '';
j := 1;
k := 0;
//레코드 read(text화일 한줄)
Readln(TestFile, Str);
for i := 0 to length(trim(Str)) do
begin
if str[i] = ';' then //';'구분자
begin
k := k + 1;
len[k] := copy(str, j, i-j);
j := i + 1;
end;
end;
a.Caption := len[1]; //자산관리번호
b.Caption := len[2]; //자산명
c.Caption := len[3]; //취득일
d.Caption := len[4]; //취득구분
e.Caption := len[5]; //취득금액
f.Caption := len[6]; //내용연수
g.Caption := len[7]; //상각구분
h.Caption := len[8]; //잔존가액
i.Caption := len[9]; //비치장소
j.Caption := len[10]; //형식 및 규격
kCaption := len[11]; //상태
l.Caption := len[12]; //업무구분
m.Caption := len[13]; //자본적지출누계
n.Caption := len[14]; //경과연수
o.Caption := len[15]; //상각율(액)
p.Caption := len[16]; //적요
end;
procedure Tqram847101.QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
AssignFile(TestFile, 'C:ass.txt');
Reset(TestFile); // opens typed and untyped file with read-write access
sw := True;
end;
아마도 디버깅하시는 중인가 보군요... 델파이는 진짜 좋은 컴파일러로 항상 메모리를
최적화 시킵니다. 그때 그때 다음에 참조하지 않을 변수들은 바로 메모리에서 해제시켜
버립니다. 바로 이 옵티마이징(메모리 최적화) 때문에 그런겁니다.
사실 inaccessible... 어쩌고 나오는 것은 그 뒤에는 전혀 참조를 안합니다. 때문에 그
값이 더이상 메모리에 존재할 필요가 없죠... 물론 지나간 값을 확인할려면 조금 불편합
니다만 옵션에서 꺼주시면 됩니다.(별루 추천하고 싶지는 않지만...)
^^ 항상 즐코하세요...
초보 wrote:
> text문서에서 한 row씩 읽어서 리포트를 출력하려고 합니다..
>
> 근데....첫 줄을 읽은 후에 읽어온 값을 a, b, c, ....에 넣어주고...
>
> 마지막 p까지 넣어준후 다음줄(end)로 커서가 이동하면..
>
> 배열과, str값이 clear되고, a.caption, b.caption....p.caption에
>
> 커서를 위치시키면 'Variable 'self' inaccessible here due to optimization'이라는 메세지가 나오는데....왜 그러는거죠????
>
> test화일의 내용을 일정하지 않고, 항상 변하는 값입니다.
>
> 내용은 변하지만, 한 row에 16개의 값이 들어있는건 일정하고,
>
> 값은 공백일수도 있고, 아닐수도 있습니다..
>
> 고수님들...많이 조언 부탁드립니다..
>
> procedure Tqram847101.QuickRepNeedData(Sender: TObject;
> var MoreData: Boolean);
> begin
> if sw = True then
> MoreData := True
> else begin
> MoreData := False;
> CloseFile(TestFile);
> end;
> end;
>
> procedure Tqram847101.DetailBand1AfterPrint(Sender: TQRCustomBand;
> BandPrinted: Boolean);
> begin
> if Not Eof(TestFile) then
> sw := True
> else
> sw := False;
> end;
>
> procedure Tqram847101.DetailBand1BeforePrint(Sender: TQRCustomBand;
> var PrintBand: Boolean);
> var
> len : Array[1..16] of String;
> i, j, k : Integer;
> begin
> //배열 초기화
> for i := 1 to 16 do
> len[i] := '';
>
> j := 1;
> k := 0;
>
> //레코드 read(text화일 한줄)
> Readln(TestFile, Str);
>
> for i := 0 to length(trim(Str)) do
> begin
> if str[i] = ';' then //';'구분자
> begin
> k := k + 1;
> len[k] := copy(str, j, i-j);
> j := i + 1;
> end;
> end;
> a.Caption := len[1]; //자산관리번호
> b.Caption := len[2]; //자산명
> c.Caption := len[3]; //취득일
> d.Caption := len[4]; //취득구분
> e.Caption := len[5]; //취득금액
> f.Caption := len[6]; //내용연수
> g.Caption := len[7]; //상각구분
> h.Caption := len[8]; //잔존가액
> i.Caption := len[9]; //비치장소
> j.Caption := len[10]; //형식 및 규격
> kCaption := len[11]; //상태
> l.Caption := len[12]; //업무구분
> m.Caption := len[13]; //자본적지출누계
> n.Caption := len[14]; //경과연수
> o.Caption := len[15]; //상각율(액)
> p.Caption := len[16]; //적요
> end;
>
>
> procedure Tqram847101.QuickRepBeforePrint(Sender: TCustomQuickRep;
> var PrintReport: Boolean);
> begin
> AssignFile(TestFile, 'C:ass.txt');
> Reset(TestFile); // opens typed and untyped file with read-write access
>
> sw := True;
> end;