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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 03.09.2012, 22:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Любые статьи по оптимизации, принципам ООП, и так далее. Моим простым приёмом мы заменяем 10 обработчиков на один... И это только то, что бросилось в глаза...

А мне еще бросилось в глаза, что нет:
1. Приверки, что ',' уже есть.
2. Тоже самое для - и +
3. Ну и обработчики цифирь... о чем уже сказали
и это просто при очень беглом просмотре.

Самое печальное, что о таких вещах (не конкретно об отсутсвующих проверках, а о правильном проектировании алгоритмов /не совсем так, но лучших слов не могу навскидку подобрать/) в книжках не пишут. Это потом народ на собственных ошибках учится.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
UnrealFire (08.09.2012)
  #17  
Старый 03.09.2012, 22:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от UnrealFire
уж, извините! моя вторая программа на delphi! потихоньку всё выучу, но пока вам придётся потерпеть ещё одного новичка.
Может тогда посмотреть для начала чужие реализации калькулятора?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 04.09.2012, 11:13
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

новичку в чужом коде разобраться сложно. смотрел инженерный, ничего не понял
Ответить с цитированием
  #19  
Старый 04.09.2012, 13:00
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

с сдвигом разобрался, на висте не было нужного шрифта Myriad Pro Light.
Поменял на майкрософтовский. Установлю Myriad Pro Light скажу как работает.
Ответить с цитированием
  #20  
Старый 04.09.2012, 15:35
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
Вопрос

Цитата:
Сообщение от DJ PhoeniX
ужс, бррр... за такой код в приличном обществе линейкой по рукам бьют...
Числа стоило бы записать вот так:
Код:
procedure TForm1.SpeedButtonNumberClick(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;
вот так?
Код:
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton11Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton12Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;
Ответить с цитированием
  #21  
Старый 04.09.2012, 17:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от UnrealFire
вот так?
Код:
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;

procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
 edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;
...
Конечно же нет.

Делаешь один такой обработчик:
Код:
procedure TForm1.SpeedButtonNumberClick(Sender: TObject);
begin
  edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
end;
И потом в инспекторе объектов на вкладке Events привязываешь его ко всем цифровым кнопкам. Т.е. вместо десятка похожих обработчиков (каждый на свою кнопку), у тебя будет один обработчик который будет работать для любой цифровой кнопки.
Ответить с цитированием
  #22  
Старый 05.09.2012, 08:50
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

сори, даже не знал что так можно. спасибо. Буду дальше совершенствовать код.
Ответить с цитированием
  #23  
Старый 05.09.2012, 09:01
Аватар для 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
Репутация: выкл
По умолчанию

Копец вы извращениями занимаетесь, в твоем случае можно на все кнопки навесить один обработчик, а то сплошное дублирование кода.

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


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #24  
Старый 08.09.2012, 10:07
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вопросик созрел. Имеется процедура, работает исключително с общими переменными. Нужно ее вызвать, но без ввода параметров не вызывается.
Как это решить?

Пробовал через функции, но он вывел кучу ошибок, вроде я неправильно вообще обьявил. Обьявлял как в паскале. Напишите как это обьявлять.
Ответить с цитированием
  #25  
Старый 08.09.2012, 10:16
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А мне еще бросилось в глаза, что нет:
1. Приверки, что ',' уже есть.
2. Тоже самое для - и +
3. Ну и обработчики цифирь... о чем уже сказали
и это просто при очень беглом просмотре.

Самое печальное, что о таких вещах (не конкретно об отсутсвующих проверках, а о правильном проектировании алгоритмов /не совсем так, но лучших слов не могу навскидку подобрать/) в книжках не пишут. Это потом народ на собственных ошибках учится.
весь список выполнен.
Ответить с цитированием
  #26  
Старый 08.09.2012, 14:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от UnrealFire
Имеется процедура, работает исключително с общими переменными.
Что такое "общие переменные"? Глобальные чтоли? А если общие, то общие с чем?

Цитата:
Сообщение от UnrealFire
Нужно ее вызвать, но без ввода параметров не вызывается.
Как это решить?
Нельзя вызвать процедуру без ввода её параметров. Если какие-то значения параметров используются часто, то такие параметры можно объявить как "параметры со значениями по-умолчанию". Пример:
Код:
procedure Proc(XX: Integer; YY: Integer = 15);
begin
//
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Эту процедуру можно вызвать так:
  Proc(10, 20);

  // А можно вызвать так:
  Proc(10);

  // При этом фактически она будет вызвана так:
  Proc(10, 15);
  // Т.е. второй параметр всё-равно будет введён в процедуру, но скрытно, и явно его вводить не нужно
end;

Цитата:
Сообщение от UnrealFire
Пробовал через функции, но он вывел кучу ошибок, вроде я неправильно вообще обьявил.
Покажи как ты переоформил процедуру в функцию, что стало выводить кучу ошибок?

Цитата:
Сообщение от UnrealFire
Обьявлял как в паскале. Напишите как это обьявлять.
Если объявлять как в паскале, то в Delphi это должно работать.
Ответить с цитированием
  #27  
Старый 08.09.2012, 17:07
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

1 вопрос. сделал так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    Logo: TImage;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    SpeedButton10: TSpeedButton;
    SpeedButton11: TSpeedButton;
    SpeedButton12: TSpeedButton;
    SpeedButton13: TSpeedButton;
    SpeedButton14: TSpeedButton;
    SpeedButton15: TSpeedButton;
    SpeedButton17: TSpeedButton;
    SpeedButton18: TSpeedButton;
    SpeedButton19: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Edit2: TEdit;
    SpeedButton16: TSpeedButton;
    SpeedButton20: TSpeedButton;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    SpeedButton21: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton22: TSpeedButton;
    SpeedButton23: TSpeedButton;
    SpeedButton24: TSpeedButton;
    SpeedButton25: TSpeedButton;
    background: TImage;
    SpeedButton26: TSpeedButton;
    procedure SpeedButtonDeystvieClick(Sender: TObject);
    procedure SpeedButton17Click(Sender: TObject);
    procedure SpeedButton20Click(Sender: TObject);
    procedure SpeedButton21Click(Sender: TObject);
    procedure SpeedButton22Click(Sender: TObject);
    procedure SpeedButton23Click(Sender: TObject);
    procedure SpeedButton24Click(Sender: TObject);
    procedure SpeedButton25Click(Sender: TObject);
    procedure SpeedButton26Click(Sender: TObject);
    procedure SpeedButtonNumberClick(Sender: TObject);
    procedure SpeedButtonRavnoClick(Sender: TObject);
    procedure SpeedButtonRazdelitelClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  input,input2,output,prozent:real;
  znachenie:string;
  deystvie:boolean=false;
  razdelitel:boolean=false;
  ravno:boolean=false;

implementation

{$R *.dfm}

function ShellExecute (hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): LongWord; stdcall; external 'Shell32.dll' name 'ShellExecuteA';

procedure TForm1.SpeedButtonNumberClick(Sender: TObject);
begin
  if edit2.Text='0' then edit2.Text:='';
  if deystvie=true then
  begin
    edit2.Text:='';
    deystvie:=false;
  end;
  if ravno=true then
  begin
    edit2.Text:='';
    ravno:=false;
  end;
  edit2.Text:=edit2.Text + (Sender as TSpeedButton).Caption;
  {Если стоит ноль, то он удаляется;
  Если действие нажато то удаляется всё поле и действие=фалс;
  Edit2.Text:=Edit2.Text+текст на клавише;
  }
end;

procedure TForm1.SpeedButtonDeystvieClick(Sender: TObject);
begin
  if deystvie=false then
  begin
    input:=strtofloat(edit2.Text);
    znachenie:=(Sender as TSpeedButton).Caption;
    deystvie:=true;
  end
  else
  begin
    input:=strtofloat(edit2.Text);
    znachenie:=(Sender as TSpeedButton).Caption;
  end;
  razdelitel:=false;
  {Если действие=фалс то
  значение=текст на клавише;
  действие=тру;
  Иначе
  инпут=вещ. от edit2.Text;
  значение = текст на клавише;
  }
end;

procedure TForm1.SpeedButtonRavnoClick(Sender: TObject);
begin
  input2:=strtofloat(edit2.Text);

  if znachenie='+' then output:=input+input2;
  if znachenie='-' then output:=input-input2;
  if znachenie='*' then output:=input*input2;
  if znachenie='/' then output:=input/input2;
  if znachenie='%' then output:=input*input2/100;
  if znachenie='^' then
  begin
    input:=output;
    if input2=0 then
    begin
      edit2.Text:='0';
    end;

    while input2>1 do
    begin
      output:=output*input;
      input2:=input2-1;
    end;
    {Возведение в степень}
  end;

  edit2.Text:=floattostr(output);
  ravno:=true;
  {input2:=вещ. от edit2.Text;
  в зависимости от значения присваивается output;
  output выводится в edit2.Text;
  }
end;

procedure TForm1.SpeedButtonRazdelitelClick(Sender: TObject);
begin
  if razdelitel=false then
  begin
    edit2.Text:=edit2.Text+(Sender as TSpeedButton).Caption;
    razdelitel:=true;
  end;
  {Проверка на наличие запятой в цифре}
end;

procedure TForm1.SpeedButton17Click(Sender: TObject);
begin
  input:=strtofloat(edit2.text);
  output:=sqrt(input);
  edit2.Text:=floattostr(output);
  {извлечение квадратного корня}
end;

procedure TForm1.SpeedButton20Click(Sender: TObject);
begin
  Edit2.Text:='0';
  Edit4.Text:='0';
  Edit5.Text:='0';
  Edit6.Text:='0';
  Edit7.Text:='0';
  Edit8.Text:='0';
  {CE}
end;

procedure TForm1.SpeedButton21Click(Sender: TObject);

var
a,b,c,x1,x2,d,p:real;

begin

  a:=strtofloat(edit4.Text);
  b:=strtofloat(edit6.Text);
  c:=strtofloat(edit5.Text);

  if a=0 then
  begin
    ShowMessage('a=0. Неверноное значение a');
  end;

  d:=(b*b)-(4*a*c);

  if d<0 then
  begin
    ShowMessage('Уравнение не имеет корней');
  end;

  p:=sqrt(d);

  x1:=(-b+p)/(2*a);
  x2:=(-b-p)/(2*a);

  edit8.Text:='X1='+floattostr(x1);
  edit7.Text:='X2='+floattostr(x2);
  {Решение кв.уранения}
end;

procedure TForm1.SpeedButton26Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'Calc by UnrealFire.chm','','', sw_show);
end;

{Ниже синус, косинус, тангенс и радианы из угла}
procedure TForm1.SpeedButton22Click(Sender: TObject);

var
g,r,s:real;
s2:string;

begin

  g:=strtofloat(edit2.Text);

  if (g>360) or (g=360) then
  begin
    g:=g-360;
   end;

  r:=PI*g/180;
  s:=sin(r);
  s2:=floattostr(s);

  if (g=0) or (g=180) then
  begin
    s2:='0';
   end;

  if (g=90) or (g=270) then
  begin
    s2:='1';
  end;

  if (g=30) or (g=210) then
  begin
    s2:='1/2';
  end;

  if (g=45) or (g=225) then
  begin
    s2:='(Квадратный корень от 2)/2';
  end;

  if (g=60) or (g=240) then
  begin
    s2:='(Квадратный корень от 3)/2';
  end;

  edit2.Text:=s2;

end;

procedure TForm1.SpeedButton23Click(Sender: TObject);

var
g,r,c:real;
c2:string;

begin

  g:=strtofloat(edit2.Text);

  if (g>360) or (g=360) then
  begin
    g:=g-360;
   end;

  r:=PI*g/180;
  c:=cos(r);
  c2:=floattostr(c);

  if (g=0) or (g=180) then
  begin
    c2:='1';
   end;

  if (g=90) or (g=270) then
  begin
    c2:='0';
  end;

  if (g=30) or (g=210) then
  begin
    c2:='(Квадратный корень от 3)/2';
  end;

  if (g=45) or (g=225) then
  begin
    c2:='(Квадратный корень от 2)/2';
  end;

  if (g=60) or (g=240) then
  begin
    c2:='1/2';
  end;

  edit2.Text:=c2;

end;

procedure TForm1.SpeedButton24Click(Sender: TObject);

var
g,r,t,c,s:real;
t2:string;

begin

  g:=strtofloat(edit2.Text);

  if (g>360) or (g=360) then
  begin
    g:=g-360;
   end;

  r:=PI*g/180;
  c:=Cos(r);  
  s:=Sin(r);
  t:=s/c;
  t2:=floattostr(t);

  if (g=0) or (g=180) then
  begin
    t2:='0';
   end;

  if (g=90) or (g=270) then
  begin
    t2:='Не определён';
  end;

  if (g=30) or (g=210) then
  begin
    t2:='(Квадратный корень от 3)/3';
  end;

  if (g=45) or (g=225) then
  begin
    t2:='1';
  end;

  if (g=60) or (g=240) then
  begin
    t2:='Квадратный корень от 3';
  end;

  edit2.Text:=t2;

end;

procedure TForm1.SpeedButton25Click(Sender: TObject);

var
g,r:real;

begin

  g:=strtofloat(edit2.Text);
  r:=g*PI/180;

  edit2.Text:=floattostr(r);

end;

end.

при нажатии возведении в степень выводится 0. если например сделать вначале любое другое действие, скажем прибавить то всё работает. Где у меня ошибка?

2.И все таки подскажите как в этом случае оформить функцию возведения в степень.

3. При возведении в степень 2 числа 625 выводится floating point overflow.
что это?
Ответить с цитированием
  #28  
Старый 08.09.2012, 17:24
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Код:
 if znachenie='^' then
  begin
    input:=output;
1. Если у тебя раньше не было действий, то соответственно output (результат предидущих действий?) равен 0. Вот и входное значение input у тебя тоже становится 0.
2. Лучше оформить так:
Код:
output=exp(input2*ln(input));
Так можно будет делать возведение и в дробные степеня.
3. Странно.
Ответить с цитированием
  #29  
Старый 08.09.2012, 19:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
2. Лучше оформить так:
Код:
1
output=exp(input2*ln(input));
Ну зачем же... Ведь есть Power.

А про процедуру без ввода параметров не понял. Если процедура не использует эти параметры, то зачем они нужны? А если использует, то как она будет работать без них? Это как сложить два числа, не зная, чему они равны.
Конечно, вызвать процедуру без параметров можно, только после этого (после возврата из процедуры) программа поведет себя случайным образом (скорее всего будет не выровнен стек, как следствие будет AV или что-то в этом роде). Если параметры не нужны - значит их надо убрать из определения процедуры.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 08.09.2012 в 19:07.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
UnrealFire (08.09.2012)
  #30  
Старый 08.09.2012, 19:35
Аватар для UnrealFire
UnrealFire UnrealFire вне форума
Новичок
 
Регистрация: 28.08.2012
Сообщения: 66
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

а как пауер работает, не понял по английски.
сори, перепутал я
нужно так
Код:
output:=input;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter