Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Ответить с цитированием
  #2  
Старый 10.11.2013, 03:07
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

В коде могут быть не оптимизированные моменты, буду рад, если вы мне о них скажете и расскажите, как это исправить
Код:
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  
Старый 10.11.2013, 03:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Зачем что-то куда-то передавать? Массив буде доступен любому юниту, который подключит юнит с массивом. При условии, что массив находится в секции public или обозначен как var и находится в секции interface.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 10.11.2013, 17:52
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

В TV1 формы создаются и, что бы не париться с этим делом, я просто передаю их туда.
Ошибка то в том, что в 358 строчке (for i:=1 to 10 do Form3.PO[i]:=PO[i] массив передаётся и можно вывести переменные Form3.PO[i] и PO[i];
Но вот в Form3 ничего нет и все равно 0.
Ответить с цитированием
  #5  
Старый 10.11.2013, 19:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Объявляю вас победителем в номинации "Лучший говнокод-китайкод месяца"

__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 19:10.
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
PhoeniX (10.11.2013)
  #6  
Старый 10.11.2013, 19:17
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо, приятно.
Но если вы поподробнее расскажите, что же такого страшного в моей писанине, то в будущем постараюсь такого не писать.
Ответить с цитированием
  #7  
Старый 10.11.2013, 19:32
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну там процентов на 90 можно код сократить, ибо код повторяется.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 10.11.2013, 19:45
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
ибо код повторяется.

Тогда вопрос. Есть вот такой блок:
Код:
  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  
Старый 10.11.2013, 20:42
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
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  
Старый 10.11.2013, 21:19
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Код:
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]);

Спасибо, применю. А по поводу ошибки, ради которой и создавалась тема нет идей?

Цитата:
Сообщение от Veider
Вообще все проблемы этого кода растут из того факта, что автор не умеет в ООП.
Да, учусь только.

Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 22:44.
Ответить с цитированием
  #11  
Старый 10.11.2013, 21:37
Аватар для Veider
Veider Veider вне форума
Прохожий
 
Регистрация: 02.11.2012
Сообщения: 2
Репутация: 10
По умолчанию

А можно запилить класс-наследник TEdit и добавить ему нужных методов/полей. А потом с помощью известного хака подменить им стандартный TEdit, для простоты использования.

Вообще все проблемы этого кода растут из того факта, что автор не умеет в ООП.

Нет, вы учитесь "просто что-то кодить".
А ООП требует отдельного понимания, которое порой никак не идёт. Зато когда наконец доходит - сразу глубоко проникаешься этими идеями.

По сабжу:
А переменная Form3 где объявлена?
Вот это что ли?
Код:
Const
  Form3: TForm3 = nil;
Я честно уже давненько не кодил, но вот на такой изврат раньше не натыкался, и что-то мне подсказывает, что виновато оно.

Последний раз редактировалось M.A.D.M.A.N., 10.11.2013 в 22:45.
Ответить с цитированием
  #12  
Старый 10.11.2013, 23:09
Vavilon11 Vavilon11 вне форума
Прохожий
 
Регистрация: 10.11.2013
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Этот изврат работает. У меня передаётся значение из TV1 в MO так же и все хорошо. А вот в третий модуль - никак.
А по ооп почитаю, постараюсь разобраться.
Ответить с цитированием
  #13  
Старый 10.11.2013, 23:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Многие извраты работают, но этим не стоит гордиться.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter