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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2017, 12:46   #1
sativan
 
Регистрация: 13.03.2017
Сообщений: 6
По умолчанию определить последнюю строку в list box

уважаемые форумчане помогите разобраться с кодом:

смысл задания в том,чтобы найти первую пару положительных чисел и вывести их в другой лист бокс, пары находит все нормально,но ошибка вылазит если в списке вообще нет пар, то есть,как я понял при переходе на последнюю строку+1,
проверка
Код:
If ListBox1.ItemIndex = ListBox1.Count -1
  then
  break;
не срабатывает.

подскажите как правильно написать. Спасибо.

Код:
procedure TForm1.ToolButton9Click(Sender: TObject);
var
i,k:integer;
    a,b:real;    fl:boolean;
begin
k:=0; fl:=false;a:=0;b:=0;
for i:=0 to ListBox1.Count-1  do


begin
  If ListBox1.ItemIndex = ListBox1.Count -1
  then
  break;

if (StrTofloat(ListBox1.Items[i])>0) and (StrTofloat(ListBox1.Items[i+1]) > 0 ) then
begin
 fl:=true;

    a:=strtofloat(ListBox1.Items[i]);
    b:=strtofloat(ListBox1.Items[i+1]);
    end;

     if fl=true then
     break;

   end;

        ListBox2.Items.Add(floattostr(a));
        ListBox2.Items.Add(floattostr(b));

   if fl=false then

     ListBox2.Items.Add('Искомой пары нет') ;
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 28.11.2017 в 13:27.
sativan вне форума Ответить с цитированием
Старый 28.11.2017, 13:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от sativan Посмотреть сообщение
If ListBox1.ItemIndex = ListBox1.Count -1
then
break;
этот мусор выкинуть.



Цитата:
Сообщение от sativan Посмотреть сообщение
Код:
for i:=0 to ListBox1.Count-1  do
исправить на
Код:
for i:=0 to ListBox1.Count-2  do
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2017, 13:46   #3
sativan
 
Регистрация: 13.03.2017
Сообщений: 6
По умолчанию

исправил,все тоже самое
sativan вне форума Ответить с цитированием
Старый 28.11.2017, 14:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от sativan Посмотреть сообщение
исправил,все тоже самое
покажите ещё раз ваш код - процедуру после исправления


Цитата:
Сообщение от sativan Посмотреть сообщение
смысл задания в том,чтобы найти первую пару положительных чисел
и по заданию вопрос. А разве задание подразумевает, что пара положительных чисел является соседями? Откуда это следует?

Последний раз редактировалось Serge_Bliznykov; 28.11.2017 в 14:05.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2017, 14:12   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  fl:boolean;
begin
  fl:=false;
  // Очистка второго листа
  ListBox2.Items.Clear;

  for i:=0 to ListBox1.Count-2  do
  begin
    // Защита от пустых строк в первом листе
    if (Trim(ListBox1.Items[i]) <> '') and (Trim(ListBox1.Items[i + 1]) <> '') then
    begin
      // Проверка соседних элементов
      fl := (StrTofloat(ListBox1.Items[i]) > 0) and (StrTofloat(ListBox1.Items[i + 1]) > 0);
      if fl then
      begin
        ListBox2.Items.Add(ListBox1.Items[i]);
        ListBox2.Items.Add(ListBox1.Items[i + 1]);
        break;
      end;
    end;
  end;

  if not fl then
    ListBox2.Items.Add('Искомой пары нет') ;
end;
Или вообще сократить всё:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  // Очистка второго листа
  ListBox2.Items.Clear;
  ListBox2.Items.Add('Искомой пары нет') ;

  for i:=0 to ListBox1.Count-2  do
  begin
    // Защита от пустых строк в первом листе
    if (Trim(ListBox1.Items[i]) <> '') and 
       (Trim(ListBox1.Items[i + 1]) <> '') and
       (StrTofloat(ListBox1.Items[i]) > 0) and
       (StrTofloat(ListBox1.Items[i + 1]) > 0) 
    then
    begin
        ListBox2.Items.Clear;
        ListBox2.Items.Add(ListBox1.Items[i]);
        ListBox2.Items.Add(ListBox1.Items[i + 1]);
        break;
    end;
  end;
end;
А вот ещё вариант без преобразований во флоат:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  // Очистка второго листа
  ListBox2.Items.Clear;
  ListBox2.Items.Add('Искомой пары нет') ;

  for i:=0 to ListBox1.Count-2  do
  begin
    // Защита от пустых строк в первом листе
    if (Trim(ListBox1.Items[i]) <> '') and
       (Trim(ListBox1.Items[i + 1]) <> '') and
       (ListBox1.Items[i][1] <> '-') and
       (ListBox1.Items[i + 1][1] <> '-')
    then
    begin
        ListBox2.Items.Clear;
        ListBox2.Items.Add(ListBox1.Items[i]);
        ListBox2.Items.Add(ListBox1.Items[i + 1]);
        break;
    end;
  end;
end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 28.11.2017 в 14:19.
Sciv вне форума Ответить с цитированием
Старый 28.11.2017, 14:34   #6
sativan
 
Регистрация: 13.03.2017
Сообщений: 6
По умолчанию

исправил,все тоже самое
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
покажите ещё раз ваш код - процедуру после исправления

огромное вам спасибо,сейчас еще раз попробовал,все работает,тестил с различными вариантами.
в первый раз пробуя разные варианты,где то видимо ошибся с исправлением
единственное что при выводе сообщения /нет искомой пары/,в первые две строки
выводит 0,но это не критично.
вот рабочий код может кому пригодится:
Код:
procedure TForm1.ToolButton9Click(Sender: TObject);

var
i,k:integer;
    a,b:real;    fl:boolean;
begin
k:=0; fl:=false;a:=0;b:=0;
for i:=0 to ListBox1.Count-2  do


begin



if (StrTofloat(ListBox1.Items[i])>0) and (StrTofloat(ListBox1.Items[i+1]) > 0 ) then
begin
 fl:=true;

    a:=strtofloat(ListBox1.Items[i]);
    b:=strtofloat(ListBox1.Items[i+1]);
    end;

     if fl=true then
     break;

   end;

        ListBox2.Items.Add(floattostr(a));
        ListBox2.Items.Add(floattostr(b));

   if fl=false then

       ListBox2.Items.Add('Искомой пары нет') ;


       end;
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 28.11.2017 в 14:40.
sativan вне форума Ответить с цитированием
Старый 28.11.2017, 14:40   #7
sativan
 
Регистрация: 13.03.2017
Сообщений: 6
По умолчанию

Спасибо за помощь,успехов вам!
sativan вне форума Ответить с цитированием
Старый 28.11.2017, 14:43   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от sativan Посмотреть сообщение
огромное вам спасибо
не за что.


Цитата:
Сообщение от sativan Посмотреть сообщение
все работает
обратите внимание, Sciv выложил пару вариантов решения вашей задачи с улучшенным кодом.


Цитата:
Сообщение от sativan Посмотреть сообщение
единственное что при выводе сообщения /нет искомой пары/,в первые две строки
выводит 0,но это не критично.
это легко исправить:
Код:
procedure TForm1.ToolButton9Click(Sender: TObject);
var
    i:integer;
    a,b:real;    
    fl:boolean;
begin
  ListBox2.Items.Clear; 
  fl:=false;
  for i:=0 to ListBox1.Count-2  do
  begin
    if (StrTofloat(ListBox1.Items[i])>0) and (StrTofloat(ListBox1.Items[i+1])>0) then begin
      fl:=true;
      a:=strtofloat(ListBox1.Items[i]);
      b:=strtofloat(ListBox1.Items[i+1]);
      break
    end;
  end;


  if fl then begin
        ListBox2.Items.Add(floattostr(a));
        ListBox2.Items.Add(floattostr(b));
  end
  else 
       ListBox2.Items.Add('Искомой пары нет');

end;
но лучше обратите внимание на код в пост #5
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2017, 14:50   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
вот рабочий код может кому пригодится
Ну что это за код выставляется на всеобщее обозрение, на него смотреть больно, как курица лапой нацарапано. Правильно форматируй код, тебе же легче будет с ним работать ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2017, 15:10   #10
sativan
 
Регистрация: 13.03.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну что это за код выставляется на всеобщее обозрение, на него смотреть больно, как курица лапой нацарапано. Правильно форматируй код, тебе же легче будет с ним работать ))
ну я не профи, там суть важна)
но спасибо за ценное замечание,буду стараться писать,чтобы приятно было смотреть)
sativan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
List box 0creator0 Microsoft Office Word 9 27.09.2011 09:04
List Box Ekzamenator Помощь студентам 3 26.09.2011 21:32
Помощь с List Box Delphi Antyan-screammer Помощь студентам 7 16.06.2010 00:00
List box help Ghennadiy Win Api 3 16.09.2009 22:33
E-Mail форма+List Box Nemesisking PHP 8 05.04.2008 12:59