Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.198
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
De entrada y sin entrar en el funcionamiento del código veo que tienes una unit con las definiciones para usar swedll32.dll desde delphi. Eso implica que debes incluirla en el uses y no repetir de nuevo nada.


Tu código debe quedar mucho más sencillo y resumiendo esto es la parte que interesa:


Código Delphi [-]
unit sample2; 

interface  

uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   StdCtrls, swiss;  

type   TForm1 = class(TForm)
    button_doit: TButton;     
    button_exit: TButton;
    outfld: TMemo;
    combo_utet: TComboBox;
    Combo_EW: TComboBox;
    Combo_NS: TComboBox;
    combo_hsys: TComboBox;
    day: TEdit;
    month: TEdit;
    year: TEdit;
    outfld: TMemo;
    hour: TEdit;
    minute: TEdit;
    second: TEdit;
    lon_deg: TEdit;
    lon_min: TEdit;
    lon_sec: TEdit;
    lat_deg: TEdit;
    lat_sec: TEdit;
    lat_min: TEdit;

 ...........
implementation

{$R *.dfm}

procedure TForm1.button_doitClick(Sender: TObject);
const
   hsys: array[0..4] of Char = ('P', 'K', 'R', 'C', 'E');
var
   tjd, tjdet, tjdut, tsid, armc, dhour, deltat : double;
   eps_true, e, nut_long: double;
   glon, glat: double;
   sjul: String[30];
   s: Array[0..255] of Char;
   sout: string[255];
   i, j: integer;
   iflag, rflag : Longint;
   ilondeg, ilonmin, ilonsec, ilatdeg, ilatmin, ilatsec: Integer;
   hcusps: array[0..12] of double;
   ascmc: array[0..9] of double;
   pname: array[0..19] of Char;
begin
  outfld.clear;
  iflag := 0;
  iday := StrToInt(day.Text);
  imonth := StrToInt(month.Text);
  iyear := StrToInt(year.Text);
  ihour := StrToInt(hour.Text);
  imin := StrToInt(minute.Text);
  isec := StrToInt(second.Text);
  ilondeg := StrToInt(lon_deg.Text);
  ilonmin := StrToInt(lon_min.Text);
  ilonsec := StrToInt(lon_sec.Text);
  ilatdeg := StrToInt(lat_deg.Text);
  ilatmin := StrToInt(lat_min.Text);
  ilatsec := StrToInt(lat_sec.Text);
  dhour := ihour + imin / 60.0 + isec / 3600.0;
  tjd := swe_julday(iyear, imonth, iday, dhour, 1);
  deltat := swe_deltat(tjd);
  if (combo_utet.ItemIndex <= 0)then
    begin
    {input date is Universal Time}
    Str((deltat * 86400):16:10,  sjul);
    sout := 'deltat:     ' + sjul + ' sec';
    outfld.Lines.Add(sout);
    tjdut := tjd;
    tjdet := tjd + deltat;
    Str(tjdut:10:8,  sjul);
    sjul := sjul + ' UT';
    end
  else
    begin
    {input date is Ephemeris Time}
    tjdet := tjd;
    tjdut := tjd - deltat;
    Str(tjdet:16:10,  sjul);
    sjul := sjul + ' ET';
    end;
  sout := 'jul. day:   ' + sjul;
  outfld.Lines.Add( sout);
  outfld.Lines.Add(' ');
  { planets }
  for i := SE_SUN to SE_TRUE_NODE do
    begin
      rflag := swe_calc(tjdet, i, iflag, xx[0], serr);
      if (rflag <> iflag) then outfld.Lines.Add(StrPas(serr));
      Str(xx[0]:16:10,  sjul);
      swe_get_planet_name(i, pname);
      sout := StrPas(pname);
      for j := StrLen(pname) to 11 do sout := sout + ' ';
      sout := sout + sjul;
      outfld.Lines.Add( sout);
    end;
  { for houses: ecliptic obliquity and nutation }
  rflag := swe_calc(tjdet, SE_ECL_NUT, 0, xx[0], serr);
  if (rflag <> 0) then outfld.Lines.Add(StrPas(serr));
  eps_true := xx[0];
  e:=xx[1];
  nut_long := xx [2];
  { geographic position }
  glon := ilondeg + ilonmin / 60.0 + ilonsec / 3600.0;
  if (combo_EW.ItemIndex > 0) then glon := -glon;
  glat := ilatdeg + ilatmin / 60.0 + ilatsec / 3600.0;
  if (combo_NS.ItemIndex > 0) then glat := -glat;
  { sidereal time }
  tsid := swe_sidtime(tjdut);
  tsid := tsid + glon / 15;
  armc := tsid * 15;
  outfld.Lines.Add(' ');
  Str(tsid:16:10, sjul);
  sout := 'Sid. time   ' + sjul;
  outfld.Lines.Add( sout);
  Str(armc:16:10, sjul);
  sout := 'ARMC        ' + sjul;
  outfld.Lines.Add( sout);
  { house method }
  i := combo_hsys.ItemIndex;
  if (i < 0) then i := 0;
  swe_houses_armc(armc, glat, eps_true, hsys[i], hcusps[0], ascmc[0]);
  Str(ascmc[0]:16:10, sjul);
  sout := 'ascendant   ' + sjul;
  outfld.Lines.Add( sout);
  Str(ascmc[1]:16:10, sjul);
  sout := 'MC          ' + sjul;
  outfld.Lines.Add( sout);
  Str(ascmc[3]:16:10, sjul);
  sout := 'vertex      ' + sjul;
  outfld.Lines.Add( sout);
  outfld.Lines.Add( '');
  for i := 1 to 12 do
    begin
      Str(i:2, sjul);
      sout := 'house ' + sjul + '    ';
      Str(hcusps[i]:16:10, sjul);
      sout := sout + sjul;
      outfld.Lines.Add( sout);
    end;

end;

procedure TForm1.button_exitClick(Sender: TObject);
begin
  swe_close;
  close;
  Exit;
end;

end.

El código es un galimatías. Debes ir con orden. Primero inicializaciza los ComboBox en funciones de inicio o en el Form.Create.
Luego darás funcionalidad a los botones...

Debes estudiar el uso de esa dll pues al parecer debes inicializar con una ruta que debe contener previamente algunos archivos y quizás requiera más acciones. Este punto es básico y piensa que probablemente ninguno de nosotros estamos familiarizados con esa dll, ese es tu cometido.

Cuando requieras preguntar alguna cosa concreta, trata de aislar en lo posible el código que te preocupa y que sea suficiente para entenderte pero no tán sobrecargado que se pierdan las ganas de leerlo.


Saludos.

Última edición por escafandra fecha: 20-02-2020 a las 22:19:05.
Responder Con Cita
  #2  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.198
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ahora fíjate en este código:

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DateUtils, swiss;
.............................



var
  i, iflag: integer;
  xx:       array[0..5] of double;
  planet:   array [1..12] of double;
  serr:     PChar;
  JulDay:   double;
begin
  swe_set_ephe_path(PCHAR('c:\sweph\ephe\'));
  JulDay:= DateTimeToJulianDate(Date);
  for i:= 1 to 12 do
  begin
    swe_calc_ut(Date, i, SE_ECL_NUT, xx[0], serr);
    planet[i]:= xx[0];
  end;
end;

El array es asignado correctamente, otra cosa es que los valores sean los experados.

Fíjate que arroja un error serr = 'SwissEph file 'seplm48.se1' not found in PATH 'c:\sweph\ephe\'' para todos los valores de i hasta para I=10.

Para i= 11 el error es 'SwissEph file 'semom48.se1' not found in PATH 'c:\sweph\ephe\'' y para i=12 no falla


Esto quiere decir que en ese path deben existir previamente esos archivos y probablemente alguno más.

Entonces la pregunta no es como rellenar un array, sino como manejar swedll32.dll para conseguir el array que esperamos.


Saludos.

Última edición por escafandra fecha: 20-02-2020 a las 23:55:10.
Responder Con Cita
  #3  
Antiguo 20-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.198
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pero si lo usamos así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i, iflag: integer;
  xx:       array[0..5] of double;
  planet:   array [1..12] of double;
  serr:     PChar;
  JulDay:   double;
begin
//  swe_set_ephe_path(PCHAR('c:\sweph\ephe\'));
  JulDay:= DateTimeToJulianDate(Date);
  iflag := 0;
  for i:= 1 to 12 do
  begin
    swe_calc(Date, i, iflag, xx[0], serr);
    planet[i]:= xx[0];
  end;
end;

Entonces no hay errores y los valores son:
Cita:
0
0
0
0
0
0
0
0
0
188,01570562548
0
200,800942459646
Ahora bien, no tengo ni idea si eso es lo que se espera para la fecha de hoy.



Saludos.
Responder Con Cita
  #4  
Antiguo 21-02-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 215
Poder: 14
compuin Va por buen camino
Hola Escafandra

Te anexo el archivo con el projecto completo (Puse el link ya que no me deja ponerlos adjuntos )


https://www.astro.com/ftp/swisseph/sweph.zip

La Dll hace los calculos, pero existen unos archivos .se1 que aunque arrojan error no son necesarios (Son para calculo de asteroides)

La variable xx[0] se espera que arroje la longitud o posicion planetaria del sol, luna, mercurio, venus, marte, jupiter, saturn, urano, neptuno y pluton

Son 10 planetas, asi que seria del 1 al 10
Responder Con Cita
  #5  
Antiguo 21-02-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 215
Poder: 14
compuin Va por buen camino
Para la fecha de hoy esto es lo que se espera

deltat: 69.5103960890 sec
jul. day: 2458900.50000000 UT

Sun 331.8094127618
Moon 302.2187037435
Mercury 341.5633697228
Venus 15.2722542439
Mars 273.1099711227
Jupiter 287.8282244089
Saturn 297.2549903731
Uranus 33.3602165722
Neptune 347.7743860929
Pluto 294.0205054947
mean Node 95.5387999697
true Node 97.1857573215

Sid. time 10.5957212216
ARMC 158.9358183233
ascendant 230.7646482310
MC 157.2282506635
vertex 92.2206035689

house 1 230.7646482310
house 2 261.2501400084
house 3 298.8634035392
house 4 337.2282506635
house 5 8.4105200249
house 6 32.0604837022
house 7 50.7646482310
house 8 81.2501400084
house 9 118.8634035392
house 10 157.2282506635
house 11 188.4105200249
house 12 212.0604837022
Responder Con Cita
  #6  
Antiguo 21-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.198
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ya, pero eso no es xx [0] que fue el origen de la pregunta y tampoco queda claro que son todos esos datos a no ser que seas entendido en la materia.

Saludos.
Responder Con Cita
  #7  
Antiguo 21-02-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 215
Poder: 14
compuin Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Ya, pero eso no es xx [0] que fue el origen de la pregunta y tampoco queda claro que son todos esos datos a no ser que seas entendido en la materia.

Saludos.
OK

Los datos de houses son las posiciones en una rueda que no esta presente en el codigo (no necesaria dibujarla)

Los calculos de la posicion de los planetas son mostrados en xx[0]

La pregunta original era como podia llenar un array llamado planeta a partir de este ultimo valor
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
LLenar Array con Query RaulA Conexión con bases de datos 2 22-11-2012 16:53:58
Array dentro de un Array Holger PHP 4 03-01-2012 17:27:44
Llenar un array donpedro Varios 5 12-08-2011 16:29:07
llenar array con consulta JULIOCTORRESG Varios 11 02-03-2007 15:13:04
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51


La franja horaria es GMT +2. Ahora son las 23:41:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi