2011-08-19 5 views
0

저는 Delphi Prism for .NET에서 작업하고 있습니다. 다른 winform 메서드에서 mainform 클래스의 public 메서드를 호출해야합니다. 그래서, 정적에 대해 최근에 배운 데, 나는 그것을 프로그램에서 사용했습니다. 정적 또는 클래스 winform 잘 작동하지만 메서드를 정적 또는 클래스 만들기 같은 작동하지 않는 것.Delphi Prism의 정적 또는 클래스 메서드

내 메인 폼 클래스에 updateButtons라는 메서드가 있습니다. 그것은 사용자의 행동에 따라 메인 폼의 모든 버튼과 컨트롤을 업데이트합니다. 이 메서드는 다른 winform 메서드에서 호출해야합니다. 그래서 저는 UpdateButtons 메서드를 정적 또는 클래스로 만들었습니다. 지금은 호출하는 메서드를 볼 수 있지만, 컴파일러는 좋아하지 않아. "인스턴스 참조없이 인스턴스 멤버 (모든 컨트롤)를 호출 할 수 없습니다."라는 오류가 계속 발생합니다.

메서드를 클래스 또는 정적으로 만들 수 있으며 어떻게 winform에서 컨트롤에 액세스 할 수 있습니까? 정적 또는 클래스 방법

Main 클래스 : UpdateButton의의

MainForm = partial class(System.Windows.Forms.Form) 
    private 
    protected 
    method Dispose(disposing: Boolean); override; 
    public 
    class method updateButtons; 
    end; 

정의 :

class method MainForm.updateButtons; 
begin  
     if SecurityEnabled then 
       LoginBtn.Enabled := true  //All the lines where I call Buttons raise the error exception that I mentioned above. 
     else 
     begin 
       UnitBtn.Enabled := true; 
       SignalBtn.Enabled := true; 
       AlarmBtn.Enabled := true; 
       MakerBtn.Enabled := true; 
       TrendBtn.Enabled := true; 
       DxCommBtn.Enabled := (Scanning = false); 
       TxBtn.Enabled := true; 
       ControlBtn.Enabled := true; 
       PIDBtn.Enabled := true; 
       SystemBtn.Enabled := true; 
       WinListBox.Enabled := true; 
       WinBtn.Enabled := true; 
       ShutdownBtn.Enabled := true; 
       OptionBtn.Enabled := true; 
       LoginBtn.Enabled:=false; 
     end; 
    end; 

답변

0

실행하려는 메서드가 MainForm Window Form에서 발생 했으므로 버튼 이벤트 내에서 발생했기 때문에 다른 WinForm 대신 MainForm에서 Button Click 이벤트 내에서 해당 메서드를 호출하기로 결정했습니다. 이것은 같은 결과를 가져옵니다. 게다가, 더 간단합니다.

//This is just a sample code 
MainForm = class(system.windows.forms.form) 
private 
    method ScanBtn_Click(sender: System.Object; e: System.EventArgs); 
protected 
public 
    Method UpdateButtons; 
end; 

Method Mainform.UpdateButtons; 
begin 
    Button1.enabled:=true; 
    Button1.text:='Start Scanning'; 
end; 

method MainForm.ScanBtn_Click(sender: System.Object; e: System.EventArgs); 
begin 
    if not Scanning then 
     stopthread:=true; 

    dxCommWin.Scan(not Scanning); 
    UnitWin.UpdateMenu; 
    UpdateButtons; <-------I call it here instead of from dxCommWin.Scan Method. 
end; 
+1

사실,이 경우 dxCommWin.Scan에서 호출하고 싶다면 MainForm (self)에 대한 참조를 메서드의 두 번째 매개 변수로 전달하면됩니다.'dxCommWin.Scan (Scanning, self); 이 경우 메서드의 서명은'method dxCommWin.Scan (scanning : boolean; form : MainForm);과 같을 것이고 메서드 내에서 폼에 액세스 할 수 있습니다. 그게 내가 "양식에 대한 참조를 가져 오는 것"을 의미하는 것입니다. –

+0

참. 나는 비슷한 코드를 구현할 계획을 가지고 있었지만, 내 솔루션에 대해 생각해 보았고 그 이후로는 dxCommWin.Scan을 호출 한 직후에이 메소드를 실행하는 것이 더 적합하다고 보였다. 고마워, 세바스챤. – ThN

1

이것은 당신이 작업하고자하는 방식으로 작동하지 않을 수 있습니다.

클래스 (또는 정적) 메서드는 클래스에서 정적으로 호출되며 특정 개체 인스턴스에서 호출되도록 반대됩니다.

같은 양식 클래스를 여러 번 인스턴스화 할 수 있습니다. 그런 다음 동시에 열거 나 숨길 수있는 폼의 여러 객체 인스턴스가 있습니다.

이제 정적 메서드를 호출 할 때 여러 폼 중 WHICH를 업데이트해야합니까? 컴파일러는 알 수 없으며 개체 인스턴스에 속한 필드 나 속성에 대한 액세스를 허용 할 수 없습니다.

이 작업을 수행하려면 메서드를 개체의 일반 메서드 (비 클래스 또는 정적)로 만들어야하며 구체적인 폼 개체 인스턴스에 대한 참조를 검색하여 호출해야합니다.

+0

@ 세바스찬. 그것은 정적이고 그것을 만드는 클래스로 변하기 때문에, 그 자체로 인스턴스화 될 필요가 있습니다. 사실 MainForm의 컨트롤조차 인식하지 못했습니다. 당신의 솔루션은 단순 해 보이지만 어떤 일을해야합니다. – ThN

+0

@ Sebastian 귀하의 설명은 귀하의 해답을 수락하지 않았지만 귀하의 설명이 내 오해를 분명히하고 해결책을 찾는데 도움이되었습니다. 그래서 나는 당신의 대답에 투표했습니다. 감사. – ThN