2010-12-10 1 views
5

델파이에서 프로 시저를 작성하려고합니다. 이 프로시 저는 TControl 하위 요소의 이름을 가져온 후 일부 속성을 변경하려고 시도합니다. 하지만 난 그것을 할 때, 델파이 같은 오류 제공 :"실제 및 공식 var 매개 변수 유형이 동일해야합니다."절차에서 오류가 발생했습니다.

procedure Change_prop(var Control: TControl;height:integer;width:integer); 
begin 
//...... 
end; 

사용 예 : 매개 변수가 동일

절차해야 실제와 공식 VAR의

E2033 유형 : Change_prop(Label1, 50,200); 그 오류의 해결책은 무엇입니까? 감사합니다.

답변

9

당신은 단지 제어 매개 변수의 VAR을 제거하고 값 매개 변수를 확인해야합니다. Delphi 객체는 실제로 참조 유형으로 구현되기 때문에 값 또는 const 매개 변수로 프로 시저에 전달한 경우에도 메소드를 호출하거나 멤버 필드 등을 변경할 수 있습니다.

+0

신속한 답변을 보내 주셔서 감사합니다. 문제가 해결되었습니다 .. – Alper

+0

예를 들어 "Key"매개 변수에 "var"가 쓰여진 OnKeyDown 이벤트를 호출하려고 할 때 ...? OnKeyDown (Self, VK_RETURN, ssNone) (제목에 오류가 발생 함)과 같이 직접 호출 할 수있는 방법이 있습니까, 아니면 OnKeyDown 이벤트 내에서 호출되도록 Subprocedure를 작성해야 할 필요가 있으며 다른 곳에서 사용할 수 있습니다. ...? –

+1

@ Just 이벤트 처리기를 호출하면 안됩니다. 프레임 워크가 그렇게하도록하십시오. 코드를 공유해야하는 경우 이벤트 핸들러에서 호출하는 메서드에 코드를 저장하십시오. –

4

그냥 VAR를 제거 - 당신이 컨트롤의 속성을 변경할 필요하지 않습니다

procedure Change_prop(Control: TControl;height:integer;width:integer); 
begin 
...... 
end; 
+0

빠른 응답 감사합니다. 문제가 해결되었습니다. – Alper

2

David가 말했듯이 문제는 var에 있습니다. 그렇다고해서 TControl의 멤버를 수정할 수 있다는 의미는 아니며, 을 TControl과 완전히 다른 TControl으로 바꾸는 것을 의미합니다. 개체는 참조 형식이기 때문입니다.

매개 변수 매개 변수에 개체를 전달하는 경우 형식 안전을 유지하기 위해 전달하는 변수를 매개 변수와 정확히 같은 형식으로 선언해야합니다. 그렇지 않으면 다음을 수행 할 수 있습니다.

procedure TForm1.VarControl(var control: TControl); 
begin 
    control := TButton.Create; 
end; 

procedure TForm1.Mistake; 
begin 
    VarControl(self.Memo1); //defined as TMemo 
    Memo1.Lines.Text := 'Undefined behavior here...'; 
end; 
+2

오브젝트 파스칼에서는 정의되지 않은 동작이 없으며 C 사용자 만 사용할 수 있습니다. 'Troubles (Pointer (Random (MaxInt))). AskFor (EXPLICIT)' –

+0

@ user205376 뭐하고 있니? !! –

+0

@David : 농담이라고 생각합니다. –

관련 문제