Статический или классовый метод в Delphi Prism - PullRequest
0 голосов
/ 19 августа 2011

Я работаю с Delphi Prism для .NET.Мне нужно вызвать публичный метод в моем классе mainform из другого метода winform.Итак, недавно узнав о static, я использовал его в своей программе.Static или Class winform отлично работает, но создание статического метода или класса, похоже, не работает одинаково.

В моем классе mainform есть метод updateButtons.Он обновляет все кнопки и элементы управления на главной форме в соответствии с действиями пользователя.Этот метод должен вызываться из другого метода winform.Итак, я превратил этот метод UpdateButtons в static или class.Хотя теперь я вижу метод для вызова, компилятор не любит.Появляется следующая ошибка: «Невозможно вызвать элемент экземпляра (любые элементы управления) без ссылки на экземпляр».

Как сделать метод классом или статическим и при этом иметь доступ к элементам управления из winform?

Основной класс со статическим или классовым методом:

  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;

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Это не может работать так, как вы хотите, чтобы оно работало.

Класс (или статический) метод вызывается статически в классе, а не в конкретном экземпляре объекта.

Вы можете создавать один и тот же класс формы несколько раз. Затем у вас есть несколько экземпляров объекта формы, которые можно открывать или скрывать одновременно.

Теперь, когда вы вызываете статический метод, КАКОЕ из этих нескольких форм должно быть обновлено? Компилятор не может сказать и не может разрешить доступ к полям или свойствам, принадлежащим экземплярам объекта.

Чтобы это работало, вы должны сделать метод обычным методом объекта (не классовым или статическим), и вам нужно получить ссылку на конкретный экземпляр объекта формы и вызвать его там.

0 голосов
/ 23 августа 2011

Поскольку метод, который я хочу выполнить, вызывается из формы окна MainForm и запускается из события кнопки, я решил вызвать этот метод из события нажатия кнопки из MainForm, а не из другой формы win. Это имеет тот же конечный результат. Плюс это проще.

//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;
...