IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Последовательность, Ввод чисел
Tauka
сообщение 21.08.2004 17:30
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 28

Репутация: -  0  +


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

Спасибочки!


--------------------
С уважением,
Таука.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 22.08.2004 16:01
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 22.08.2004 17:38
Сообщение #3


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Вот пример ввода с помощью 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;


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 22.08.2004 17:50
Сообщение #4


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BlackShadow
сообщение 23.08.2004 10:59
Сообщение #5


Гость






Млжно несколько иначе. В насале программы на форму динамически кидается n Edit'ов, адреса которых хранятся в массиве. Потом, когда понадобится можно из них считать значения. Этот метод проще хотя бы тем, что не надо разбивать хранимое в TMemo на строки и т. д. А ещё проверку корректности чисел можно вставить в обработчик OnKeyDown например...
 К началу страницы 
+ Ответить 
xds
сообщение 23.08.2004 23:49
Сообщение #6


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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

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

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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BlackShadow
сообщение 25.08.2004 13:42
Сообщение #7


Гость






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

Вариантов короче много. Включай фантазию и вперёд smile.gif
 К началу страницы 
+ Ответить 
trminator
сообщение 25.08.2004 17:50
Сообщение #8


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BlackShadow
сообщение 26.08.2004 12:11
Сообщение #9


Гость






Тогда уж и кнопку "Удалить" всунуть надо. На всякий...
 К началу страницы 
+ Ответить 
xds
сообщение 26.08.2004 23:33
Сообщение #10


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.07.2025 21:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"