Показать сообщение отдельно
  #1  
Старый 10.11.2013, 03:05
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Перенос переменных между формами

Всем доброго времени суток! Работаю с делфи недавно и вот появился вопрос, на который я легко нашел ответ в интернете. Но теперь что то не работает и я никак не могу найти ошибку.
У меня есть три модуля. TV1 - основной и два вспомогательных: MO и Unite3. Задача: из MO загрузить массив в TV1, откуда она попадет в Unite3.
При проверке оказалось, что значения в TV1передаются и даже записываются в Form3.*переменная* но вот в самой Form3 не выводятся почему. Ну не получает форма значения, ну никак. Помогите найти ошибку, пожалуйста.
Код:
unit MO;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math, Grids;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Memo: TMemo;
    Label3: TLabel;
    SG: TStringGrid;
    Label4: TLabel;
    Label5: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
    M : double;
    Mass : Array[1..100] of double;

  end;

const
     Form2: TForm2 = nil;
Var
 PO : Array[1..10] of real;

implementation

Uses TV1, Unit3;

{$R *.dfm}

procedure TForm2.FormActivate(Sender: TObject);
Var
i,j,p,op:integer;
Chr:String;
Sum,s:double;
begin

  //Вывод общего Мо
  Label2.Caption:='Математическое ожидание= '+FloatToStr(M)+#13+#13+'Матeматическое ожидание рассчитывает'
    +' по формуле: M=x1*p1+x2*p2+... где x-это номинал, а p-вероятность.'+#13+'Мат. Ожидание=Сумме произведения'
    +' номинала на вероятность.';

      // Рассчет и вывод оценки

     Memo.Lines.Insert(0, 'Оценка Математического ожидания'+#13);
     Memo.Lines.Insert(1, '');
     Memo.Lines.Insert(2, 'Оценка Математического ожидания считается по формуле: 1\n(x1+...xn). Все результаты округлены до 4 цифр после запятой.');
     p:=10; op:=1;
     for i:=3 to 22 do
     Begin
      sum:=0;
      Chr:='';
      for j:=1 to p do
      Begin
        Sum:=sum+Mass[j];
        Chr:=Chr+FloatToStr(Mass[j])+' + ';
      End;
      Delete(Chr,Length(Chr)-2,3);
      if (i mod 2)=0 then Memo.Lines.Insert(i,'') else
      begin
        Memo.Lines.Insert(i,'M'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
        SG.Cells[op-1,0]:=IntToStr(p);
        SG.Cells[op-1,1]:=FloatToStr(RoundTo(Sum/p,-4));
        PO[op]:=RoundTo(Sum/p,-4);
        p:=p+10;
        op:=op+1;
      End;
     End;
     for i:=1 to 10 do Form1.PO[i]:=PO[i];
end;

//Прокрутка вверх и вниз
procedure TForm2.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  VertScrollBar.Position:=VertScrollBar.Position+10;
end;

procedure TForm2.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  VertScrollBar.Position:=VertScrollBar.Position-10;
end;

end.

Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math, Grids;

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Mem: TMemo;
    Label3: TLabel;
    Memo12: TMemo;
    Memo13: TMemo;
    Memo14: TMemo;
    Memo15: TMemo;
    Memo16: TMemo;
    Memo17: TMemo;
    Memo18: TMemo;
    Memo19: TMemo;
    Memo110: TMemo;
    Memo11: TMemo;
    SG: TStringGrid;
    Label4: TLabel;
    Label5: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    D : double;
    Mass : Array[1..100] of double;
    PO : Array[1..10] of real;
  end;

Const
  Form3: TForm3 = nil;


implementation

uses TV1, MO;

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
Var
i,j,p,op:integer;
Chr:String;
Sum,s:double;
begin
  Label2.Caption:='Дисперсия= '+FloatToStr(D)+#13+#13+'Дисперсия рассчитывается'
    +' по формуле: D=x1^2*p1+x2^2+p2...-M где M- мат. ожидание'+#13;



    Mem.Lines.Insert(0, 'Оценка дисперсии'+#13);
    Mem.Lines.Insert(1, '');
    Mem.Lines.Insert(2, 'Оценка дисперсии считается по формуле: 1\n((x1-M1)^2+...+(xn-Mn)^2). Все значение округлены до 4 знаков после запятой.');
    p:=10; op:=1;
     for i:=3 to 22 do
     Begin
      sum:=0;
      Chr:='';
      for j:=1 to p do
        Begin
          Sum:=sum+Power(Mass[j]-PO[op],2);
          Chr:=Chr+'('+FloatToStr(Mass[j])+' - '+FloatToStr(PO[op])+')'+'^'+'2'+' + ';

         End;
     Delete(Chr,Length(Chr)-2,3);
     if (i mod 2)=0 then Mem.Lines.Insert(i,'') else
     begin
        Mem.Lines.Insert(i,'D'+IntToStr(op)+'= '{+'1/'+IntToStr(p)+'*'+'('+Chr+')= '}+FloatToStr(RoundTo(Sum/p,-4))+#13);
       SG.Cells[op-1,0]:=IntToStr(p);
        SG.Cells[op-1,1]:=FloatToStr(RoundTo(Sum/p,-4));

      Case op of
      1 : Memo12.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      2 : Memo13.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      3 : Memo14.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      4 : Memo15.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      5 : Memo16.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      6 : Memo17.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      7 : Memo18.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      8 : Memo19.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      9 : Memo110.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      10 : Memo11.Lines.Insert(1,'D'+IntToStr(op)+'= '+'1/'+IntToStr(p)+'*'+'('+Chr+')= '+FloatToStr(RoundTo(Sum/p,-4))+#13);
      End;
      p:=p+10;
      op:=op+1;
    End;
     End;

end;

procedure TForm3.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
VertScrollBar.Position:=VertScrollBar.Position-10;
end;

procedure TForm3.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
VertScrollBar.Position:=VertScrollBar.Position+10;
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
    if Form2=nil then
  begin
   ShowMessage('Вы не посчитали математическое ожидание!');
   Exit;
  End;
end;

end

Код:
program Project1;

uses
  Forms,
  TV1 in 'TV1.pas' {Form1},
  MO in 'MO\MO.pas' {Form2},
  Unit3 in 'DISCR\Unit3.pas' {Form3};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Ответить с цитированием