2013-04-30 1 views
1

메서드 또는 컴파일러 지시문이 있거나 쿼리/데이터베이스 연결과 같은 특정 구성 요소를 확인하는 방법이 빌드/컴파일을 실행할 때 active = false로 설정되거나 연결이 끊어집니다 ? 너무 자주 이러한 것들은 다른 것으로 켜져 있고 당신은 너무 늦을 때까지 그것을 알아 채지 못합니다.컴파일시 데이터베이스 연결을 해제하도록 설정하는 방법

내 특정 설치는

답변

3

내가 최선의 선택 재고 연결 구성 요소를 하위 클래스가 될 것이라고 생각하고

if not csDesigning in Self.ComponentState then 
    if not Self.ActiveInDFM {new boolean published property} then 
     if Self.Active then Self.Active := false; 
inherited; 

(ab) Delphi 폼 디자이너 어리 석음을 사용하면 실제로 IDE 팔레트에 새 구성 요소를 설치하지 않고도 사용할 수 있습니다. 스톡 구성 요소 클래스와 동일한 이름을 지정한 다음 폼의 인터페이스에 마지막으로 자신의 메서드를 추가합니다. 목록을 사용합니다 : 따라서 디자인 타임에 주식 구성 요소가 있고 컴파일 할 때 자신의 구성 요소로 투명하게 대체됩니다.

또는 당신이 할 수있는 하위 클래스 그것은 바로 (다른 구성 요소)처럼 매우 형태 선언 위 :이 방법은 IDE의 한계를 사용하여 aspect 지향 프로그래밍 아날로그로 볼 수 있습니다 생각

type 
    TPanel = class(ExtCtrls.TPanel) 
    private 
    ... 

    TForm1 = class(TForm) .... 

개발자가 이익을 얻는 방식으로


또 다른 방법은 저장 또는 빌드 전에 DFM에서 .active는 속성을 청소 일부 스크립트가 될 수도 있지만,이 방법은 독립 실행 형 빌드 통합하는 내가 더 열심히 할 수

  • 에 대한 복잡 severs (다른 CI 프레임 워크마다 새로운 스크립트가 시도 됨)
  • 디자인 타임에 Active 속성도 재설정됩니다. 이것은 엄격한 관점에서 할 적절한 것입니다. 그러나 이것은 매우 편리하지 않을 수 있습니다.

당신은 당신의 폼의 비슷한 코드를 사용할 수 있고 데이터 모듈의 .Loaded method (당신이 다음 대신 연결의 방법을 오버라이드 (override) 할 것이다).

같은 코드를 모든 Form의 Loaded 메서드에 복사하여 붙여 넣을 수 있습니다.

procedure TMyForm.Loaded; // override 
var c: TComponent; i: integer; 
begin 
    try 
    for i := 0 to Self.ComponentsCount - 1 do begin 
     c := Self.Components[i]; 
     if c is TCustomConnection then 
      with TCustomConnection(c) do // Hate those redundant typecasts! 
      if Connected then Connected := false; 
     if c is TDataSet then 
      with TDataSet(c) do // Delphi could took a lesson from Component Pascal 
       if Active then Active := false; 
     if c is ... // transactions, stored procedures, custom libriaries... 
    end; 
    finally 
    inherited; 
    end; 
end;  

이것은 덜 교활한 방식 인 것으로 보이며 따라서 가장 안정적입니다. 그래도 복사 붙여 넣기가 많이 필요합니다. 나중에 새로운 구성 요소 나 라이브러리를 추가하면 모든 양식에서 복사 붙여 넣은 코드를 수정할 수 있습니다.

당신은 Disconnect(const owner: TComponent); 같은 세계적인 프로 시저에 일부 MyDBUtils 단위로이 코드를 중앙 집중화 할 수 있으며 다음

procedure TMyForm.Loaded; // override 
var c: TComponent; i: integer; 
begin 
    try 
    MyDBUtils.Disconnect(Self); 
    finally 
    inherited; 
    end; 
end; 

이 방법도 있지만 단점이 있습니다

:

  • 것은이 단단히 모든 과 함께 MyDBUtils 장치를 만들 것 모든은 데이터베이스 관련 lib 및 구성 요소를 사용할 수 있습니다. 대규모의 상속 된 프로젝트 - 다른 DB 액세스 라이브러리와 마이그레이션 프로세스를 기반으로하는 다른 바이너리 모듈로 구성되어 모든 액세스 라이브러리를 모든 바이너리 모듈로 가져옵니다.
    1. ad hoc DI 프레임 워크로 극복 할 수는 있지만 그 반대의 경우가 발생할 수 있습니다. 부족한 게재 위험이 있습니다. 라이브러리 또는 구성 요소 처리기를 실제로 사용하거나 수정하여 사용하는 것을 잊어 버릴 수 있습니다. 그것.
    폼에 데이터 연결, 메모리 내장 테이블, 메모리 내장 NexusDB 또는 SQLite 데이터베이스 등의 연결을 재설정하지 말아야하는 구성 요소가있는 경우, 그 (것)들을 선택하는 임시 비 명백한 인습.
1

내 응용 프로그램에서 디자인 타임에 내 연결의 Tag 속성을 1로 설정했습니다. OnBeforeConnect 이벤트에서 Tag을 확인하고 1과 같으면 연결을 중단하고 0으로 설정합니다.

+0

태그가있는 트릭이 올바르게 작동합니다. 명확히하기 위해 : 즉, DatabaseName을 지움으로써 연결을 중단시킬 수 있습니다. – dvpublic

관련 문제