2013-08-06 3 views
2

У меня есть приложение, которое будет использовать измерения, в частности до 1/16 дюйма. Мне бы очень хотелось, чтобы конечный пользователь мог ввести значение, ВКЛЮЧАЯ дробную часть, например, 3 7/16. Я понимаю, что я могу потребовать от пользователя просто ввести десятичные значения (т. Е. 3.1875), но мне бы очень хотелось, чтобы это было лучше. Кто-нибудь знает о падении или управлении спином, что облегчает его ввод? (В идеале версия DB контроля.)Как мне ввести фракции в Delphi?

+0

Получить пользователю ввести текст, а затем разобрать его. Элементы управления графическим интерфейсом были бы ужасны в использовании. –

+0

или ... если только разрешенные фракции могут быть выражены как кратные 1/16, тогда вам нужно всего лишь пригласить своих пользователей для числителя. Выпадающий список или управление спином будут в порядке. Вы можете разрешить больший диапазон предварительно заданных дробей, используя один элемент управления для числителя и один для знаменателя, либо бок о бок с «/» между ними, либо один над другим с линией, нарисованной на холсте между их (возможно, прямоугольный TShape с высотой 1 или 2 пикселя). – Sam

+0

Что вы хотите делать с этими фракциями? Я думаю, вы должны подумать о том, чтобы разрешить пользователю вводить выражения свободной формы, такие как «3/4» », и затем сохранять эти значения в памяти с помощью класса, который вы создаете, который может хранить как вход пользователя, так и затем манипулировать значениями. Я бы назвал это 'TDimension', и он будет иметь как исходное значение ввода строки, так и его десятичное значение внутри как поля. –

ответ

7

Вы можете сделать просто

function FractionToFloat(const S: string): real; 
var 
    BarPos: integer; 
    numStr, denomStr: string; 
    num, denom: real; 
begin 
    BarPos := Pos('/', S); 
    if BarPos = 0 then 
    Exit(StrToFloat(S)); 
    numStr := Trim(Copy(S, 1, BarPos - 1)); 
    denomStr := Trim(Copy(S, BarPos + 1, Length(S))); 
    num := StrToFloat(numStr); 
    denom := StrToFloat(denomStr); 
    result := num/denom; 
end; 

Это будет принимать ввод формы examplified по 3/7 и -4/91.5.

Чтобы разрешить целую часть, добавить

function FullFractionToFloat(S: string): real; 
var 
    SpPos: integer; 
    intStr: string; 
    frStr: string; 
    int: real; 
    fr: real; 
begin 
    S := Trim(S); 
    SpPos := Pos(' ', S); 
    if SpPos = 0 then 
    Exit(FractionToFloat(S)); 
    intStr := Trim(Copy(S, 1, SpPos - 1)); 
    frStr := Trim(Copy(S, SpPos + 1, Length(S))); 
    int := StrToFloat(intStr); 
    fr := FractionToFloat(frStr); 
    result := int + fr; 
end; 

Это будет помимо принимают входные данные формы examplified с помощью 1 1/2.

+2

И расширьте это с помощью опции, чтобы ввести целое число впереди (вы можете обнаружить это по наличию пробела char) - просто введите полное число в одном TEdit - это самый простой способ для пользователя * и * позволяет им использовать десятичные знаки в том же элементе управления, если они предпочитают вводить 3.5, чем 3 1/2 –

+0

Я думаю, что я мог бы быть наклонным для использования оценщика экспрессии JCL здесь. С настройкой, предложенной Jan. –

+0

Идея использования оценщика истинного выражения хороша. Затем вы можете вводить такие вещи, как '4.5 + (10.2 + 3.83) * 3.67'. –

0

Я, случается, написал контроль много лет назад, и в настоящее время я заканчиваю обновление для него, которое также включает в себя преобразование показателей. Он позволяет пользователю и разработчику переключаться между ft внутри, dec в, dec ft, mm, cm, m, просто щелкнув правой кнопкой мыши или установив режим во время разработки. Он также обрабатывает округление до ближайшего 16-го, 32-го или того, что вам нужно для метрики. Проверьте это на большинстве сайтов компонентов delphi, таких как torry.net или мой старый сайт по адресу http://www.enhancedtechsolutions.com/delphi/ Я надеюсь, что новая версия будет выполнена через день или 2 и опубликовано.

забыл упомянуть самую важную часть: Это называют TMaskFtInch

+0

Имеет ли это также версию с поддержкой БД? – user1009073

+0

@ user1009073 Вы можете сделать эту часть самостоятельно? –

+0

Нет, но поскольку Дэвид заявил, что это будет не слишком сложно для вас, чтобы управлять i/o через код, а не только ссылку управления.Загрузка включает демонстрационный пример, чтобы вы могли проверить текущую функциональность, не имея необходимости устанавливать что-либо. –

Смежные вопросы