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


Автор: pdiman58 27.4.2010, 11:03
Задание таково:

"Необходимо произвести обработку 15 вешщественных чисел: найти среднее арифметическое отрицательных чисел и подсчитать количество чисел, входящих в диапазон от 0...5"

Проблема такая я не знаю как организовать ввод чисел..

Пробовал делать так..
на первой форме разместил кнопки 
1) Массив чисел;
2) Среднее арифметическое;
3) кол-во чисел в диапазоне;

при нажатии кнопке "Массив чисел"..
происходило переключении на вторую форму.. в которой было окно TListBox, в котором были записаны числа..
и рядом три кнопки добавить число, редактировать, и удалить число..

и вот никак не могу понять как мне работать с этим TListBox.. как забирать оттуда числа.. добавлять и удалять..

если кто сможет помогите\объясните..

Автор: ИванМ 1.5.2010, 00:15
Прикрепи исходник, подредактирую.

Автор: pdiman58 1.5.2010, 17:03
Цитата(ИванМ @ 1.5.2010,  00:15)
Прикрепи исходник, подредактирую.

ок..

В моем файле у меня не получилось связать две формы.. 
пробую на кнопку повесить Form2.Show..
она выдает ошибку..

вроде бы сделал добавление редактирование и удаление записей в ListBox..

Автор: ИванМ 3.5.2010, 19:59
pdiman58, нет, к сожалению помочь не смогу, так как пользуюсь Delphi 7, а у вас версия выше.
Если только на уровне исходного кода помогу. Но у вас никакого кода нет в проекте, поэтому подсказать нечего.

Автор: pdiman58 3.5.2010, 21:03
Цитата(ИванМ @ 3.5.2010,  19:59)
pdiman58, нет, к сожалению помочь не смогу, так как пользуюсь Delphi 7, а у вас версия выше.
Если только на уровне исходного кода помогу. Но у вас никакого кода нет в проекте, поэтому подсказать нечего.


делаю в Lazarus..

подскажи пожалуйста как сделать переключение между формами с первой на вторую.. поэтому то я и не могу дальше понять что да как..

в интернет читал про ListBox, что нашел.. 
то приблизительно к кнопкам во второй форме и добавил..
а остальное я никак не могу сделать для исходника.. 
т.к. я нигде нашел и не понимаю сам, как мне брать числа из этого ListBox чтобы ими оперировать можно было..

TForm1.. 
здесь действительно ничего нет.. 
buttonclick1 отвечает за переключение на вторую форму (вот и вопрос как это сделать.. Form2.Show не срабатывает, говорит ошибка, в интернете где то видел что нужно добавить какойто компонент в раздел uses, но какой не нашел..).. 
buttonclick2 отвечает за подсчет среднеарифметического значения и количества чисел диапазона 0...5..
Код

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

end;

initialization
  {$I unit1.lrs}

end.
                       



TForm2
Button1click отвечает за добавление в ListBox чисел (добавление происходит через окно Edit1.Text)..
Button2click отвечает за редактирование числа в ListBox..
Button3Click отвечает за удаление числа из ListBox..
Код

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form2: TForm2; 

implementation

{ TForm2 }

procedure TForm2.ListBox1Click(Sender: TObject);
begin
   Edit1.Text:= ListBox1.Items[ListBox1.ItemIndex];
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Add (Edit1.Text);
  ListBox1.Sorted:= true;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ListBox1.Items[ListBox1.ItemIndex]:= Edit1.Text;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  ListBox1.Items.Delete(1);
end;

initialization
  {$I unit2.lrs}

end.              

Автор: ИванМ 3.5.2010, 21:12
В 7м Delphi для этого нужно подключить соответствующий Unit второй формы в первом юните. Делается либо ручным способом (uses Unit2), либо автоматическим: File->Use unit...
Чтобы вызвать вторую форму просто надо вызвать метод Show или ShowModal.

Автор: pdiman58 3.5.2010, 21:31
Цитата(ИванМ @ 3.5.2010,  21:12)
В 7м Delphi для этого нужно подключить соответствующий Unit второй формы в первом юните. Делается либо ручным способом (uses Unit2), либо автоматическим: File->Use unit...
Чтобы вызвать вторую форму просто надо вызвать метод Show или ShowModal.

спасибо..
вроде на второй форме все заработало..
если можешь объясни пожалуйста еще вкратце как оперировать числами из ListBox..

Автор: ИванМ 3.5.2010, 21:46
pdiman58, чтобы обратиться к нужной строке ListBox используй свойство Items. Чтобы преобразовать строку в вещ. число, используй функцию StrToFloat. Чтобы преобразовать вещ. число в строку, используй FloatToStr.

Автор: pdiman58 9.5.2010, 21:30


[TForm1]
Код

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
   var a,i:integer;
         c: real;
begin
  a:=0;
  a:=Form2.ListBox1.Count;
   for i:=0 to a do
    begin
     if (strtoint(Form2.ListBox1.Items[i]) > 0) then
     c:=c+strtoint(Form2.ListBox1.Items[i]);
     end;
   Edit1.Text:=FloattoStr(c);
end;

initialization
  {$I unit1.lrs}

end.                           




[TForm2]
Код

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: char);
    procedure ListBox1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form2: TForm2; 

implementation

{ TForm2 }

procedure TForm2.ListBox1Click(Sender: TObject);
begin
   Edit1.Text:= ListBox1.Items[ListBox1.ItemIndex];
end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: char);
begin
  case key of
  'A'..'Z':key:=#0;
  'a'..'z':key:=#0;
  'А'..'Я':key:=#0;
  'а'..'я':key:=#0;
  '!', '@' , '.' , '/', '\', '$', '^', '&', '*', '(', ')':key:=#0;
end;
end;


procedure TForm2.Button1Click(Sender: TObject);
 var d, p, i: integer;
 begin
  d:=0;
  p:=0;
  for i:=1 to length(Edit1.Text) do
    begin
     if Edit1.Text[i]='-' then d:=d+1;
    end;
  for i:=1 to length(Edit1.Text) do
    begin
     if Edit1.Text[i]=',' then p:=p+1;
    end;
  if d>1 then Edit1.Text:='Неверно' else
   if p>1 then Edit1.Text:='Неверно' else
   begin
     ListBox1.Items.Add (Edit1.Text);
     ListBox1.Sorted:= true;
   end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ListBox1.Items[ListBox1.ItemIndex]:= Edit1.Text;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  ListBox1.Items.Delete(1);
end;

initialization
  {$I unit2.lrs}

end.                                      




Вот мои коды.. на второй форме все нормально..
проблемы с первой формой.. с первой кнопкой..
почему то выкидывает ошибку..

Автор: ИванМ 10.5.2010, 00:06
правильно не
Код

a:=Form2.ListBox1.Count;

а
Код

a:=Form2.ListBox1.Count-1;

Автор: pdiman58 10.5.2010, 00:47
спасибо.. среднеарифметическое сделал..

а как можно записать насчет чисел диапазона 0..5..??


я попробовал вот так.. но в ответе всегда получаете 'ноль'...


Код

procedure TForm1.Button2Click(Sender: TObject);
   var a,i,g:integer;
         c,h,k: real;
begin
  a:=0;
  c:=0;
  k:=0;
  g:=0;
  a:=Form2.ListBox1.Count-1;
   for i:=0 to a do
     begin
      if (strtoint(Form2.ListBox1.Items[i]) < 0) then
       begin
        k:=k+1;
        c:=c+strtoint(Form2.ListBox1.Items[i]);
       end;
     end;
     h:=c/k;
     Edit1.Text:=FloattoStr(h);
   for i:=0 to a do if ((strtoint(Form2.ListBox1.Items[i]) > 0) and (strtoint(Form2.ListBox1.Items[i]) < 5)) then g:=g+1;
     Edit2.Text:=Inttostr(g);
     
end; 

Автор: ИванМ 10.5.2010, 18:21
pdiman58, почему вы используете strtoint, если у вас в списке вещественные числа? Нужно использовать strtofloat.

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