2010-03-29 1 views
3

내가 델파이 2010 년 TMask 실험 한과 한 상황을 제외하고 예상대로 작동하는 것 같다 : 영역의 이름이 포함 된 경우 [나] 마스크는 항상 false를 반환 것으로 보인다. 예 :마스크에 "["가 포함되어있을 때 어떻게 TMask를 사용할 수 있습니까?

var 
    MaskObj : TMask; 
begin 
    MaskObj:= TMask.Create('c:\[test]\*'); 
    try 
    Result:= MaskObj.Matches('c:\[test]\text'); 
    finally 
    FreeAndNil(MaskObj); 
    end; 
end; 

false를 반환합니다. ...

예, [과] 파일 이름에 법적 문자입니다. 예를 들어 c : [test] *의 모든 파일을 제외 시키려면 여기에서 무엇을 할 수 있습니까? 내 유일한 해결책은 [가 감지 될 경우 StringReplace와 작업을 수행하는 것입니다, 그러나 이것은 많은 수의 파일에 대한 느린 될 것입니다 :

if (pos('[', Mask)>0) then 
begin 
    mask:= ReplaceString(Mask, '[','_', etc... 
    // and do the same for the file name--- 
end; 

다른 방법이 있습니까?

+0

TMask 란 무엇입니까? 어떤 단위입니까? 나는 여기있는 사람만큼 새로운 D2010 기능을 가지고 놀았으며 당신이 무엇을 언급하는지 전혀 모른다. –

+2

TMask는 단위 마스크에 있습니다. 그것은 델파이 2 이후로 존재했다고 생각합니다. – Lobuno

+0

@Mason : D1 또는 2 (TMaskEdit가 내부적으로 사용하기 때문에)부터 사용 해왔다. Lobuno가 보여주는 것보다 사용하기가 실제로 쉽습니다. uses 절에 Masks를 추가 한 다음 MatchesMask() 함수를 사용하기 만하면됩니다. 개체 인스턴스의 설정 및 해체는 필요하지 않습니다. –

답변

5

'['문자의 집합의 시작을 표시하기 위해 사용된다 (예를 들어, "[A-Z]"). '['자체적으로 일치 시키려면 단일 문자 세트로 만들어야합니다. ']'는 마찬가지로 '['가 발견되면 특수 문자이기 때문에 유사하게 이스케이프 할 필요가 없습니다. C:\[[]test]\*

편집을 시도해보십시오

당신이 마스크 StringReplace(Mask, '[', '[[]', [rfReplaceAll])를 사용해야합니다 임의의 마스크를 허용하는 경우가 아닌 파일 이름을. [a-z] 와일드 카드를 사용하지 않는다면 TMask에서 내려와 생성자에서 처리하게 될 것입니다. 당신이 경로에 대한 MatchesMask를 사용하려고하면

+0

기본적으로 StringReplace 호출이 여전히 필요합니다. stringReplace는 내부적으로 수행하기 때문에 'if pos' 호출을 제거하면 더 빨리 수행 할 수 있습니다. –

0
매우 조심

. 여기에 노출 된 것보다 더 많은 문제가 있습니다. 자세한 내용은 blog post을 참조하십시오.

하는 것은 문제를 해결하려면, 당신은 (당신의 사용 케이스가 허용하는 경우) (대신에 '공식'Masks 단위 컴파일하기 위해) 프로젝트 디렉토리에 Masks.pas 단위를 복사 경로와 파일 이름을 분할 할 수 스피드 페널티가 없도록 '['처리를 비활성화하십시오.

HTH

관련 문제