메서드 또는 컴파일러 지시문이 있거나 쿼리/데이터베이스 연결과 같은 특정 구성 요소를 확인하는 방법이 빌드/컴파일을 실행할 때 active = false로 설정되거나 연결이 끊어집니다 ? 너무 자주 이러한 것들은 다른 것으로 켜져 있고 당신은 너무 늦을 때까지 그것을 알아 채지 못합니다.컴파일시 데이터베이스 연결을 해제하도록 설정하는 방법
내 특정 설치는
메서드 또는 컴파일러 지시문이 있거나 쿼리/데이터베이스 연결과 같은 특정 구성 요소를 확인하는 방법이 빌드/컴파일을 실행할 때 active = false로 설정되거나 연결이 끊어집니다 ? 너무 자주 이러한 것들은 다른 것으로 켜져 있고 당신은 너무 늦을 때까지 그것을 알아 채지 못합니다.컴파일시 데이터베이스 연결을 해제하도록 설정하는 방법
내 특정 설치는
GExperts의 Set Component Properties 기능을 사용할 수 있습니다.
내가 최선의 선택 재고 연결 구성 요소를 하위 클래스가 될 것이라고 생각하고
if not csDesigning in Self.ComponentState then
if not Self.ActiveInDFM {new boolean published property} then
if Self.Active then Self.Active := false;
inherited;
.Loaded
방법 델파이 7(ab) Delphi 폼 디자이너 어리 석음을 사용하면 실제로 IDE 팔레트에 새 구성 요소를 설치하지 않고도 사용할 수 있습니다. 스톡 구성 요소 클래스와 동일한 이름을 지정한 다음 폼의 인터페이스에 마지막으로 자신의 메서드를 추가합니다. 목록을 사용합니다 : 따라서 디자인 타임에 주식 구성 요소가 있고 컴파일 할 때 자신의 구성 요소로 투명하게 대체됩니다.
또는 당신이 할 수있는 하위 클래스 그것은 바로 (다른 구성 요소)처럼 매우 형태 선언 위 :이 방법은 IDE의 한계를 사용하여 aspect 지향 프로그래밍 아날로그로 볼 수 있습니다 생각
type
TPanel = class(ExtCtrls.TPanel)
private
...
TForm1 = class(TForm) ....
개발자가 이익을 얻는 방식으로
또 다른 방법은 저장 또는 빌드 전에 DFM에서 .active는 속성을 청소 일부 스크립트가 될 수도 있지만,이 방법은 독립 실행 형 빌드 통합하는 내가 더 열심히 할 수
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 액세스 라이브러리와 마이그레이션 프로세스를 기반으로하는 다른 바이너리 모듈로 구성되어 모든 액세스 라이브러리를 모든 바이너리 모듈로 가져옵니다.
내 응용 프로그램에서 디자인 타임에 내 연결의 Tag
속성을 1로 설정했습니다. OnBeforeConnect
이벤트에서 Tag
을 확인하고 1과 같으면 연결을 중단하고 0으로 설정합니다.
태그가있는 트릭이 올바르게 작동합니다. 명확히하기 위해 : 즉, DatabaseName을 지움으로써 연결을 중단시킬 수 있습니다. – dvpublic
Perfect. 고맙습니다. –