Clipboard

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
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)

Clipboard

Beitrag von hbr »

Hallo,
Inhalte, die im Windows Program in einem html Panel stehen, werden über folgende Prozedur in die Zwischenablage kopiert, was unter Windows in Word oder swriter funktioniert.

Code: Alles auswählen

procedure TInfos.ZWablageClick(Sender: TObject);
const
  HtmlFormat='HTML format';
var
  aFormat: TClipBoardFormat;
  
Begin
    MyHtmlText:='Version:0.9'+LineEnding+
   'StartHTML:00000000'+LineEnding+
   'EndHTML:00000000'+LineEnding+ZString;

   MyHtmlText:=StringReplace(MyHtmlText,
   'StartHTML:00000087',
   'StartHTML:'+format('%.8d',[Pos('<html>', MyHtmlText) - 1]),  []);
   MyHtmlText:=StringReplace(MyHtmlText,
   'EndHTML:00000000',
   'EndHTML:'+format('%.8d',[Length(MyHtmlText)]),  []);
  
     Clipboard.Clear;
     aFormat:=RegisterClipBoardFormat(HtmlFormat);
     ClipBoard.AddFormat(aFormat, MyHtmlText[1], Length(MyHtmlText));
end;
Das Windows Programm läuft in Linux Wine.
Beim Versuch es in einem geöffneten "linux swriter Programm" die Zwischenablage zu übergeben,
gibt es eine Fehlermeldung:
"Gewünschtes Zwischenablage Format steht nicht zur Verfügung“
Beim Versuch es in swriter über "Inhalte einfügen" zu machen, kommt die Meldung:
Quelle: Unbekannte Quelle
"HyperText Markup Languarge(HTML)"

was könnte das sein?

wp_xyz
Beiträge: 5192
Registriert: Fr 8. Apr 2011, 09:01

Re: Clipboard

Beitrag von wp_xyz »

Hast du schon mal die TClipboard-Methode SetAsHtml probiert?

Code: Alles auswählen

type
  TClipboard = Class(TPersistent)
    ....
    procedure SetAsHtml(Html: String);
    procedure SetAsHtml(Html: String; const PlainText: String);
Wenn du den entsprechenden Code studierst, findest du auch diese Stelle:

Code: Alles auswählen

const
  HTML_FORMAT = {$IFDEF WINDOWS}'HTML Format'{$ELSE}'text/html'{$ENDIF};
das heißt, du musst in deiner Prozedur unter Linux den Clipboard-Registrierungsstring ändern. Außerdem scheinen die "StartHTML"/"EndHTML"/etc.-Strings nur für Windows relevant zu sein.

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: Clipboard

Beitrag von hbr »

Super, Danke es Funktioniert,
Allerdings benötigt das Unix Program SWriter nun auch den absoluten Unix Pfad zum anzeigen von Bildern im Text.
Gibt es eine Möglichkeit Text und Bitmaps aus einem html Panel gleichermassen in die Zwischenablage zu speichern? Also nicht als html?

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

Re: Clipboard

Beitrag von theo »

Man kann in HTML Bilder base64 encodiert in die Datei einbetten. Das geht z.B. so:

<img src="data:image/png;base64,BILDDATEN">

Testweise kannst du Bilder hier konvertieren:
https://www.base64-image.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: Clipboard

Beitrag von hbr »

theo hat geschrieben: Mi 17. Jul 2024, 09:46 Man kann in HTML Bilder base64 encodiert in die Datei einbetten. Das geht z.B. so:

<img src="data:image/png;base64,BILDDATEN">

Testweise kannst du Bilder hier konvertieren:
https://www.base64-image.de/
Danke,
Interesanter Ansatz, fragt sich nur ob das htmlpanel diese darstellen kann.
werde es einmal testen.

___________________

Schade, im IHtml-Panel funktioniert es leider nicht.

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Clipboard

Beitrag von paweld »

@hbr: Es funktioniert, nur müssen Sie es selbst im OnGetImageX Ereignis behandeln. Im Anhang finden Sie ein überarbeitetes Beispiel von HtmlFileExplorer aus dem IPro-Paket.
Dateianhänge
htmfileexplorer1.zip
(56.89 KiB) 64-mal heruntergeladen
Grüße / Pozdrawiam
paweld

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: Clipboard

Beitrag von hbr »

paweld hat geschrieben: Fr 19. Jul 2024, 07:27 @hbr: Es funktioniert, nur müssen Sie es selbst im OnGetImageX Ereignis behandeln. Im Anhang finden Sie ein überarbeitetes Beispiel von HtmlFileExplorer aus dem IPro-Paket.
Super, vielen Dank, Genial.
Was mich jedoch sehr Stutzig macht, ist die Meldung bei normalen Bildern… Spionage?
LZ DIE v3.5 woher kommt das denn?
Dieses wird angezeigt, wenn das html Bilder als Pfad, den absoluten Pfad bereitstellt.
Z.B. <img src="file:///D:/Arbeiten/Lazarus_Programme/pics/kabb_p.png"
Sehr seltsam.


spionage.jpg
spionage.jpg (95.97 KiB) 1779 mal betrachtet

wp_xyz
Beiträge: 5192
Registriert: Fr 8. Apr 2011, 09:01

Re: Clipboard

Beitrag von wp_xyz »

Das scheint von Windows zu kommen, den der Datei-öffnen-Dialog stammt aus dem Betriebssystem. Bei mir ist das nicht so, bei einer angewählten html-Datei wird "Es ist keine Vorschau verfügbar" angezeigt. Vielleicht hast du irgendwo ein Häkchen gesetzt, das nicht gesetzt sein sollte - keine Ahnung, welches das ist.

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: Clipboard

Beitrag von hbr »

wp_xyz hat geschrieben: Fr 19. Jul 2024, 17:55 Das scheint von Windows zu kommen, den der Datei-öffnen-Dialog stammt aus dem Betriebssystem. Bei mir ist das nicht so, bei einer angewählten html-Datei wird "Es ist keine Vorschau verfügbar" angezeigt. Vielleicht hast du irgendwo ein Häkchen gesetzt, das nicht gesetzt sein sollte - keine Ahnung, welches das ist.
Danke für die Info.
in dem Beispiel funktioniert jetzt die <img src="data:image/png;base64, Variante, aber die File Variante funktioniert nicht mehr.
<img src="file:///D:/.... werden nicht mehr angezeigt. Fehtlt estwas im htmfileexplorer1.exe?

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Clipboard

Beitrag von paweld »

Ändern Sie die HTMLGetImageX-Prozedur wie folgt

Code: Alles auswählen

procedure TFHtmFileExp1.HTMLGetImageX(Sender: TIpHtmlNode; const URL: String; var Picture: TPicture);
var
  PicCreated: Boolean;
  FN, nURL, s: String;
  imgs: TStringStream;
begin
  PicCreated := False;
  FN := '';
  imgs := nil;
  try
    //if inlined image
    if pos('data:image/', URL) = 1 then
    begin
      //then decode image to stream
      s := Copy(URL, pos(';base64,', URL) + 8);
      imgs := TStringStream.Create(DecodeStringBase64(s));
      imgs.Position := 0;
    end
    else
    begin
      //else build file name
      if PathChanged then
        FN := Path
      else
        FN := ExtractFilePath(SL[CurrPos]);
      if Pos('\', FN) <> 0 then
        nURL := NetToDOSPath(URL)
      else
        nURL := URL;
      //check that the file path contains the prefix file://
      if pos('file://', nURL) + pos('file:\\', nURL) = 1 then
      begin
        FN := Copy(nURL, 8);
        //and that the path is absolute
        while (pos(':\', FN) + pos(':/', FN) > 0) and ((FN[1] = '/') or (FN[1] = '\')) do
          Delete(FN, 1, 1);
      end;
      //if path isn't absolute
      if pos(':\', FN) + pos(':/', FN) = 0 then
        FN := Concat(FN, nURL);
      if not FileExistsUTF8(FN) then
        FN := '';
    end;
    if (FN <> '') or (imgs <> nil) then //if file exists or image is inlined (in stream)
    begin
      if Picture = nil then
      begin
        Picture := TPicture.Create;
        PicCreated := True;
      end;
      if FN <> '' then
        Picture.LoadFromFile(FN)
      else
        Picture.LoadFromStream(imgs);
    end;
  except
    if PicCreated then
      Picture.Free;
    Picture := nil;
  end;
  if imgs <> nil then
    imgs.Free;
end {HTMLGetImageX};
Die oben beschriebene Änderung führt zu Problemen, wenn der Speicherort des Bildes ein Netzwerkpfad ist.
Grüße / Pozdrawiam
paweld

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: Clipboard

Beitrag von hbr »

theo hat geschrieben: Mi 17. Jul 2024, 09:46 Man kann in HTML Bilder base64 encodiert in die Datei einbetten. Das geht z.B. so:

<img src="data:image/png;base64,BILDDATEN">

Testweise kannst du Bilder hier konvertieren:
https://www.base64-image.de/
Hallo,
ich wandele Bilder mit folgender Funktion um.

Code: Alles auswählen

function StreamToBase64(const AStream: TMemoryStream; out Base64: String): Boolean;
var
Str: String;
begin
Result := False;
    if AStream.Size = 0 then
    Exit;
     AStream.Position := 0;
    try
     SetLength(Str, AStream.Size div SizeOf(Char));
     AStream.ReadBuffer(Pointer(Str)^, AStream.Size div SizeOf(Char));
     Base64 := EncodeStringBase64(Str);
     Result := True;
    except
     on E: Exception do
     ShowMessage(E.Message);
    end;
end;  

Klappt auch ganz gut,
bis auf Animierte .gif Bilder.
Diese bestehen ja aus mehreren Einzel-Bildern.
Das Ergebnis ist lediglich das erste Bild.

Was muss hier getan werden, damit das Komplette .gif umgewandelt wird?

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

Re: Clipboard

Beitrag von theo »

Das ergibt so keinen Sinn.
Den Base64 Encoder interessiert der Inhalt der Datei/Streams nicht. Er hat keine Ahnung davon.

ArchChem
Beiträge: 105
Registriert: Mo 11. Jul 2022, 10:41

Re: Clipboard

Beitrag von ArchChem »

hbr hat geschrieben: Mi 24. Jul 2024, 13:57 Klappt auch ganz gut,
bis auf Animierte .gif Bilder.
Diese bestehen ja aus mehreren Einzel-Bildern.
Das Ergebnis ist lediglich das erste Bild.

Was muss hier getan werden, damit das Komplette .gif umgewandelt wird?
Wie Theo schon korrekterweise gesagt hat, ist Base64 Datentyp-agnostisch. Es interessiert sich nicht dafür, welches Dateiformat es repräsentiert.

Das heißt, der Fehler könnte an zwei anderen Stellen liegen:
  • Dem Import des Gifs in Lazarus
  • Dem Einbinden des Gifs im HTML-Dokument.

Antworten