IpHtmlPanel

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

IpHtmlPanel

Beitrag von hbr »

Hallo,
ist es möglich einen Text mit seiner Darstellung und Bilder aus einem "IpHtmlPanel" in ein geöffnetes
Textverarbeitungsprogram (z.B. Word) über die Zwischenablage einzufügen?

Wenn ja, wie?

"IpHtmlPanel.CopyToClipboard" übergibt nur den reinen Text, ohne Formatierung und Bilder.

Für eine Antwort wäre ich Dankbar.

Gruß

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: IpHtmlPanel

Beitrag von Christian »

Für die Bilder müsstest du das testen, Formatierungen bekommst du wenn du das ganze HTML in die Zwischenablage kopierst. Wenn die Bilder auf der Festplatte liegen und die Pfade stimmen könnte das mit den Bildern auch klappen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: IpHtmlPanel

Beitrag von hbr »

Christian hat geschrieben:Für die Bilder müsstest du das testen, Formatierungen bekommst du wenn du das ganze HTML in die Zwischenablage kopierst. Wenn die Bilder auf der Festplatte liegen und die Pfade stimmen könnte das mit den Bildern auch klappen.
Danke für die Antwort.

Zusätlich habe ich das gesammte html in einem FileStream, aber wie bekomme ich den dieses in das Clipboard?

Mit "IpHtmlPanel.SelectAll" wird zwar alles markiert, doch wahrscheilicht nicht das gesammte html.
"IpHtmlPanel.CopyToClipboard" überträgt dann das markierte.
Mit "IpHtmlPanel.SetHtmlFromFile('....') wird ein gesammtes html geschrieben.

Wie bekomme ich denn nun alles ins Clipboard? Ich finde einfach keine Möglichkeit das gesammte zu übergeben.

Gruß

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: IpHtmlPanel

Beitrag von Christian »

Code: Alles auswählen

 
  aFormat := Clipboard.FindFormatID('text/html');
  if Clipboard.FindFormatID('text/html') = 0 then
    aFormat := RegisterClipboardFormat('text/html');
  Clipboard.AddFormat(aFormat,aMStream);
 
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: IpHtmlPanel

Beitrag von hbr »

Vielen Dank,
Christian hat geschrieben:

Code: Alles auswählen

 
  aFormat := Clipboard.FindFormatID('text/html');
  if Clipboard.FindFormatID('text/html') = 0 then
    aFormat := RegisterClipboardFormat('text/html');
  Clipboard.AddFormat(aFormat,aMStream);
 
Leider funktioniert es nicht.
Der Stream aMStream(Type TMemoryStream) wird nicht übertragen.
Bei aMStream.SaveToFile('testen.htm') wird die htm Datei mit Inhalt erzeugt;

gruß

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: IpHtmlPanel

Beitrag von theo »

Bei mir geht das:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var aSStream:TStringStream;
  aFormat:TClipBoardFormat;
begin
 aSStream:=TStringStream.Create('<html>aha <i> aha </i> aja</html>');
 aSStream.Position:=0;
  aFormat := Clipboard.FindFormatID('text/html');
   if Clipboard.FindFormatID('text/html') = 0 then
     aFormat := RegisterClipboardFormat('text/html');
   Clipboard.AddFormat(aFormat,aSStream);
 aSStream.free;
end;   

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: IpHtmlPanel

Beitrag von hbr »

theo hat geschrieben:Bei mir geht das:
Hallo,
ja wahrscheinlich weil bei dem Beispiel aSStream ein TStringStream ist.

Ich habe da meine Schwierigkeit meinen TMemoryStream umzuwandeln.

Gruß

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: IpHtmlPanel

Beitrag von Michl »

@hbr: unter welchem System versuchst Du das?
Unter Win7 funktioniert das mir so nicht (Lazarus1.3 und 1.2.4 gleiches Verhalten). z.B:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  aSStream: TStringStream;
  aFormat: TClipBoardFormat;
begin
  aSStream:=TStringStream.Create('<html>aha <i> aha </i> aja</html>');
  aSStream.Position:=0;
//  aFormat:=ClipBoard.FindFormatID('text/plain');
//  if ClipBoard.FindFormatID('text/plain') = 0 then
//    aFormat:=RegisterClipBoardFormat('text/plain');
  aFormat:=ClipBoard.FindFormatID('text/html');
  if ClipBoard.FindFormatID('text/html') = 0 then
    aFormat:=RegisterClipBoardFormat('text/html');
  ClipBoard.AddFormat(aFormat, aSStream);
  aSStream.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  s:='';
  for i:=0 to ClipBoard.FormatCount-1 do
    s:=s + ClipBoardFormatToMimeType(ClipBoard.Formats[i]) + LineEnding;
  s:=s + LineEnding;
  s:=s + ClipBoard.AsText;
  ShowMessage(s);
end; 
liefert einen leeren Inhalt, siehe Bild unten. Verwende ich statt 'text/html' -> 'text/plain' wird der Text übergeben, aber selbst da ist das letzte Zeichen nicht mit dabei. Funktionieren tut

Code: Alles auswählen

  ClipBoard.AsText:=aSStream.DataString; 
aber halt nur als String und nicht html. Diese Verhalten ist mMn nicht gewünscht und sollte als Bug gemeldet werden!

Generell: Was ist das letztendliche Ziel, evtl. gibt es ja noch andere Möglichkeiten?!
Dateianhänge
ClipBoard.png
ClipBoard.png (1.7 KiB) 1941 mal betrachtet

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: IpHtmlPanel

Beitrag von hbr »

Folgendes,
ich habe das ganze mal mit 'TMemoryStream' versucht was ja eigentlich auch funktionieren müsste.

Code: Alles auswählen

procedure TInfos.Button1Click(Sender: TObject);
   var //aMStream: TMemoryStream;  --- ist Global und wird an anderer Stelle gefüllt
  aFormat:TClipBoardFormat;
begin
 aMStream.Position:=0;
  aFormat := Clipboard.FindFormatID('text/html');
   if Clipboard.FindFormatID('text/html') = 0 then
     aFormat := RegisterClipboardFormat('text/html');
     Clipboard.AddFormat(aFormat,aMStream);
   aMStream.SaveToFile('d:\testen.htm');
  aMStream.free;
end;   
als Kontrolle ob etwas in aMStream steckt, habe ich es zusätzlich in ein File gespeichert.
In der Zwischenablage befindet sich nichts.
Nach Ausführung (Button), wird Word gestartet und es ist nichts vorhanden.
Michl hat geschrieben: Generell: Was ist das letztendliche Ziel, evtl. gibt es ja noch andere Möglichkeiten?!
Also generell stelle ich Html-Text in einem IpHtmlPanel dar.
Nun möchte ich den Inhalt so wie er ist in eine Textverarbeitung übergeben.
Also über die Zwischenablage.
Nun gelingt es mir nicht den html- Text aus dem IpHtmlPanel komplett in die Zwischenablage zu übergeben sodass ich ihn z.B in word einfügen kann.
Lazarus v1.2.0

Zusatz:
Ja das wars, 'text/plain'
jetzt habe ich zwar den HTML Text aber nicht die Textformatierungen wie Christian meint.

Ich habe das ganze mal mit rtf versucht, wenn ich rtf-Code in Word oder SWriter reinziehe, dann wird diese dargestellt.
aber dafür breäuchte ich eine rtf-Datei und das sieht ja bei Lazarus gan böse aus, wegen RichEdit.

Welche Möglichkeiten habe ich Sonst?
Zuletzt geändert von hbr am Mi 13. Aug 2014, 15:03, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: IpHtmlPanel

Beitrag von theo »

Michl hat geschrieben: Unter Win7 funktioniert das mir so nicht
Auch dein Bsp. funktioniert bei mir leicht abgeändert.
Getestet unter GTK/Linux und Win64/Wine

Code: Alles auswählen

var
  Form1: TForm1;
  aFormat: TClipBoardFormat;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  aSStream: TStringStream;
begin
  aSStream:=TStringStream.Create('<html>aha <i> aha </i> aja</html>');
  aSStream.Position:=0;
  aFormat:=ClipBoard.FindFormatID('text/html');
  if ClipBoard.FindFormatID('text/html') = 0 then
    aFormat:=RegisterClipBoardFormat('text/html');
  ClipBoard.AddFormat(aFormat, aSStream);
  aSStream.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  aSStream: TStringStream;
var
  i: Integer;
  s: String;
begin
  aSStream:=TStringStream.Create('');
  s:='';
  for i:=0 to ClipBoard.FormatCount-1 do
    s:=s + ClipBoardFormatToMimeType(ClipBoard.Formats[i]) + LineEnding;
  s:=s + LineEnding;
  ClipBoard.GetFormat(aFormat,aSStream);
  s:=s +aSStream.DataString;
  ShowMessage(s);
  aSStream.free;
end;    
Das so kopierte HTML im Clipboard lässt sich übrigens auch als HTML in Libreoffice und Caligra Words einfügen.
Zuletzt geändert von theo am Mi 13. Aug 2014, 15:15, insgesamt 1-mal geändert.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: IpHtmlPanel

Beitrag von hbr »

Danke, aber
Sorry, ich arbeite mit einem 'TMemoryStream'
welches 2-3 Seiten HTM-Code beinhaltet.
Versucht habe ich es immer mit einem gefüllten TMemoryStream.
Und wenn ich wie Michl berichtet 'text/plain' verwende,
dann geht das auch bei mir mit meinem 'TMemoryStream'.
Nur halt als reiner Text ohne die Vormatierungen.

Ansonsten bleibt es leer.

Ich komme also so nicht weiter.
Gruß

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: IpHtmlPanel

Beitrag von theo »

hbr hat geschrieben:Danke, aber
Sorry, ich arbeite mit einem 'TMemoryStream'
welches 2-3 Seiten HTM-Code beinhaltet.

Na und? Das ist doch völlig wumpe, nur umständlicher.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const Dta='<html>aha <i> aha </i> aga</html>';
var
  aMStream: TMemoryStream;
begin
  aMStream:=TMemoryStream.Create;
  aMStream.Write(Dta,Length(Dta));
  aMStream.Position:=0;
  aFormat:=ClipBoard.FindFormatID('text/html');
  if ClipBoard.FindFormatID('text/html') = 0 then
    aFormat:=RegisterClipBoardFormat('text/html');
  ClipBoard.AddFormat(aFormat, aMStream);
  aMStream.Free;
end;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: IpHtmlPanel

Beitrag von Michl »

@theo: Das von Dir geänderte Bsp. liefert den Html-Code zurück. D.h. er wurde ins ClipBoard kopiert (inkl. HTML-Tags). Beim debuggen wird 'text/html' gefunden, sollte ja auch gültig sein! Jetzt ist bei mir ebenfalls das Problem, dass sich dieser Inhalt nirgends einfügen lässt, weder in einem OpenOfficeDokument oder sonstwo. Wenn ich aus FireFox einen Text mit/ohne Bilder kopiere, wird unter Button2 der Text ordentlich im Memo dargestellt, die HTML-Tag nicht - so wie es sein sollte! Irgendwas läuft unter Win7 hier schief!

Edit: Vermutung: Wenn ich mir den ClipBoard-Inhalt einer vom Browser kopierten Seite anschaue, werden HTML-Tags, Objekte etc. jeweils mit einer FormatID versehen. Einträge, wie Text, werden entsprechend gekennzeichnet. Übergebe ich den kompletten HtmlCode als 'text/html' wird dieser wahrscheinlich nicht geparst nach HTML-Tags und Text, somit gibt es für ein Textprogramm auch nichts zum einfügen?!
hbr hat geschrieben:Welche Möglichkeiten habe ich Sonst?
Ich hatte in den letzten Tagen WACEF und fpCEF3 getestet da ging Copy/Paste problemlos -> ist aber für Deine Aufgabe evtl. mit Kanonen auf Spatzen geschossen?!
Zuletzt geändert von Michl am Mi 13. Aug 2014, 15:36, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: IpHtmlPanel

Beitrag von theo »

Michl hat geschrieben:Jetzt ist bei mir ebenfalls das Problem, dass sich dieser Inhalt nirgends einfügen lässt, weder in einem OpenOfficeDokument oder sonstwo.
Unter Linux geht's wie oben geschrieben. Mit Libreoffice und Caligra Words getestet.
Dateianhänge
clipbrdlo.png

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: IpHtmlPanel

Beitrag von Michl »

Hatte eben noch eine Vermutung zuvor hineineditiert...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten