문제

Delphi 2009의 "With"처리와 다른 점을 아는 사람이 있습니까?

어제 "DataModule, DataSet, MainForm과 같이"전체 참조와 같이 "완전한 참조"로 해체함으로써 문제를 해결했습니다. Delphi 2006 및 이전에는 데이터 세트에 "Close"를 적용했습니다. Delphi 2009는 MainForm에 "Close"를 적용하여 응용 프로그램을 종료했습니다!

도움이 되었습니까?

해결책

아무것도 변하지 않았다. 이전 관찰이 잘못되었습니다. a with 진술은 "오른쪽에서 왼쪽"으로 간주되므로 예에서는 MainForm 그러면 먼저 검색 될 것입니다 Dataset, 그리고 Datamodule. 그것이 항상 그랬던 방식입니다. 당신이 이것을 쓴 것과 동일합니다.

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

계속해서 Delphi 2006 문서를 확인하십시오. 이름이 지정된 섹션이 있어야합니다 선언 및 진술, 당신이 찾을 수있는 구조화 된 진술, 섹션을 포함하여 진술과 함께.

자신에게 호의를 베풀고 사용하지 마십시오 with. 디버깅 중과 유지 보수 중에 문제가 발생하지 않으며, 전날 코드를 작성한 사람이 유지 보수를 수행 할 수도 있습니다.

다른 팁

With 악입니다. 나는 이것을 몇 번이나 말할 필요가 있는지 모르겠지만, 아직 우리는 아직 거기에 없다.

절대 변하지 않을 객체와 함께 "안전하게"만 사용할 수 있습니다. 자신의 프로젝트에서 정의하는 객체에 적용하면 모든 베팅이 꺼져 있으며 코드를 실행하기 위해 Random (50) <25 "부분을 사용해야합니다. 적어도 이상하게 실행되도록 문서화됩니다.

문제는 일단 객체를 엉망으로 만들거나 새로운 방법이나 속성을 소개하거나 기존의 모든 방법을 바꾸는 것입니다. with-이러한 방법을 사용하는 단계는 의미를 바꿀 가능성이 있습니다. "경고 : 모호한 방법으로 호출"이 아닙니다. 코드는 이전에 한 것 외에 다른 일을 할 것입니다. 그것에 대해 말하지 않고.

예를 들어, 이것을 가지고 있다고 가정 해 봅시다.

with connection, file do
begin
    Close;
end;

그러면 어떻게 될 것으로 예상 되나요? 파일을 닫는 것은 당연하므로 파일이 닫히기를 기대합니다. 이 파일 변수는 닫기 메소드를 정의하지 않고 CloseFile 메소드를 정의하는 TSOMEODDFILE의 객체를 보유한다고 가정 해 봅시다. 위의 진술은 대신 연결을 닫습니다.

모든 것이 문서화되어 있으며, 아무도이 코드를 작성하지 않았는데,이 코드는 파일이 닫힐 것이라고 생각하는이 코드를 썼습니다. 결국 그 방법은 해당 객체에 대한 CloseFile으로 선정되어 있습니다. 단지 내 가정이 잘못되었으며 프로젝트에서 작동하지 않습니다. 아직.

그런 다음 누군가가 그 문제를 해결하여 CloseFile을 닫습니다. 위의 코드는 연결 대신 파일을 조용히 닫습니다. 경고가없고 오류가 없으며 메소드 이름을 변경하기 전과 마찬가지로 잘 컴파일합니다. ^h^h^h와 마찬가지로 실행됩니다. 기다리지 마십시오.

그래, with a **에서 당신을 물을 것입니다.

사용 with A,B,C,D 다른 유닛의 변경으로 인해 코드가 예상대로 작동하지 않기 때문에 나쁜 관행입니다. 보다 여기 자세한 내용은 또는 여기 (검색 "with keyword").

컴파일러는 일반적으로 매우 견고하므로 다른 모든 것을 제외하기 전에 버그 나 변경을 가정하지 않습니다. 내가 빨리 생각할 수있는 몇 가지 사항 :

1) 과부하 된 기능 또는 연산자를 사용하는 경우. 문자열 (및 기타 여러 유형)의 정의가 변경되었으므로 서명이 효과적으로 변경되므로 다른 변형을 선택할 수 있습니다.

2) 일부 포함 된 장치는 이제 이미 사용 된 식별자를 정의하고 다른 장치에 노출 된 것을보다 우선 순위로 정의 할 수 있습니다.

그렇지 않은 경우 가능한 한 적은 단위를 사용하여 최소한의 예에서 코드를 격리하십시오. 속임수는 행동이 바뀌었을 때 마지막 변화가 되었기 때문에 단계별로 수행하십시오.

여기에 그 (또는 URL) 게시하면 항상보기 흥미 롭습니다.

함께 .. 주의해서 사용해야합니다. 그렇지 않으면, 무한한 두통의 원천입니다 .... 나는 Rob Kennedy와 다른 사람들과 동의합니다.

처럼 크레이그 스턴츠 (다른 게시물에서) 그리고 Lasse V. Karlsen 위의 말, 함께 .. 많은 함정을 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top