Newsgroup: it.comp.lang.delphi
Titolo: Aiuto: Conversione numeri MBF in Real per arrivare poi a TDate;

Ho la necessita' di convertire un valore a quattro Byte in una data. !?
Il formato dati menzionato viene chiamato MBF (Microsoft Binary Format)
ed e' vecchio quanto il cucco. Risale all'epoca, cioe', in cui di gestire i
numeri
in virgola mobile, per un PC, era solo un sogno.
Guarda caso pero', io, mi trovo a dover lavorare con questo tipo di dati !
Con una funzione che ho trovato da qualche parte, riesco a convertire il
numero
a quatttro Byte in un numero Real di tipo Double pressappoco dell' aspetto
seguente:
6.237626876E-310.
A questo punto mi perdo perche' quel numero li' tutto puo' essere, secondo
me, tranne
che una data. Infatti tutti i tipi di conversione da me provati non
funzionano.
Mi ritrovo sempre con il valore di zero che corrisponde alla data del
31/12/1899.
Inutile dire che qualche suggerimento mi sarebbe di notevole aiuto...
tanti saluti,
  Lorenzo.          airenzo@#NOSPAM#
infinito.it
       togliere #NOSPAM#
allego formato dati a cui mi riferisco e la funzione menzionata;
###
unit uConvert;
interface
uses .........;
type   MyReal = Array [1..4] of Byte;
type TForm1 = class(Form)
        edit1 : TEdit;
        Button1: TButton;
   private
       procedure Button1Click(Sender:TObject);
end;
function MBF_to_Ie(var ms):Real;
implementation
var aB: MyReal;
function MBF_to_Ie(var ms):Real;  // <- QUESTA e' la funzione
 var r:Real;
      ie:Array[1..6] of Byte absolute r ;
      m: MyReal absolute ms;
 begin
   FillChar(r,sizeof(r),0);
   ie[1]:=m[4];
   ie[4]:=m[1];
   ie[5]:=m[2];
   ie[6]:=m[3];
   Ms_to_Ie:= r ;              // <- restituisce un valore Double
 end;
procedure Button1Click(Sender:TObject);
 var R: Real;  Dd: TDateTime;  Ds: string;
 begin
   aB[1] :=  176;
   aB[2] :=  93;
   aB[3] :=  122;
   aB[4] :=  148;
   R := MBF_to_Ie(aB);       // <- il problema e' qui. Che ci faccio con R ?
   Ds := DateToStr( StrToDate(FloatToStr(R)));  //  <- questo non funziona;
   Dd := R                                       // <- questo funz. men che
meno :)
   Dd := DecodeDate(int(R));        // <- non ricordo se l'ho provato ma
                                                     //      penso di si
   edit1.text :=  Ds;
   edit1.text := DateTostr(Dd);
 end;
end.
####

 in virgola mobile, per un PC, era solo un sogno.
Ciao
ho trovato queste informazioni riguardo all'mbf sul vecchio adorato SWAG:
Microsoft binary (by Jeffery Foy):
   31 - 24    23     22 - 0        <-- bit position
+-----------------+----------+
| exponent | sign | mantissa |
+----------+------+----------+
IEEE (C/Pascal/etc.):
   31     30 - 23    22 - 0        <-- bit position
+----------------------------+
| sign | exponent | mantissa |
+------+----------+----------+
e non mi sembra che la tua funzione funzi...
Il tipo Dubble č rappresentato 8 byte mentre te giochi solo con 6...
e lavorare a livello di byte non č preciso.
Sul sito microsoft c'č una DLL per fare la conversione corretta:
La pagina č 
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q140520
Per la conversione in Data, prova il valore che ne esce.
Puň darsi che la data 0 sia diversa tra la funzione di conversione Data di 
Delphi e il vecchio standard MBF. bisognerebbe trovare il delta e confrontarlo
con le altre date a tua disposizione per avere un valore corretto.
Ad esempio, solo rimanendo dentro Delphi, l'help ammonisce con
Note:	Delphi 1.0 calculated the date from year 1 instead of from 1899. To 
convert a Delphi 1.0 date to a Delphi 2.0 date, subtract 693594.0 from the 
Delphi 1.0 date. The date format changed to be more compatible with OLE 2.0 
Automation.
Figuriamoci tra sistemi vecchi bacucchi e Delphi nuovo :)
Ciaoo
Matteo
-- 
Posted from  [195.223.140.122] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG