Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

frame 동적 생성 후 parent 지정 시점에 Sream read error Exception (10.1 > 11.2 마이그레이션 후)


신호성

질문

10.1 > 11.2 마이그레이션 후 특이한 현상이 나타납니다.

폼에서 동적으로 아래와 같이 Frame을 Cerate 합니다.

여러 폼에서 사용하는 공통 Frame인데

특정 폼에서만 Parent 프로퍼티를 지정할 때 Stream Read Error 가 발생합니다.

같은 Fream을 사용하는 다른 폼에서는 정상인데 특정 폼에서만 Stream Read Error가 발생합니다.

최초 이상없이 동작하다 어느 시점에 Sream Radd Error가 발생했고 

원인을 파악하기위해 로그를 기록을 보완하며 파악을 하던 중 다시 정상적으로 동작했으나

로그 기록을 충분히 보완한 후 또 다시  Stream Read Error 발생합니다.

동적 Frame 생성 후 Parent 지정시 Stream Read Error는 어떤 경우에 발생하는지 궁굼합니다.

 

procedure TfrmAANoteWN.CreateFrame();
begin
  try
    DoclistFream := TfraDocOpenListFR.Create(Self);
    with DoclistFream do
    begin
      Parent := pnReceiver;    // Parent 지정 시점에 Stream Read Error 발생
      Top    := 0;
      Left   := 0;
      Width  := Parent.Width;
      Height := Parent.Height;
      Align  := alClient;
      Name   := Format('%s%d', [ClassName, Handle]);
    end;
  except
    on E:Exception do
    begin
      GvLogFileObj.Write(Self,  E.Message, lgError);
    end;
  end;
end;  

 

 

이 댓글 링크
다른 사이트에 공유하기

6 answers to this question

Recommended Posts

  • 0

1. 먼저 해당 프레임을 오른쪽 마우스를 누르시고 "Add to Pallete"에 등록하신 후에 설계시점에 팔레트에서 선택하새 한 번 사용해 보십시오.

2. 그리고  문제가 없으시다면 코드로 동적으로 하시는 부분에서 문제 없는 화면과 문제가 있는 화면의  dfm을 "view with text"로 확인하신다음  폼의 동일한 속성읭 값을 자세히 살펴보시기 바랍니다.  특히  ParentFont  속성등 

3 차이점이 있으면 문제가 없는 화면의 속성값으로 수정해서 테스트 해보시 바랍니다.

 

결과를 알려주시기 바랍니다. 혹시 안되시면 해당 프레임소스와 해당화면 화면이 있는 프로젝트 소스를 보내주시면 한 번 보도록하겠습니다.

 

 

이 댓글 링크
다른 사이트에 공유하기

  • 0

디자인 타임에 Frame 배치해서 실행하면 이상 없는 부분은 사전에 확인했습니다.
런타임 생성에서만 에러가 발생하며 속성에 차이는 없습니다.
10.1로 개발한 이전 버전에서는 전혀 문제 없던 부분이라...

11.2에서도 2~3주 정도 문제 없던 부분인데, 소스 변경도 없는 상태에서 갑자기 런타임 에러 로그가 기록되고 이상이 발생했습니다.
프로젝트는 너무 커 분리하기 어려워 보내드리기 어렵습니다.

Form 화면이 여러 단계로 상속 받는 구조인데
Frame Create 후 Property를 지정하는 과정에
다른 부분에서 Frame을 참조하는 부분이 런타임에 간헐적 문제를 발생 시킬 수 있을까 싶어 
추적하고 있습니다.
에러 메시지 (Stream Read Error) 만으로 유추가 어려워 좀 헤매고 있는데요
좀 더 원인을 파악해 보겠습니다.

 

10.1에서 정상인 코드가  11.2로 마이그레이션 하면서 간헐적 에러가 발생하는 특이한 상황을 경험한 바 있습니다.
Listview 컬럼을 동적으로 삭제하는 코드를  아래와 같이 사용했는데
ListView_DeleteColumn(listView.Handle, 3);

11.2에서는  처음 폼을 생성할 땐 문제 없이 동작하는데
두 번째 폼을 생성할 땐 Exception  발생으로 폼이 조회 되지 않는 부분을 경험했습니다.
그래서 livtView.Columns.Delete(3); 변경하고 이상 없이 동작합니다.


 

 

 


 

Edited by 신호성
이 댓글 링크
다른 사이트에 공유하기

  • 0

<아래 과정을 거쳐 특이점을 찾았으나 판단이 어렵습니다. >

아래와 같이 Frame 참조 시점에 Create 하도록 Property 형식으로 변경해보았습니다.
이후 한동안 이상 없이 잘 동작했습니다.
그리고 다른 소스를 수정하고 컴파일한 어느 시점부터  
갑자기 Stream Read Error가 다시 발생합니다. (해당 form, frame 소스를 수정하지 않은 상태에서)

  TfrmAANoteWN = class(TfrmAACustomDocWN)

    procedure FormCreate(Sender: TObject);
  private
    FReseiverInfoFrame : TfraAAInfoBarDocOpenListFR;
  protected
    function  GetReceiverInfoFrame()     : TfraAAInfoBarDocOpenListFR;
  public
    property  fraDocOpenListFR1 : TfraAAInfoBarDocOpenListFR read GetReceiverInfoFrame;
  end;

procedure TfrmAANoteWN.FormCreate(Sender: TObject);
begin
  FReseiverInfoFrame := nil;
  inherited;
end;

function TfrmAANoteWN.GetReceiverInfoFrame() : TfraAAInfoBarDocOpenListFR;
begin

  if (FReseiverInfoFrame = nil) then
  begin
    FReseiverInfoFrame := TfraAAInfoBarDocOpenListFR.Create(Self);
    with FReseiverInfoFrame do
    begin
      Parent := pnReceiver;          // 이 시점에 정상/에러(Stream Read Error)가 주기적으로 반복됨
      Top    := 0;
      Left   := 0;
      Width  := Parent.Width;
      Height := Parent.Height;
      Align  := alClient;
      Name   := Format('%s%d', [ClassName, Handle]);
    end;
  end;
  Result := FReseiverInfoFrame;
end;


정상/에러 발생이 주기적으로 반복되는 현상이라 어떤 특성에 영향을 받는다는 생각이 들었습니다.
exe 파일을 다른 9대의 컴퓨터(windows10, windows11, windows7)에 복사해 실행해 보니 정상적으로 동작합니다.
같은 컴퓨터 다른 폴더로 복사해서 실행해도 이상 없습니다.
혹시 디스크 에러가 있는가 싶어 디스크 검사를 실행해도 이상은 없습니다.

정리하면 개발 컴퓨터 디스크, 개발 폴더에서만 정상/에러(Stream Read Error)가 주기적으로 반복됩니다.
같은 frame을 사용하는 다른 form은 아무 이상이 없습니다. (특정 form에서만 문제 발생) 
에러가 발생하는 exe 프로그램을 다른 컴퓨터나 다른 폴더로 복사해서 테스트하면 Stream Read Error가 발생하지 않습니다.
이런 특이한 현상이 주기적으로 반복되는 이유가 뭘까요?

10.1 > 11.2로 마이그레이션 하면서 개발 컴이 변경되었지만
이해할 수 없는 특이한 현상을 겪게 되네요.

 

 

 

 

 

 

 

Edited by 신호성
이 댓글 링크
다른 사이트에 공유하기

  • 0

1. 먼저 GetReceiverInfoFrame()은 어디에서 호출하시나요 ?


2. 그리고 아래의 코드 부분에서 FReseiverInfoFrame := nil; 은 왜 필요하신지 ?   화면이 메모리에서 해제될떄 프레임이 해제되기 때문에 필요없을것 같고 널처리 하신다고 해도 화면이 create 되는 시점보다는 프레임이 필요없는 시점에 해주시는게 좋습니다.

코드도  FreeAndNil(FReseiverInfoFrame)로 작성하시면 됩니다. 

 

procedure TfrmAANoteWN.FormCreate(Sender: TObject);

begin

FReseiverInfoFrame := nil;

inherited;

end;

3. 아레 오류가 나는 소스에서 pnReceiver 선언 부분이나, 인스턴스 할당 부분 코드 좀 알려주세요 

Parent := pnReceiver;

이 댓글 링크
다른 사이트에 공유하기

  • 0

10.1과 11.2의 Listview의 민감도가 다름을 다시 경험하네요.
11.2 High DPI 적용을 위해 마이그레이션을 진행했는데 TListView에서 여러 건의 문제가 발생하네요.

저희 프로그램이 조금 규모가 커서  Form과 Frame이 다단계 상속 구조의 프레임워크로 구성되어 있습니다.
하위 Frame에서 TListView를 사용하면 해당 화면이 종료될 때 자동으로 모든 ListView의 각 컬럼의 폭을 자동으로 레지스트리에 저장하고
다음에 다시 오픈하면 컬럼폭을 다시 복원해줍니다.
이는 빈번히 사용하는 Listview의 컬럼폭을 사용자가 적당히 조정하면  이를 자동으로 유지해서 편의성을 높이는 기능이며
같은 방법으로 모든 업무 Form의 크기 위치도 자동으로 저장해 다음에 같은 위치에 같은 크기로 열어줍니다.

문제는 상위 frame 리스트뷰 컬럼폭을 처리하는 부분에서 HighDPI 모니터를 고려해 아래와 같이 CurrentPPI를 적용해서 저장했는데
MulDiv(Columns.Items[i].Width, 96, CurrentPPI);
특정 상황에서 0값이 저장되는 경우가 발생했습니다.

이렇게 특정 컬럼폭 값이 0으로 레지스트리에 저장되고 다음에 다시 해당 폼을 오픈하면  
[동적 생성하는 frame내 구성된] ListView의 Column Width  값이 0으로 설정되고, Listview의 parent 가 지정될 때 Stream Read Error가 발생합니다.
(frame을 동적으로 생성하지 않고 화면에 배치하면 이상 없이 동작합니다.)
혹시나 해서 10.1 개발컴에서 레지스트리값을 0으로 수정해 동일 상황을 재현 했으나 Column Width가 0으로 지정되더라도 에러 없이  동작합니다.

앞선 글에서도 언급 드렸는데 11.2에서 Listview의 Column 삭제도 문제가 발생했었고
frame 동적 생성에서 Listview의 OnwerDraw 속성을 true로 설정할 때도 10.2에서 문제 없던
Columns.Clear Exception 발생을 경험하고 보완했습니다.

결론은 제가 좀 더 예외 처리를 세밀하게 하지 못한 부분이 있고
Listview관련 처리에서 10.1과 달리 11.2에서는  예측하기 어려운 상황에서 Exception이 발생합니다.
11.2 마이그레이션 과정에서 발생한 여러 건의 문제는 모두 동적 생성하는 frame내에 listview 관련한 부분이었습니다.
하위 버전에서 11.2로 마이그레이션하는 분들은 listview를  주의해야겠네요.
 


 

 

 

 

 

 

 

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.