GUI 정보 숨기기를 위해 Delphi의 프레임 사용
-
19-09-2019 - |
문제
나는 지난 3 년간 취미/직업 수준에서 델파이를 배우고 있습니다. 나는 이제 공포와 창피로 초기 코드를 되돌아 볼 수있는 시점으로 발전했다는 것을 기쁘게 생각합니다. 그래서 나는 이제 초기 앱 중 일부를 살펴보고 다시 작성/ 리팩토링하고 있습니다.
내가 벗어나려고하는 나쁜 습관 중 하나는 다른 유닛의 한 형태의 구성 요소에 액세스하는 것입니다. 이것을 시행하기 위해, 나는 정보 숨기기 방법으로 프레임을 사용하는 것을 실험 해 왔습니다. 따라서 구성 요소가있는 양식을 갖는 대신 모든 양식 구성 요소를 유지하는 프레임을 만들고 프레임을 양식에 배치하고 프레임 선언을 개인 선언으로 이동하고 있습니다.
type
TMyForm = class(TForm)
private
MyFrame: TMyFrame;
procedure SetTimeDate(const Value: TMyItem);
function ReadTimeDate:TMyItem ;
그런 다음 양식 초기화 섹션에 프레임을 등록합니다
initialization
begin
RegisterClasses([TMyFrame])
그런 다음 프레임과 구성 요소에 액세스 할 수있는 양식 장치의 공개 섹션에서 필요한 속성을 선언합니다.
public
property TimeDate: TOverlayItem read ReadTimeDate write SetTimeDate;
또한 프레임을 사용하여 종종 반복되는 구성 요소 그룹을 통합하고 있습니다.
이것은 내가 원하는 목적 (MyFrame 및 그 구성 요소 숨기기)에서 작동하는 것 같습니다. 그러나 다른 사람 이이 방법에 대한 경험이 있습니까?
프레임을 사용하는 단점이 있습니까? 실제로이 작업을 수행함으로써 어떤 혜택을 얻고 있습니까? 프레임 내에서 중첩 프레임을 사용하는 데 문제가 있습니까? 델파이에서 프레임 사용에 대한 모범 사례 가이드가 있습니까? 델파이에 숨어있는 GUI 정보와 관련하여 동일한 효과를 달성하는 더 나은/ 쉬운 방법이 있습니까?
HMCG
해결책
UI 계층에 여전히 많은 논리가있는 것 같습니다. 양식/패널에는 많은 가치 속성이 없어야합니다 (대화 상자 제외).
MVC 패턴을 읽는 것보다 더 많은 구조를 원한다면.
모든 것을 말하면, 프레임은 GUI를 구성하는 좋은 방법이 될 수 있습니다. 모든 것과 마찬가지로 과도하게 사용하지 마십시오.
다른 팁
나는 일반적으로 복잡한 재사용 가능한 비트를 만드는 프레임을 좋아합니다. 대부분의 경우 화면을 구성하는 정말 깨끗한 방법이 될 수 있다고 생각합니다. 그러나 언급 한 바와 같이 헨크 홀터 맨 화면과 프레임에는 UI의 기능과 관련된 논리 만 포함되어야하며 비즈니스 논리에 대해 가능한 한 무지해야합니다.
UI에 몇 가지 포인트가 프레임과 정보를 숨기고 있습니다.
- 논의 stackoverflow에 대한 또 다른 질문에서 프레임에서 이벤트 핸들러를 사용할 때주의해야합니다.
- 프레임에는 여전히 게시 된 속성이 많으며 서로의 비트와 부적절하게 바이올린을 쓸 수있는 양식 문제를 실제로 해결하지 못합니다. 당신이 그것을하지 않더라도, 코드가 허용되면 누군가는 결국 그대로하지 말아야 할 코드를 작성합니다. 나는 항상 글로벌 양식 변수 델파이를 코드로 제거하고 종종 래퍼 객체를 작성하거나 UI에 대한 제어 된 액세스를 제공하는 인터페이스를 구현합니다.
따라서 다음과 같은 코드를 갖는 대신 :
ClientForm := TClientViewForm.Create(Self);
try
ClientForm.Client := MyClient;
ClientForm.ShowModal;
finally
ClientForm.Free;
end;
나는 일반적으로 사람들이 어떤 종류의 글을 쓰도록 강요합니다.
ClientViewer := TClientViewer.Create(MyClient);
try
ClientViewer.Show;
finally
ClientViewer.Free;
end;
또는
TClientViewer.ShowClient(MyClient);
클래스 방법 ShowClient가 첫 번째 목록에 표시된 비트를 처리하도록합니다. 이렇게하면 호출 코드는 양식 포인터를 수신하지 않으며 래퍼 클래스에서 구체적으로 제공되지 않는 비트를 터치 할 수 없습니다.