Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2012, 14:01   #1
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
Сообщение Работа со списками (Delphi)

Доброго времени суток. Ниже представлен код программы, которая при вводе цифр сортирует их в порядке возрастания. Поставил запрет на ввод букв, блоком try except, мне нужно сделать так, чтобы при вводе букв в ListBox они не выводились в ComboBox. Написал так, что при первой встрече букв появляется окно и программа прерывается, остальные же буквы выводит, я новичок в программировании, поэтому помогите разобраться. Заранее спасибо.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    ListBox1: TListBox;
    ComboBox1: TComboBox;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    XPManifest1: TXPManifest;
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Calc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormActivate(Sender: TObject);
begin
  ComboBox1.SetFocus;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Form1.Caption:=IntToStr(ListBox1.ItemIndex);
  ListBox1.Items.Insert(ListBox1.ItemIndex, ListBox1.Items[ListBox1.ItemIndex]);
end;

procedure TForm1.Calc;
var
  i:integer;//i - строка ComboBoxSt.Items[i]
  j:integer;//j - индекс всех остальных строк, располагающихся выше(по индексу) от исходной(i)
  NowNumber:Extended;//Текущее число, преобразованное к вещ. типу
  NextNumber:Extended;//Число (находящееся в строке с индексом j), преобразованное к вещ. типу
  MinNum:word;//Индекс максимального эл-та
  Min:Extended;
  z: string;//Переменная для замены двух строк местами
begin

  for i:=0 to (ListBox1.Items.Count-1) do           // Просмотр строк
  begin
    try
    NowNumber:= StrToFloat(ListBox1.Items[i]);
    Min:= StrToFloat(ListBox1.Items[i]);
    MinNum:= i;
      except
        on EConvertError do
        begin
        ListBox1.Items.Delete(i);
        ShowMessage('Ошибка! Разрешен только ввод цифр.');
        exit;
        end;
    end;

    //Ищем максимальный эл-т из оставшихся
    for j := i+1 to (ListBox1.Items.Count-1) do
    begin
      //try
      NextNumber:=StrToFloat(ListBox1.Items[j]);
      if Min >= NextNumber then
      begin
        Min:= NextNumber;
        MinNum:= j;
      end;
    end;

    //Меняем максимальный эл-т с i-тым
    z:=ListBox1.Items[i];
    ListBox1.Items[i]:=ListBox1.Items[MinNum];
    ListBox1.Items[MinNum]:=z;

  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var i,k:Word;
    s,tmps:string;
begin
  begin
    ListBox1.Clear;
    s:=ComboBox1.Text;
    i:=0;
    while i<=Length(s) do
    begin
      Inc(i);
      if s[i]<>#32 then
      begin
        k:=i+1;
        while (s[k]<>#32) and (k<=Length(s)) do
          Inc(k);
        tmps:=Copy(s,i,k-i);//Возвращает подстроку строки S, начиная с номера символа, равного I и содержащую до k-i символов.
        ListBox1.Items.Add(tmps);
        i:=k;
      end;
    end;
    ComboBox1.Items.Add(ComboBox1.Text);
    Calc;
  end;

end;

end.
Mmarc вне форума Ответить с цитированием
Старый 25.01.2012, 14:28   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Замените
Код:
 for i:=0 to (ListBox1.Items.Count-1) do           // Просмотр строк
  begin
    try
    NowNumber:= StrToFloat(ListBox1.Items[i]);
    Min:= StrToFloat(ListBox1.Items[i]);
    MinNum:= i;
      except
        on EConvertError do
        begin
        ListBox1.Items.Delete(i);
        ShowMessage('Ошибка! Разрешен только ввод цифр.');
        exit;
        end;
    end;
на
Код:
	
  i:=0;
  while i < ListBox1.Items.Count do
  begin
  try
      NowNumber:= StrToFloat(ListBox1.Items[i]);
      Min:= StrToFloat(ListBox1.Items[i]);
      MinNum:= i;
      except
        on EConvertError do
        begin
          ListBox1.Items.Delete(i);
          ShowMessage('Ошибка! Разрешен только ввод цифр.'); //убрать, если вывод сообщения не нужен         
          continue;
        end; //-отредактировал
      end;
      inc(i);
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 25.01.2012 в 14:56.
Luuzuk вне форума Ответить с цитированием
Старый 25.01.2012, 14:45   #3
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
По умолчанию

Инкремент не там мне кажется, потому что ошибка выводится, ожидался end; найден инкремент.
Mmarc вне форума Ответить с цитированием
Старый 25.01.2012, 14:48   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Перед инкрементом еще один end; поставьте, я пропустил его
-----------
сейчас отредактирую
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 25.01.2012, 14:50   #5
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
По умолчанию

теперь в конце процедуры ругается "ожидалось end." На мой взгляд в конце процедуры end; лишний

Последний раз редактировалось Mmarc; 25.01.2012 в 14:53.
Mmarc вне форума Ответить с цитированием
Старый 25.01.2012, 14:56   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Последний "end;" в моём коде был лишний. Переклинило, начал как отдельный метод код писать
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 25.01.2012, 15:01   #7
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
По умолчанию

К сожалению не помогло, сталкиваюсь все с той же ошибкой, к ней добавилась List Index out of bounds
Mmarc вне форума Ответить с цитированием
Старый 25.01.2012, 15:21   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
    r: real;
    i: integer;
    changed: boolean;
begin
  s:=trim(ComboBox1.Text);
  try
    r:=StrToFloat(s);
  except
    ShowMessage('Введено не число!');
    exit;
  end;

  ComboBox1.Items.Add(s);

  changed:=true;
  while changed do
  begin
    changed:=false;
    for i:=0 to ComboBox1.Items.Count-2 do
    if StrToFloat(ComboBox1.Items[i]) < StrToFloat(ComboBox1.Items[i+1]) then
    begin
      changed:=true;
      s:=ComboBox1.Items[i];
      ComboBox1.Items[i]:=ComboBox1.Items[i+1];
      ComboBox1.Items[i+1]:=s;
    end;
  end;
end;
А функцию Calc выкинуть как кривую по определению
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 25.01.2012 в 15:52.
Luuzuk вне форума Ответить с цитированием
Старый 25.01.2012, 15:45   #9
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
По умолчанию

Совсем не то что я хотел.

Последний раз редактировалось Mmarc; 25.01.2012 в 17:17.
Mmarc вне форума Ответить с цитированием
Старый 26.01.2012, 07:38   #10
Mmarc
 
Регистрация: 25.01.2012
Сообщений: 9
По умолчанию

Немного изменил функцию calc, все работает
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    ListBox1: TListBox;
    ComboBox1: TComboBox;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    XPManifest1: TXPManifest;
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Calc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormActivate(Sender: TObject);
begin
  ComboBox1.SetFocus;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Form1.Caption:=IntToStr(ListBox1.ItemIndex);
  ListBox1.Items.Insert(ListBox1.ItemIndex, ListBox1.Items[ListBox1.ItemIndex]);
end;

procedure TForm1.Calc;
var
  i:integer;//i - строка ComboBoxSt.Items[i]
  j:integer;//j - индекс всех остальных строк, располагающихся выше(по индексу) от исходной(i)
  NowNumber:Extended;//Текущее число, преобразованное к вещ. типу
  NextNumber:Extended;//Число (находящееся в строке с индексом j), преобразованное к вещ. типу
  MinNum:word;//Индекс максимального эл-та
  Min:Extended;
  z: string;//Переменная для замены двух строк местами
begin
  i:=-1; // Просмотр строк
  while i<(ListBox1.Items.Count-1) do
  begin
    i:=i+1;
    try
    NowNumber:= StrToFloat(ListBox1.Items[i]);
      except
        on EConvertError do
        begin
        ListBox1.Items.Delete(i);
        ShowMessage('Ошибка! Разрешен только ввод цифр.');
        i:=i-1;
        end;
    end;
  end;

  for i:=0 to (ListBox1.Items.Count-1) do           // Просмотр строк
  begin
    NowNumber:= StrToFloat(ListBox1.Items[i]);
    Min:= StrToFloat(ListBox1.Items[i]);
    MinNum:= i;

    //Ищем максимальный эл-т из оставшихся
    for j := i+1 to (ListBox1.Items.Count-1) do
    begin
      //try
      NextNumber:=StrToFloat(ListBox1.Items[j]);
      if Min >= NextNumber then
      begin
        Min:= NextNumber;
        MinNum:= j;
      end;
    end;

    //Меняем максимальный эл-т с i-тым
    z:=ListBox1.Items[i];
    ListBox1.Items[i]:=ListBox1.Items[MinNum];
    ListBox1.Items[MinNum]:=z;

  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var i,k:Word;
    s,tmps:string;
begin
  begin
    ListBox1.Clear;
    s:=ComboBox1.Text;
    i:=0;
    while i<=Length(s) do
    begin
      Inc(i);
      if s[i]<>#32 then
      begin
        k:=i+1;
        while (s[k]<>#32) and (k<=Length(s)) do
          Inc(k);
        tmps:=Copy(s,i,k-i);//Возвращает подстроку строки S, начиная с номера символа, равного I и содержащую до k-i символов.
        ListBox1.Items.Add(tmps);
        i:=k;
      end;
    end;
    ComboBox1.Items.Add(ComboBox1.Text);
    Calc;
  end;

end;

end.
Mmarc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со списками Kumigy Помощь студентам 1 23.12.2010 16:24
работа со списками listbox(delphi) KaZaaM Помощь студентам 6 19.11.2009 22:42