Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Antuan, la clase "TStrings" cuenta con una propiedad de nombre "Text". La misma contiene el texto de todos elementos/items del objeto de tipo "TStrings" de turno: dicha propiedad es de tipo "string". Cualquier otra cosa, ya sabes dónde estamos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 11-08-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 21
Antuan Va por buen camino
Esto me lo figuraba

Esto me lo figuraba pero la compilacion se detiene y me dice Incompatible types. "String' and Tstring
Asi que supongo habra que convertirla de alguna forma ¡No?
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.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Lo que no puedes hacer es que una función que ha de devolver un resultado de tipo "TStrings" devuelva uno de tipo "string" sin más. Lo que has de hacer es cambiar el tipo de resultado de la función a "string". Una vez en la función, si es que es menester utilizar la clase "TStrings", siempre podrás devolver la propiedad "Text", que es de tipo "string". En todo caso, podrías tratar de que la función en cuestión no trabajara con un "TStrings", sino con "string", directamente. Aquí va un ejemplo.

Código Delphi [-]
 function Operaciones : TStrings;
  var
    temp: TStrings;
  begin
    Result := nil;
    temp := TStringList.Create;
    try
      { Resto de instrucciones }
      Result := temp; 
    finally
      temp.Free;
    end;
  end;
Esa función que devuelve un resultado de tipo "TStrings" podría reconvertirse a algo así para devolver un resultado de tipo "strings":

Código Delphi [-]
 function Operaciones : string;
   var
     temp: TStrings;
   begin
     Result := '';
     temp := TStringList.Create;
     try
       { Resto de instrucciones }
       Result := temp.Text; 
     finally
       temp.Free;
     end;
   end;
Y si acaso pudieras sustituir el tipo "TStrings" y trabajar con "strings" directamente, pues entonces podría quedar algo así, pero esto ya lo sabes:

Código Delphi [-]
 function Operaciones : string;
 var
   temp: string;
   begin
   { Instrucciones }
   Result := temp; 
 end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 11-08-2005
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Dec lo ha explicado claramente, pero seguramente Antuan no comprende bien la diferencia entre TStrings, string, etc

La clase TString es "abstracta", sirve de base para otras clases, no se usa directamente, por ejemplo, puedes crear un TStringList que hereda de TStrings y usarla entonces, algo así:

Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
  var
      sLista : TStrings;
  begin
      sLista := TStringList.Create;
  
      sLista.Add('Este es el string 1');
      sLista.Add('Y este es el 2');
  
      ShowMessage( sLista[0] );
      ShowMessage( sLista[1] );
      ShowMessage( sLista.Text );
 
      sLista.Free;
  end;
Responder Con Cita
  #5  
Antiguo 11-08-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 21
Antuan Va por buen camino
La funcion en concreto es???

Esta es la funcion en concreto:
Código Delphi [-]
uses NB30;

function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;

  URetCode: PChar;
  RetCode: char;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);

  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);

  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);

  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);

  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[i];
    RetCode          := Netbios(Ncb);

    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[i];
    // Must be 16
    Ncb.ncb_callname := '*               ';

    Ncb.ncb_buffer := Pointer(Adapter);

    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetMACAdress;
end;

Yo quiero dejar de usar el boton y en resultado del label1.caption ponerlo en una variable de string.

Seria asi como me comentais?????????¡No!
Código Delphi [-]
function NumeroMac : string;
   var
     temp: TStrings;
   begin
     Result := '';
     temp := TStringList.Create;
     try
       temp := GetMACAdress;{ Resto de instrucciones }
       Result := temp.Text; 
     finally
       temp.Free;
     end;
   end;
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.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No sé si me estoy perdiendo algo, pero, según veo la función que escribiste arriba no devuelve nada más que una cadena vacía... al principio de la misma... ¡no hay otro "Result" en todo lo que resta de función, siempre devolverá una cadena vacía! ¿Seguro que la copiaste/transcribiste completamente? Y, por otro lado, la función devuelve un "string", no un "TStrings"... ¿No te habrás confundido con la función?
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 11-08-2005 a las 12:02:21. Razón: (corrección del texto)
Responder Con Cita
  #7  
Antiguo 11-08-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 21
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
  #8  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 04:16:26.


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