Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-08-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Perdon que me he equivocado que no es esa funcion

Lo siento mucho pero es tal el cacao que tengo que me he equivocado de funcion.
Es esta:
Código Delphi [-]
 function getIPs: Tstrings;
 type
   TaPInAddr = array[0..10] of PInAddr;
   PaPInAddr = ^TaPInAddr;
 var
   phe: PHostEnt;
   pptr: PaPInAddr;
   Buffer: array[0..63] of Char;
   I: Integer;
   GInitData: TWSAData;
 begin
   WSAStartup($101, GInitData);
   Result := TstringList.Create;
   Result.Clear;
   GetHostName(Buffer, SizeOf(Buffer));
   phe := GetHostByName(buffer);
   if phe = nil then Exit;
   pPtr := PaPInAddr(phe^.h_addr_list);
   I    := 0;
   while pPtr^[i] <> nil do
   begin
     Result.Add(inet_ntoa(pptr^[i]^));
     Inc(I);
   end;
   WSACleanup;
 end;

Y es resultado de esta funcion es el que lo quiero pasar a una variable de String
Y supongo que seria asi:
Código Delphi [-]
  function Operaciones : string;
    var
      temp: TStrings;
    begin
      Result := 'GetIPs';
      temp := TStringList.Create;
      try
        { Resto de instrucciones }
        Result := temp.Text;
      finally
        temp.Free;
      end;
    end;`

Y la variable de String seria Operaciones???????
Es asi verdad??????
Perdonar por haber cometido tan gran error.
Y muchas gracias por vuestra ayuda.

Última edición por Neftali [Germán.Estévez] fecha: 11-08-2005 a las 13:13:27. Razón: Tag incorrecto
Responder Con Cita
  #2  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Antuan
Perdonar por haber cometido tan gran error.
Nada, hombre, qué dices, no hay nada que perdonar

Por otro lado con la función que escribes últimamente hay un pequeño problema para hacer que esta pase a devolver una cadena, o sea, una variable de tipo "string". ¿Porqué? Pues porque por algo devuelve el tipo que devuelve: la función se llama "GetIps" y puede devolver varias IPs, no solamente una.

Claro está, sería más sencillo de "recorrer" el resultado de la función para obtener cada una de las IPs devuelta, o una, si ese fuera el caso. Desconozco cómo hace lo que hace la función y si, por ejemplo, siempre devuelve una primera IP, digamos, principal, por defecto, acaso la que se persigue... de no ser así... devolver el resultado como "string" podría ocasionarte quebraderos de cabeza, puesto que la variable "resultado" podría contener más de una IP... y habría a partir de ahí que discriminarlas.

En todo caso, así quedaría la función devolviendo una cadena, un tipo "string", en lugar de un "TStrings":

Código Delphi [-]
   function getIPs: string;
  type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
  var
    phe: PHostEnt;
    pptr: PaPInAddr;
    Buffer: array[0..63] of Char;
    I: Integer;
    GInitData: TWSAData;
    temp: TStrings;
  begin
    Result := '';
    WSAStartup($101, GInitData);
    temp := TstringList.Create;
    temp.Clear;
    GetHostName(Buffer, SizeOf(Buffer));
    phe := GetHostByName(buffer);
    if phe = nil then Exit;
    pPtr := PaPInAddr(phe^.h_addr_list);
    I    := 0;
    try
      while pPtr^[i] <> nil do
      begin
        temp.Add(inet_ntoa(pptr^[i]^));
        Inc(I);
      end;
      Result := temp.Text;
    finally
      temp.Free;
    end;
    WSACleanup;
  end;
Se me ocurre a bote pronto, que, si no se encuentra otra forma mejor de hacerlo, tal vez podría cambiarse la siguiente instrucción a algo parecido a:

Código Delphi [-]
  if temp.Count > 0 then
    temp.Add(' $$ ' + inet_ntoa(pptr^[i]^))
  else
    temp.Add(inet_ntoa(pptr^[i]^));
De ese modo, en la cadena que obtuvieras como resultado, caso de haber más de una dirección IP obtendrías algo así como resultado:

Código:
  123.45.32.45 $$ 234.42.23.12
Acaso esos signos "dólar" pudieran servirte luego para averiguar, primero, si hay más de una IP en la cadena "resultado" y, en ese caso, conseguir todas las que hubiera, con ayuda de funciones como "Pos" y "Copy", por ejemplo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 11-08-2005 a las 13:14:29. Razón: (corrección del texto)
Responder Con Cita
  #3  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Metí un tanto la pata... puesto que, si ya no se piensa devolver un tipo "TStrings" con la función, ¿a qué utilizarlo entonces, pudiendo utilizar directamente una cadena? Así tal cual:

Código Delphi [-]
  function getIPs: string;
 type
   TaPInAddr = array[0..10] of PInAddr;
   PaPInAddr = ^TaPInAddr;
 var
   phe: PHostEnt;
   pptr: PaPInAddr;
   Buffer: array[0..63] of Char;
   I: Integer;
   GInitData: TWSAData;
 begin
   Result := '';
   WSAStartup($101, GInitData);
   GetHostName(Buffer, SizeOf(Buffer));
   phe := GetHostByName(buffer);
   if phe = nil then Exit;
   pPtr := PaPInAddr(phe^.h_addr_list);
   I    := 0;
   while pPtr^[i] <> nil do
   begin
     if Result = '' then
       Result := (inet_ntoa(pptr^[i]^))
     else
       Result := ' $$ ' + (inet_ntoa(pptr^[i]^);     
     Inc(I);
   end;
   WSACleanup;
 end;
Eso que nos ahorramos, ¿no te parece?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 11-08-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Esta es la que sirve

Esta que te pongo es la que sirve:
Código Delphi [-]
function getIPs: Tstrings;
 type
   TaPInAddr = array[0..10] of PInAddr;
   PaPInAddr = ^TaPInAddr;
 var
   phe: PHostEnt;
   pptr: PaPInAddr;
   Buffer: array[0..63] of Char;
   I: Integer;
   GInitData: TWSAData;
 begin
   WSAStartup($101, GInitData);
   Result := TstringList.Create;
   Result.Clear;
   GetHostName(Buffer, SizeOf(Buffer));
   phe := GetHostByName(buffer);
   if phe = nil then Exit;
   pPtr := PaPInAddr(phe^.h_addr_list);
   I    := 0;
   while pPtr^[i] <> nil do
   begin
     Result.Add(inet_ntoa(pptr^[i]^));
     Inc(I);
   end;
   WSACleanup;
 end;
De momento me devuelve una ip solo
Muchas gracias por cambiarme la funcion.
Tengo varias de este tipo y las tendre que cambiar.
Ya he cogido la forma de trabajar con el TString que es para variables de matriz por eso se representa en un TMemo o en un TList.
De ahi el haberte mandado ayer un correo con esta misma funcion para si podias hacerme un pequeño ejemplo del objeto rectangulo.
Con esta misma funcion original que el resultado lo da en un TMemo.
David muchas gracias y perdona por hacerte perder un poco el tiempo.
Responder Con Cita
  #5  
Antiguo 11-08-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.108
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #6  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Casimiro Notevi
Creo que Casimiro se sorprende porque sigues utilizando una función que devuelve un "TStrings" como una catedral

Cita:
Empezado por Antuan
De ahi el haberte mandado ayer un correo con esta misma funcion para si podias hacerme un pequeño ejemplo del objeto rectangulo.
Otra vez no entenderán de qué hablamos, pero, en todo caso, creo que lo importante es que... ¡¿No te llegó el correo que te envié ayer noche!? En él llevaba a cabo justo lo que me pedías, junto con algunas aclaraciones y notas al respecto.

* Nota para todos: Un "objeto rectángulo" es un "objeto" de cierto programa de nombre Neobook que permite que puedan añadírsele "plugins", por ejemplo, programados con Delphi. En dicho objeto rectángulo el programador del "plugin" tiene la posibilidad de "añadir" un determinado componente "visual" de Delphi, por ejemplo un "TMemo". Básicamente es esto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 11-08-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.108
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por dec
Creo que Casimiro se sorprende porque sigues utilizando una función que devuelve un "TStrings" como una catedral
Efectivamente, es como si una función tiene que devolver un string y hago que devuelva un entero, y luego convertir ese entero a string, sin motivo, necesidad ni falta que hace.

Pero, bueno, allá cada uno con sus manías
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


La franja horaria es GMT +2. Ahora son las 10:59: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