자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi Form의 BorderStyle 정의시점?에 대한 차이점 질문입니다.
2020.01.22 09:36
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
A라는 .dfm 의 TPanel위에
B라는 .dfm 의 Form을 올리는 작업을 하였습니다.
A에서 B를 호출해서 B를 만들어서 넘겨주는 작업
========= A.pas=========
private
abc: TclsChildForm;
procedure **()
begin
abc := TB.Execute(~, ~, ~);
end;
========= A.pas =========
========= B.pas =========
class function TB.Execute(AOwner: TComponent; AParent: TWinControl;
AParentHandle: THandle): TclsChildForm;
if B= nil then Result := TB.Create(AOwner, AParentHandle);
with Result do begin
Parent := AParent;
Align := alClient;
Scaled := False;
BorderStyle := bsNone;
Show;
end;
========= B.pas =========
해당방식과.
========= A.pas =========
private
abc: TclsChildForm;
procedure **()
begin
abc := TB.Execute(~, ~, ~);
TB(abc).BorderStyle := bsNone;
end;
========= A.pas =========
========= B.pas =========
class function TB.Execute(AOwner: TComponent; AParent: TWinControl;
AParentHandle: THandle): TclsChildForm;
if B= nil then Result := TB.Create(AOwner, AParentHandle);
with Result do begin
Parent := AParent;
Align := alClient;
Scaled := False;
// BorderStyle := bsNone;
Show;
end;
========= B.pas =========
해당방식의 결과가 조금 다른데
어떤이유로 달라지는건가요??
아직 초보개발자라 궁금한게 많습니다.
추가..
왼쪽이 위에소스고 오른쪽이 아래소스 입니다.
댓글 5
-
험프리
2020.01.22 14:03
-
Danny
2020.01.22 17:43
먼저 두서없는 글 읽어주셔서 감사합니다. 해당이미지 첨부하였고
왼쪽같은경우는 BorderStyle := bsNone상태를 제대로 반영을 못하는거 같습니다.
-
험프리
2020.01.23 09:51
전체적인 소스코드가 없어 작성된 소스코드만으로 유추해 답변드립니다.
우서 클래스 메소드에서 폼을 생성하고 속성을 설정하는 것과
인스턴스 메소드에서 속성을 설정하는 것에는 차이가 없습니다.
즉, 위와 같은 구현 방식은 잘못된 것은 아닙니다.
다만, 구현과정에서 잘못된 인스턴스에 속성을 설정하지 않았을까 예상됩니다.
위쪽 소스코드에서 의심해 볼만한 내용은 다음과 같습니다.
if B= nil then Result := TB.Create(AOwner, AParentHandle);
위 코드에서 B는 인스턴스 변수로 보입니다. 혹시 자동생성폼으로 설정되어 있다면,
위 코드에서 B는 nil이 아니기 때문에 Result := TB.Create(... 코드는 실행되지 않을 것 같습니다.
그러면 Result에도 nil이 들어가 있어 오류가 발생하거나 잘못된 객체가 담겨져 있을겁니다.
(위의 글을 보면 일부만 추출해서 등록하신 것 같아 다른 숨겨진 코드가 있지 않을까 싶네요.)
그리고, 눈으로만 따라가는 것보다는 코드를 직접 디버깅하며 원인을 찾아보시기 바랍니다.
살펴보려는 코드에 브레이크 포인트 추가(F5)후 디버그 모드로 실행하시고,
F8로 다음라인 이동, F7로 메소드 안으로 이동하며 객체의 값을 Ctrl + F7로 확인하며 의심되는 라인라인을 점검해 보시기 바랍니다.
위 과정으로 원인을 찾아보시고 직접 해결해 보시기 바라며, 원인을 찾았지만 해결방법을 모르는 경우 다시 질문해 주시기 바랍니다.
디버깅 작업이 습관화 된다면 실력이 한층 성장할 수 있을것입니다.
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-
Danny
2020.01.23 10:21
물론 디버깅으로 추적해보았고.
GetEnumName(TypeInfo(TFormBorderStyle), Ord(Form.BorderStyle)); 해당방식으로 showmessage로 출력을 해봐도 BorderStyle나오는거는 똑같지만 결과가 반영되는게 달라서 질문드렸습니다.
원인을 아직 잘 모르겠네요
-
관리자
2020.02.05 06:29
문의 사항과 직접 관련은 없습니다만, TFrame 활용을 검토해 보는 것도 좋을 수 있습니다.
TFrame 사용에 관한 내용은 아래 링크를 참고하세요:
Delphi Form의 BorderStyle 정의시점?에 대한 차이점 질문입니다.
2020.01.22 09:36
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
A라는 .dfm 의 TPanel위에
B라는 .dfm 의 Form을 올리는 작업을 하였습니다.
A에서 B를 호출해서 B를 만들어서 넘겨주는 작업
========= A.pas=========
private
abc: TclsChildForm;
procedure **()
begin
abc := TB.Execute(~, ~, ~);
end;
========= A.pas =========
========= B.pas =========
class function TB.Execute(AOwner: TComponent; AParent: TWinControl;
AParentHandle: THandle): TclsChildForm;
if B= nil then Result := TB.Create(AOwner, AParentHandle);
with Result do begin
Parent := AParent;
Align := alClient;
Scaled := False;
BorderStyle := bsNone;
Show;
end;
========= B.pas =========
해당방식과.
========= A.pas =========
private
abc: TclsChildForm;
procedure **()
begin
abc := TB.Execute(~, ~, ~);
TB(abc).BorderStyle := bsNone;
end;
========= A.pas =========
========= B.pas =========
class function TB.Execute(AOwner: TComponent; AParent: TWinControl;
AParentHandle: THandle): TclsChildForm;
if B= nil then Result := TB.Create(AOwner, AParentHandle);
with Result do begin
Parent := AParent;
Align := alClient;
Scaled := False;
// BorderStyle := bsNone;
Show;
end;
========= B.pas =========
해당방식의 결과가 조금 다른데
어떤이유로 달라지는건가요??
아직 초보개발자라 궁금한게 많습니다.
추가..
왼쪽이 위에소스고 오른쪽이 아래소스 입니다.
댓글 5
-
험프리
2020.01.22 14:03
-
Danny
2020.01.22 17:43
먼저 두서없는 글 읽어주셔서 감사합니다. 해당이미지 첨부하였고
왼쪽같은경우는 BorderStyle := bsNone상태를 제대로 반영을 못하는거 같습니다.
-
험프리
2020.01.23 09:51
전체적인 소스코드가 없어 작성된 소스코드만으로 유추해 답변드립니다.
우서 클래스 메소드에서 폼을 생성하고 속성을 설정하는 것과
인스턴스 메소드에서 속성을 설정하는 것에는 차이가 없습니다.
즉, 위와 같은 구현 방식은 잘못된 것은 아닙니다.
다만, 구현과정에서 잘못된 인스턴스에 속성을 설정하지 않았을까 예상됩니다.
위쪽 소스코드에서 의심해 볼만한 내용은 다음과 같습니다.
if B= nil then Result := TB.Create(AOwner, AParentHandle);
위 코드에서 B는 인스턴스 변수로 보입니다. 혹시 자동생성폼으로 설정되어 있다면,위 코드에서 B는 nil이 아니기 때문에 Result := TB.Create(... 코드는 실행되지 않을 것 같습니다.그러면 Result에도 nil이 들어가 있어 오류가 발생하거나 잘못된 객체가 담겨져 있을겁니다.(위의 글을 보면 일부만 추출해서 등록하신 것 같아 다른 숨겨진 코드가 있지 않을까 싶네요.)그리고, 눈으로만 따라가는 것보다는 코드를 직접 디버깅하며 원인을 찾아보시기 바랍니다.살펴보려는 코드에 브레이크 포인트 추가(F5)후 디버그 모드로 실행하시고,F8로 다음라인 이동, F7로 메소드 안으로 이동하며 객체의 값을 Ctrl + F7로 확인하며 의심되는 라인라인을 점검해 보시기 바랍니다.위 과정으로 원인을 찾아보시고 직접 해결해 보시기 바라며, 원인을 찾았지만 해결방법을 모르는 경우 다시 질문해 주시기 바랍니다.디버깅 작업이 습관화 된다면 실력이 한층 성장할 수 있을것입니다.——————답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.) -
Danny
2020.01.23 10:21
물론 디버깅으로 추적해보았고.
GetEnumName(TypeInfo(TFormBorderStyle), Ord(Form.BorderStyle)); 해당방식으로 showmessage로 출력을 해봐도 BorderStyle나오는거는 똑같지만 결과가 반영되는게 달라서 질문드렸습니다.
원인을 아직 잘 모르겠네요
-
관리자
2020.02.05 06:29
문의 사항과 직접 관련은 없습니다만, TFrame 활용을 검토해 보는 것도 좋을 수 있습니다.
TFrame 사용에 관한 내용은 아래 링크를 참고하세요:
해당방식의 결과가 어떻게 다른지 알려주시거나, 샘플을 첨부하시면 확인이 더 용이할것 같습니다.
해당 내용을 추가해주시기 바랍니다.