type
TCoordenadaGeografica = Record
grados : Double;
minutos : Double;
segundos : Double;
End;
TConversion = class
class function gradosADecimales(grados: Double; minutos: Double; Segundos: Double):double; overload;
class function gradosADecimales(coordenadaGeografica: TCoordenadaGeografica):double;overload;
class function decimalesAGrados(valorDecimal :Double):TCoordenadaGeografica;
end;
implementation
{ TConversion }
class function TConversion.decimalesAGrados(
valorDecimal: Double): TCoordenadaGeografica;
var
resultado : TCoordenadaGeografica;
begin
resultado.grados := Int(valorDecimal);
resultado.minutos := Int((valorDecimal - resultado.grados)) * CONV_MINUTOS;
resultado.segundos := (resultado.minutos - Int(resultado.minutos)) * CONV_MINUTOS;
result := Resultado;
end;
class function TConversion.gradosADecimales(grados, minutos,
Segundos: Double): double;
var
resultado : Double;
begin
resultado := grados + (minutos / CONV_MINUTOS ) + (segundos / CONV_SEGUNDOS);
result := resultado;
end;
class function TConversion.gradosADecimales(
coordenadaGeografica: TCoordenadaGeografica): double;
var
resultado : Double;
begin
resultado := coordenadaGeografica.grados +
(coordenadaGeografica.minutos / CONV_MINUTOS ) +
(coordenadaGeografica.segundos / CONV_SEGUNDOS);
result := resultado;
end;
Todo funcionaba correctamente..., pero noté que estaba utilizando muchas líneas de código para hacer las conversiones:
Tomando en cuenta que tenía que hacer ésto en varios lugares encontré la solución haciendo uso de las nuevas características de los Records en Delphi:
procedure TfrmCaptura.asignaCoordenada(Sender: TObject);
var
latitud : TCoordenadaGeografica;
longitud : TCoordenadaGeografica;
begin
inherited;
latitud.grados := TConversion.toFloat(peaLatG.Text);
latitud.minutos := TConversion.toFloat(peaLatM.Text);
latitud.segundos := TConversion.toFloat(peaLatS.Text);
longitud.grados := TConversion.toFloat(peaLonG.Text);
longitud.minutos := TConversion.toFloat(peaLonM.Text);
longitud.segundos := TConversion.toFloat(peaLonS.Text);
// aquí se guarda en la base
end;
type
TCoordenadaGeografica = Record
grados : Double;
minutos : Double;
segundos : Double;
constructor Create(AGrados: Double; AMinutos:Double; ASegundos:Double); overload;
constructor Create(AGrados: String; AMinutos: String; ASegundos:String); overload;
End;
/// más líneas por acá
{ TCoordenadaGeografica }
constructor TCoordenadaGeografica.Create(AGrados, AMinutos, ASegundos: Double);
begin
Self.grados := AGrados;
Self.minutos := AMinutos;
Self.segundos := ASegundos;
end;
constructor TCoordenadaGeografica.Create(AGrados, AMinutos, ASegundos: String);
begin
Self.grados := TConversion.toFloat(AGrados);
Self.minutos := TConversion.toFloat(AMinutos);
Self.segundos := TConversion.toFloat(ASegundos);
end;
Por lo que me ahorré muchas lineas de código al hacer uso de los constructores en los Records:
procedure TfrmCaptura.asignaCoordenada(Sender: TObject);
var
latitud : TCoordenadaGeografica;
longitud : TCoordenadaGeografica;
begin
inherited;
latitud := TCoordenadaGeografica.Create(peaLatG.Text,peaLatM.Text,peaLatS.Text);
longitud := TCoordenadaGeografica.Create(peaLonG.Text,peaLonM.Text,peaLonS.Text);
// aquí se guarda en la base
end;
Otra opción hubiera sido el crear una clase de que se encargara de la conversión (que finalmente así quedó implementado) pero para mí fué una oportunidad de probar esta interesante característica de los Records en Delphi.