Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   alguien puede convertir esta funcion a C++ Builder ? (https://www.clubdelphi.com/foros/showthread.php?t=90901)

Snaked 01-10-2016 21:41:21

alguien puede convertir esta funcion a C++ Builder ?
 
Tengo esta funcion en Delphi y no se como se implementaria en C++ builder Rad Studio

Alguien me echa una manita??

Código Delphi [-]
function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean; 
var 
ps: IPersistStreamInit; 
ss: TStringStream; 
sa: IStream; 
s: string; 
begin 
ps := WebBrowser.Document as IPersistStreamInit; 
s := ''; 
ss := TStringStream.Create(s); 
try 
sa := TStreamAdapter.Create(ss, soReference) as IStream; 
Result := Succeeded(ps.Save(sa, True)); 
if Result then ACode.Add(ss.Datastring); 
finally 
ss.Free; 
end; 
end;

ecfisa 02-10-2016 07:11:29

Hola Snaked.

Código:

...
#include <ActiveX.hpp>
...

void gethtmlCode(TCppWebBrowser* wb, TStrings* lines)
{
  IPersistStreamInit* psi;

  if (!wb->Document) return;
  if (wb->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi) == S_OK)
  {
    TStringStream *ss = new TStringStream("");
    TStreamAdapter *sa = new TStreamAdapter(ss, soReference);

    try
    {
      if (SUCCEEDED(psi->Save(*sa, true)))
        lines->Add(ss->DataString);
    }
    __finally
    {
      delete ss;
      delete sa;
    }
  }
}

Ejemplo de uso:
Código:

void __fastcall TForm1::Button1Click(TObject* Sender)
{
  gethtmlCode(CppWebBrowser1, Memo1->Lines);
}

Saludos :)

Snaked 02-10-2016 11:16:37

hola de nuevo ecfisa

aqui intentando encajar el codigo que me has dado pero me da un par de errores que no encuentro como solucionarlos de momento

si incluyo el #include <Winapi.ActiveX.hpp> me da 229 errores.....
si no lo incluyo solo da estos

dice el linker estos 3 errores:

"use of undeclared identifier 'IPersistStreamInit' "
"use of undeclared identifier 'psi' "
"no member named 'Document' in 'Fmx::WebBrowser::TWebBrowser' "

y la funcion esta asi

Código:

void gethtmlCode(TWebBrowser* wb, TStrings* lines)
{
  IPersistStreamInit* psi;

  if (!wb->Document) return;
  if (wb->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi) == S_OK)
  {
        TStringStream *ss = new TStringStream("");
        TStreamAdapter *sa = new TStreamAdapter(ss, soReference);

        try
        {
          if (SUCCEEDED(psi->Save(*sa, true)))
                lines->Add(ss->DataString);
        }
        __finally
        {
          delete ss;
          delete sa;
        }
  }
}

no entiendo como algo tan simple como guardar un codigo fuente HTML de una pagina web en un Memo se puede volver tan lioso

ecfisa: la cuestion es que NECESITO esta funcion como el comer, porque es clave en un punto del programa donde cargo en el TWebBrowser una pagina web y necesito acceder al texto HTML pasandolo al Memo y la cuestion es que estoy probando codigo en RAD STUDIO 10 Seattle y en C++ Builder 6 si pude hacerlo pero este codigo no sirve en RS10 entre otras cosas porque el citado "Document" del TWebBrowser ya no esta donde estaba en builder 6

Estoy buscando por toda la Red y no encuentro nada que me aclare esto del famoso "Document"

j0seant 02-10-2016 18:57:33

Modificándolo un poco valdría tanto para la versión 6 como para la 10Seattle (y no es necesario añadir ninguna cabecera manualmente)

Solo es válido para una aplicación VCL evidentemente, no para una FMX.

Código:

void gethtmlCode(TCppWebBrowser* wb, TStrings* lines)
{
  IPersistStreamInit* psi;
  if (wb->Document && SUCCEEDED(wb->Document->QueryInterface<IPersistStreamInit>(&psi)))
  {
    TStringStream *ss = new TStringStream(String(""));
    _di_IStream sa(*new TStreamAdapter(ss, soReference));
    try {
      if (SUCCEEDED(psi->Save(sa, true)))
        lines->Add(ss->DataString);
    }
    __finally {
      delete ss;
      psi->Release();
    }
  }
}


Snaked 26-10-2016 17:08:23

que es una FMX ?

j0seant 26-10-2016 23:08:01

Cita:

Empezado por Snaked (Mensaje 510059)
que es una FMX ?

C++Builder/Delphi, usan 2 frameworks, el de toda la vida, llamado VCL (Visual Component Library) y uno nuevo multiplataforma llamado FMX (Firemonkey).

En versiones más viejas, directamente ponía Firemonkey o FMX en los menús, en las nuevas, aunque es lo mismo, pone Multi-Device, ya que como había dicho es multiplataforma: Windows, Mac (OS X), iPhone (iOS), Android y próximamente Linux).

Las dos librerías no son compatibles, aunque FMX tiene muchas similitudes con la VCL. Y aunque Embarcadero insiste mucho en que ya es madura, si buscas en la propia comunidad Embarcadero o blogs, hay bastantes quejas de que aún tiene demasiados errores. También han dicho que no es un sustituto de la VCL, y que esta se seguirá manteniendo y ampliando.


La franja horaria es GMT +2. Ahora son las 11:57:31.

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