2011-08-19 97 views
0

我正在使用Delphi Prism for .NET。我需要从另一个winform方法中调用我的mainform类中的公共方法。所以,最近我了解了静态,我在程序中使用了它。静态或类的winform工程很好,但使一个方法静态或类似乎没有相同的工作。Delphi Prism中的静态或类方法

我有一个叫我MainForm类updateButtons方法。它根据用户的操作更新mainform上的所有按钮和控件。该方法需要从另一个winform方法中调用。所以,我将该UpdateButtons方法变为静态或类。虽然现在我看到要调用的方法,但编译器不喜欢。它不断提出以下错误,“无法调用实例成员(任何控件)没有实例引用。”

你怎么能做出一个方法从WinForm的类或静态的,仍然可以访问控制?

主要类的静态或类方法: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的窗口形式与从一个按钮事件中开枪,我决定从MainForm的,而不是从其他WinForm的调用这个方法从按钮的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(不扫描,自我)在这种情况下,该方法的签名看起来像'method dxCommWin.Scan(scanning:boolean; form:MainForm);'并且您可以从该方法内访问表单。那就是我的意思是“检索对表单的引用”。 –

+0

是的。我计划实现一个类似的代码,但我想到了我的解决方案,似乎更合适,因为这就是我想要做的 - 在调用dxCommWin.Scan之后立即执行该方法。谢谢,塞巴斯蒂安。 – ThN

1

这不能在你想要的工作方式工作。

的类(或静态)方法是被静态调用的类,而不是在一个特定的对象实例被调用。

您可以实例化几次相同的表单类。然后你有几个表单的对象实例,它们可以同时打开或隐藏。

现在,当你调用静态方法,这些几种形式,它们应该更新?编译器无法识别,也不能访问属于该对象实例的字段或属性。

对于这个工作,你必须使该方法的对象(非类或静态)的正常方法,你需要检索的具体形式对象实例的引用,并调用它。

+0

@ Sebastian,你说得对。由于它是一种方法,并将其变为静态类,所以它本身需要实例化。事实上,它甚至不认可来自MainForm的任何控制。你的解决方案看起来很简单,但需要一些操作 – ThN

+0

@ Sebastian你的解释确实澄清了我的误解,并帮助我达成了一个解决方案,尽管我没有接受你的答案。所以,我投了你的答案。谢谢。 – ThN

相关问题