Главная страница
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.066 c
1-1160630818
alucard
2006-10-12 09:26
2006.11.26
Есть страничка, необходимо залогиниться.


5-1143724023
AlexeyT
2006-03-30 17:07
2006.11.26
Ошибка при удалении ActiveX контрола


3-1154341999
Reaktor
2006-07-31 14:33
2006.11.26
Помогите начать работать с книгами exel


15-1162537023
NeyroSpace
2006-11-03 09:57
2006.11.26
sourceforge.net


15-1162746007
ProgRAMmer Dimonych
2006-11-05 20:00
2006.11.26
Глюки The Bat!