Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Статические данные.


Автор: Rohoss 22.2.2009, 09:01
Каким образом лучше всего на Delphi реализовать данный алгоритм, написанный на C#
Код

    public class MyStaticClass
    {
        public static int Field1;
        static MyStaticClass()
        {
            Field1 = 30;
        }

        public static int IncField1()
        {
            return Field1++;
        }
        
    }

...........................................
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                string s = Convert.ToString(MyStaticClass.IncField1());
                MessageBox.Show(s);
                
            }
        }


То есть нужно заменит чем-то статический конструктор и статическое поле (если не ошибаюсь, их в Delphi нет).
В результате статический метод  должен возвращать постоянно увешивающееся число.

Добавлено через 3 минуты и 11 секунд
Мне, в общем, то не ясно, где будут храниться данные, и как инициализируются, если использовать только атрибуты класса.

Автор: Rrader 22.2.2009, 13:48
Я бы делал так:
Код

  TMyStaticClass = class(TObject)
  strict private
    class var FField1: Integer;
    class procedure SetField1(Value: Integer); static;
  public
    class function IncField1: Integer; static;
    class property Field1: Integer write SetField1;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  S: String;
begin
  TMyStaticClass.Field1 := 30;
  for I := 0 to 9 do
  begin
    S := IntToStr(TMyStaticClass.IncField1);
    ShowMessage(S);
  end;
end;

{ TMyStaticClass }

class function TMyStaticClass.IncField1: Integer;
begin
  Result := FField1;
  Inc(FField1);
end;

class procedure TMyStaticClass.SetField1(Value: Integer);
begin
  FField1 := Value;
end;

end.

Автор: Rohoss 22.2.2009, 23:32
Rrader, это имхо отличный вариант решения вопроса (я о статических полях в Delphi не знал). А вот инициализировать  данные при первом вызове любого метода данного класса, наверное, не получится. Разве что делать статическое поле как флаг инициализации
Код

 TMyStaticClass = class(TObject)
  strict private
    class var FField1: Integer;
    class var IsInit: Boolean;
    class procedure ClassConstructor;
    class procedure SetField1(Value: Integer); static;
  public
    class function IncField1: Integer; static;
    class property Field1: Integer write SetField1;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyStaticClass }

class procedure TMyStaticClass.ClassConstructor;
begin
  if not IsInit then
  begin
    IsInit := True;
    FField1 := 30;
  end;
end;

class function TMyStaticClass.IncField1: Integer;
begin
  ClassConstructor;
  Result := FField1;
  Inc(FField1);
end;

class procedure TMyStaticClass.SetField1(Value: Integer);
begin
  FField1 := Value;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  I: Integer;
  S: String;
begin
  for I := 0 to 9 do
  begin
    S := IntToStr(TMyStaticClass.IncField1);
    ShowMessage(S);
  end;
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)