Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Преобразование вариантных типов   Найти похожие ветки 

 
guav ©   (2006-10-13 23:38) [0]

Как задать формат для преобразование Double в Variant ?
Например, код:

procedure TForm1.Button1Click(Sender: TObject);
var V: Variant;
begin
 V := 1.5E-3;
 Caption := V;
end;


выведет 0,0015 в заголовок с учётом DecimalSeparator, а хотелось бы, чтобы был экспоненциальный формат с точкой (т.е. что-то вроде 1.5E-3 или 1.5000E-003 ).


 
Джо ©   (2006-10-13 23:45) [1]

Самое простое, что смог придумать:
Caption := Format ("%e",[Double(V)]);
:)


 
guav ©   (2006-10-13 23:59) [2]

> [1] Джо ©   (13.10.06 23:45)


Ну это с преобразованием в строку, так и я могу:

function EnsureProperStringFormat(V: Variant): Variant;
begin
 case VarType(V) of
   varDouble, varSingle: Result := FloatToStrF(V, ffExponent, 15, 3);
 else
   Result := V;
 end;
end;


Интересует такой код, чтобы V оставалась числом, но преобразовывалась когда требуется преобразовать как мне хочется.


 
Джо ©   (2006-10-14 00:05) [3]

> Интересует такой код, чтобы V оставалась числом, но преобразовывалась
> когда требуется преобразовать как мне хочется.

Ничего не понял, если честно. "1.5E-3" — это уже текстовое представление данных. Внутренне в Variant такие числа хранятся все-равно в Double.


 
Джо ©   (2006-10-14 00:11) [4]

> все-равно в Double

Ну, или в Single, смотря какое значение присваивать будешь.


 
guav ©   (2006-10-14 00:22) [5]

> [3] Джо ©   (14.10.06 00:05)

Перефразирую:
Сделать так, чтобы присвоение Caption := V; приводило к желаемому результату, при этом не искать такие места по всей программе, и при этом чтобы две такие переменные складывались как Double, а не как строки.


 
Джо ©   (2006-10-14 00:39) [6]

> и при этом чтобы две такие переменные складывались как
> Double, а не как строки.

Они и так будут складываться, как Double. Ну, если уж очень хочется видеть это явно, то складывай как TVarData(V1).VDouble + TVarData(V2).VDouble — но смысл-то в этом какой?


> чтобы присвоение Caption := V; приводило к желаемому результату,
> при этом не искать такие места по всей программе,

ИМХО, это невозможно. Caption := V приведет к вызову

procedure _VarToLStr(var S: string; const V: TVarData);
var
 Temp: TVarData;
begin
 if V.VType = varString then
   S := String(V.VString)
 else
 begin
   _VarInit(Temp);
   try
     _VarCast(Temp, V, varString);
     S := String(Temp.VString);
   finally
     _VarClear(Temp);
   end;
 end;
end;

И, как ни копай, по-моему, никуда тут свой формат не вклинишь :)


 
guav ©   (2006-10-14 00:56) [7]

А мне кажется, что эти
 System.VarToLStrProc := @_VarToLStr;
 System.VarToWStrProc := @_VarToWStr;

можно попробовать подменить.
Или копать в сторону custom variant types.
Думаю пути есть, вопрос только насколько это сложно.


 
Джо ©   (2006-10-14 00:58) [8]

> [7] guav ©   (14.10.06 00:56)
> А мне кажется, что эти
> System.VarToLStrProc := @_VarToLStr;
> System.VarToWStrProc := @_VarToWStr;

Хм. Точно. Похоже, тут предусмотрен был обходной путь.


 
Германн ©   (2006-10-14 01:09) [9]


> Хм. Точно. Похоже, тут предусмотрен был обходной путь.

Менять генофонд?


 
Джо ©   (2006-10-14 01:11) [10]

> [9] Германн ©   (14.10.06 01:09)
> Менять генофонд?

Зачем? просто подменить (присвоить) ссылку на свою процудуру переменной System.VarToLStrProc, вероятно.


 
Германн ©   (2006-10-14 01:23) [11]


> Джо ©   (14.10.06 01:11) [10]
>
> > [9] Германн ©   (14.10.06 01:09)
> > Менять генофонд?
>
> Зачем? просто подменить (присвоить) ссылку на свою процудуру
> переменной System.VarToLStrProc, вероятно.
>

А есть такая переменная в System? System.VarToLStrProc.


 
guav ©   (2006-10-14 21:29) [12]

Облом.
Значения VarToLStrProc и VarToWStrProc не используются для преобразования ни в коде [0], ни в моём реальном коде, они используются для форматирующих подпрограмм из SysUtils и записи вариантов в текстовый файл.



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
2-1162953204
Grademax
2006-11-08 05:33
2006.11.26
Как правильно убить процесс?


5-1144138249
ru_efim
2006-04-04 12:10
2006.11.26
Разр-тка TDigitEdit = class(TCustomEdit), как побороть сво-воText


2-1162985489
Lesorub
2006-11-08 14:31
2006.11.26
Помогите, плз, вопрос о типе TStrings


2-1162898517
alucard
2006-11-07 14:21
2006.11.26
Подскадине где компонент SocketConnection?


6-1152433865
anton773
2006-07-09 12:31
2006.11.26
закачка файла