Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Последовательность

Автор: Tauka 21.08.2004 21:30

Дано n действительных чисел.
Как наиболее удобно реализовать ввод чисел последовательности, если вводить не из файла?
С помощью какой компоненты и как?

Спасибочки!

Автор: xds 22.08.2004 20:01

Можно использовать TMemo или TEdit, в который пользователь должен вводить числа, разделенные запятыми, пробелами/табуляцией или т. п. IMHO, это будет достаточно удобно для пользователя и просто в реализации.

Автор: xds 22.08.2004 21:38

Вот пример ввода с помощью TMemo, для случая, когда числа должны разделяться пробельными символами (пробелы, табуляция, переводы строк):

Код
procedure TForm1.Button1Click(Sender: TObject);
var
 Data: array[0..999] of Integer;
 s: String;
 i, p: Integer;
begin
 i := 0;
 p := 1;
 repeat
   if i >= 1000 then
     begin
       Application.MessageBox('Количество элементов не должно превышать 1000',
         'Ошибка', MB_OK or MB_ICONERROR);
       Exit;
     end;
   while (p <= Length(Memo1.Text)) and (Memo1.Text[p] <= ' ') do Inc(p);
   s := '';
   while (p <= Length(Memo1.Text)) and (Memo1.Text[p] > ' ') do
     begin
       s := s + Memo1.Text[p];
       Inc(p);
     end;
   if s = '' then Break;
   try
     Data[i] := StrToInt(s);
   except
     Application.MessageBox('Ожидается целое', 'Ошибка',
       MB_OK or MB_ICONERROR);
     Memo1.SelStart := p - Length(s) - 1;
     Memo1.SelLength := Length(s);
     Memo1.SetFocus;
     Exit;
   end;
   Inc(i);
 until p >= Length(Memo1.Text);

 { Сделать что-нибудь полезное с Data (i - кол-во элементов) }
 
end;

Автор: xds 22.08.2004 21:50

Пардон, невнимательно читал - реализовал все для целых. Для действительных будет аналогично, только 'Data: array[0..999] of Double', 'Data[i] = StrToFloat(s)' и 'Ожидается действительное число' :p2:

Автор: BlackShadow 23.08.2004 14:59

Млжно несколько иначе. В насале программы на форму динамически кидается n Edit'ов, адреса которых хранятся в массиве. Потом, когда понадобится можно из них считать значения. Этот метод проще хотя бы тем, что не надо разбивать хранимое в TMemo на строки и т. д. А ещё проверку корректности чисел можно вставить в обработчик OnKeyDown например...

Автор: xds 24.08.2004 3:49

Правда тогда неудобно будет копировать/вставлять все данные или их часть с помошью буфера обмена (например, вспомним ввод регистрационных номеров: как мешают несколько полей ввода вставить в один заход кусок текста из 'serial.txt' smile.gif)

Кстати, проверка корректности ввода по 'OnKeyDown' может сильно сковывать действия пользователя. IMHO, лучше проверять все данные при нажатии кнопки, переходе на другую вкладку, форму или т. п. и автоматически делать активным TEdit, в котором (первое) неправильное значение. А можно каким-либо образом помечать все некорректно заполненные поля. Да, и не забыть о TabOrder ;)

Еще подумал о TStringGrid...

Автор: BlackShadow 25.08.2004 17:42

А ещё в каком из дельфей есть что-то типа ValueEdit или как его там... Короче растабаный на 2 части ListBox с возможностью ввода.

Вариантов короче много. Включай фантазию и вперёд smile.gif

Автор: trminator 25.08.2004 21:50

StringGrid еще можно...
Или один Edit и кнопка "Добавить" smile.gif Для наглядности добавленное число можно пихать в ListBox

Автор: BlackShadow 26.08.2004 16:11

Тогда уж и кнопку "Удалить" всунуть надо. На всякий...

Автор: xds 27.08.2004 3:33

В случае кнопочной стратегии "Добавить/удалить" не мешало бы еще завести TLabel с количеством введённых элементов. И обязательно дублировать функции кнопок клавиатурой. Например, добавлять по нажатию "Enter", а удалять - по "Delete". Интерфейсы, в которых клавиатурный ввод в обязательном порядке сопровождается манипуляциями мышкой обычно утомляет более-менее опытного пользователя...smile.gif