|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перенос переменных между формами
Всем доброго времени суток! Работаю с делфи недавно и вот появился вопрос, на который я легко нашел ответ в интернете. Но теперь что то не работает и я никак не могу найти ошибку.
У меня есть три модуля. 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. |
#2
|
|||
|
|||
В коде могут быть не оптимизированные моменты, буду рад, если вы мне о них скажете и расскажите, как это исправить
Код:
unit TV1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellApi, StdCtrls, Grids, Math; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; StringGrid1: TStringGrid; Label3: TLabel; Label4: TLabel; Edit2: TEdit; Label5: TLabel; Label6: TLabel; Label7: TLabel; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label8: TLabel; Edit6: TEdit; Label9: TLabel; Label10: TLabel; Label11: TLabel; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Button2: TButton; StringGrid2: TStringGrid; Label12: TLabel; Label13: TLabel; Label2: TLabel; Label14: TLabel; Edit10: TEdit; Button3: TButton; Label16: TLabel; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; OpenDialog: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit2KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure Edit4KeyPress(Sender: TObject; var Key: Char); procedure Edit5KeyPress(Sender: TObject; var Key: Char); procedure Edit6KeyPress(Sender: TObject; var Key: Char); procedure Edit7KeyPress(Sender: TObject; var Key: Char); procedure Edit8KeyPress(Sender: TObject; var Key: Char); procedure Edit9KeyPress(Sender: TObject; var Key: Char); procedure Edit10KeyPress(Sender: TObject; var Key: Char); procedure Edit1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } PO : Array[1..10] of real; end; Var Form1: TForm1; M,D: double; Mass:Array[1..100] of double; implementation Uses MO, Unit3; {$R *.dfm} //Открытие формы procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Visible:=false; StringGrid2.Visible:=false; Label12.Visible:=false; Label13.Visible:=false; Label2.Visible:=false; Button4.Visible:=false; Button5.Visible:=false; Button6.Visible:=false; Button3.Visible:=false; Label16.Visible:=false; FillChar(Mass, SizeOf(Mass), 0); end; procedure TForm1.Edit1Click(Sender: TObject); begin Edit1.Text:=''; end; //чтение файла procedure TForm1.Button1Click(Sender: TObject); var f: TextFile; fName,buf: String[80]; i,j,p,res:integer; answ: word; Ms:Array[1..100] of String; begin p:=1; fName:=Edit1.Text; AssignFile(f, fName); StringGrid1.Visible:=true; Button3.Visible:=true; Label16.Visible:=true; //Запись из файла в массив For i:=1 to 100 do Readln(f,Ms[i]); //Проверка и изменение целых чисел с точкой For i:=1 to 100 do Begin buf:=Ms[i]; For j:=1 to 5 do //Буду надеяться, что в файле не будет числа с целой частью больше 5 Begin if buf[j]='.' then begin buf[j]:=','; Ms[i]:=buf; end; End; End; //Запись в таблицу For i:= 0 To 9 do For j:= 0 To 9 do Begin StringGrid1.Cells[j,i]:=Ms[p]; p:=p+1; End; //Превращение строкового массива в целый For i:=1 to 100 do Mass[i]:=StrToFloat(Ms[i]); end; procedure TForm1.Button2Click(Sender: TObject); var matr:array[1..2,1..8] of real; i,j,kol:integer; begin //Если поля пустые - заменяем их 0 if Edit2.Text='' then Edit2.Text:='0'; if Edit3.Text='' then Edit3.Text:='0'; if Edit4.Text='' then Edit4.Text:='0'; if Edit5.Text='' then Edit5.Text:='0'; if Edit6.Text='' then Edit6.Text:='0'; if Edit7.Text='' then Edit7.Text:='0'; if Edit8.Text='' then Edit8.Text:='0'; if Edit9.Text='' then Edit9.Text:='0'; if Edit10.Text='' then Edit10.Text:='0'; matr[1,1]:=StrToInt(Edit2.Text); matr[1,2]:=StrToInt(Edit3.Text); matr[1,3]:=StrToInt(Edit4.Text); matr[1,4]:=StrToInt(Edit5.Text); matr[1,5]:=StrToInt(Edit6.Text); matr[1,6]:=StrToInt(Edit7.Text); matr[1,7]:=StrToInt(Edit8.Text); matr[1,8]:=StrToInt(Edit9.Text); //проверка полей kol:=StrToInt(Edit10.Text); If kol=0 then Begin ShowMessage('Количество монет не может быть равно 0!'); Exit; End; if kol<>StrToInt(Edit2.Text)+StrToInt(Edit3.Text)+StrToInt(Edit4.Text)+StrToInt(Edit5.Text)+StrToInt(Edit6.Text) +StrToInt(Edit7.Text)+StrToInt(Edit8.Text)+StrToInt(Edit9.Text) then begin ShowMessage('Количество монет не ровняется количеству монет, введёным в поля!'); Exit; end; StringGrid2.Visible:=true; Label12.Visible:=true; Label13.Visible:=true; Label2.Visible:=true; Button4.Visible:=true; Button5.Visible:=true; Button6.Visible:=true; for i:=1 to 8 do matr[2,i]:=RoundTo(matr[1,i]/kol,-4); StringGrid2.Cells[0,0]:='10'; StringGrid2.Cells[1,0]:='5'; StringGrid2.Cells[2,0]:='2'; StringGrid2.Cells[3,0]:='4'; StringGrid2.Cells[4,0]:='3'; StringGrid2.Cells[5,0]:='0,1'; StringGrid2.Cells[6,0]:='0,05'; StringGrid2.Cells[7,0]:='0,01'; for i:=0 to 7 do StringGrid2.Cells[i,1]:=FloatToStr(matr[2,i+1]); M:=0; D:=0; For i:=0 to 7 do M:=M+StrToFloat(StringGrid2.Cells[i,0])*StrToFloat(StringGrid2.Cells[i,1]); //Мат ожидание For i:=0 to 7 do D:=D+exp(2*ln(StrToFloat(StringGrid2.Cells[i,0])))*StrToFloat(StringGrid2.Cells[i,1]); //Дисперсия D:=D-M; end; //тут происходит магия и блокируются все плохие буквы. procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit3.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit4.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit5.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit6.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit7.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit7KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit8.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit8KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : Edit9.SetFocus ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit9KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Edit10KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9': ; // цифра #8 : ; // клавиша <Back Space> #13 : ; // клавиша <Enter> else Key :=Chr(0); // символ не отображать if Key='' then Edit2.Text:='0'; end; end; procedure TForm1.Button4Click(Sender: TObject); var i,p:integer; begin if Form2=nil then Form2:= TForm2.create( self ); p:=0; Form2.M:=RoundTo(M,-4); for i:=1 to 100 do if Mass[i]<>0 then p:=p+1; if p<>0 then for i:=1 to 100 do Form2.Mass[i]:=Mass[i] else Begin ShowMessage('Вы не загрузили файл или все значения равны нулю!'); Exit End; Form2.Show; end; procedure TForm1.Button7Click(Sender: TObject); begin OpenDialog.InitialDir := ExtractFilePath( Application.exename ); if OpenDialog.Execute then Edit1.Text:=OpenDialog.FileName; end; procedure TForm1.Button5Click(Sender: TObject); var i,p:integer; begin if Form3=nil then Form3:= TForm3.create( self ); p:=0; Form3.D:=RoundTo(D,-4); ShowMessage('D= '+FloatToStr(D)+' '+'FD= '+FloatToStr(Form3.D)); for i:=1 to 100 do if Mass[i]<>0 then p:=p+1; if p<>0 then for i:=1 to 100 do Form3.Mass[i]:=Mass[i] else Begin ShowMessage('Вы не загрузили файл или все значения равны нулю!'); Exit End; p:=0; for i:=1 to 10 do Form3.PO[i]:=PO[i]; Form3.Show; end; End. |
#3
|
||||
|
||||
Зачем что-то куда-то передавать? Массив буде доступен любому юниту, который подключит юнит с массивом. При условии, что массив находится в секции public или обозначен как var и находится в секции interface.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
|||
|
|||
В TV1 формы создаются и, что бы не париться с этим делом, я просто передаю их туда.
Ошибка то в том, что в 358 строчке (for i:=1 to 10 do Form3.PO[i]:=PO[i] массив передаётся и можно вывести переменные Form3.PO[i] и PO[i]; Но вот в Form3 ничего нет и все равно 0. |
#5
|
||||
|
||||
Объявляю вас победителем в номинации "Лучший говнокод-китайкод месяца" — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 19:10. |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
PhoeniX (10.11.2013)
|
#6
|
|||
|
|||
Спасибо, приятно.
Но если вы поподробнее расскажите, что же такого страшного в моей писанине, то в будущем постараюсь такого не писать. |
#7
|
||||
|
||||
Ну там процентов на 90 можно код сократить, ибо код повторяется.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#8
|
|||
|
|||
Цитата:
Тогда вопрос. Есть вот такой блок: Код:
if Edit2.Text='' then Edit2.Text:='0'; if Edit3.Text='' then Edit3.Text:='0'; if Edit4.Text='' then Edit4.Text:='0'; if Edit5.Text='' then Edit5.Text:='0'; if Edit6.Text='' then Edit6.Text:='0'; if Edit7.Text='' then Edit7.Text:='0'; if Edit8.Text='' then Edit8.Text:='0'; if Edit9.Text='' then Edit9.Text:='0'; if Edit10.Text='' then Edit10.Text:='0'; Как его сократить? С делфи работаю не так долго, поэтому не знаю, как изменять номера Edit-ов и что бы при этом все работало. |
#9
|
||||
|
||||
Код:
procedure Nvl_(const AEdList: array of TEdit); var i: integer; begin for i := 0 to Length(AEdList) - 1 do with AEdList[i] do if Text = '' then AEdList[i].Text := '0'; end; ... Nvl_([edit1, edit2, edit3...edit100]); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#10
|
|||
|
|||
Цитата:
Спасибо, применю. А по поводу ошибки, ради которой и создавалась тема нет идей? Цитата:
Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 22:44. |
#11
|
||||
|
||||
А можно запилить класс-наследник TEdit и добавить ему нужных методов/полей. А потом с помощью известного хака подменить им стандартный TEdit, для простоты использования.
Вообще все проблемы этого кода растут из того факта, что автор не умеет в ООП. Нет, вы учитесь "просто что-то кодить". А ООП требует отдельного понимания, которое порой никак не идёт. Зато когда наконец доходит - сразу глубоко проникаешься этими идеями. По сабжу: А переменная Form3 где объявлена? Вот это что ли? Код:
Const Form3: TForm3 = nil; Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 22:45. |
#12
|
|||
|
|||
Этот изврат работает. У меня передаётся значение из TV1 в MO так же и все хорошо. А вот в третий модуль - никак.
А по ооп почитаю, постараюсь разобраться. |
#13
|
||||
|
||||
Многие извраты работают, но этим не стоит гордиться.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |