Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 17.05.20 19:58 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Weiters: Muss CF_RICHTEXT als Word oder als UINT (= LongWord) dekalriert werden?
RegisterClipboardFormat liefert einen UINT zurück, von daher ist das auch der passende Typ.

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 17.05.20 20:36 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Weiters: Muss CF_RICHTEXT als Word oder als UINT (= LongWord) dekalriert werden?
RegisterClipboardFormat liefert einen UINT zurück, von daher ist das auch der passende Typ.
Ok, danke!

Ich muss mich korrigieren: Der Fehler tritt, wenn, dann schon an dieser Stelle auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 0 to n-1 do
begin
  aFormats[i] := ClipBoard.Formats[i];  //<- Hier knallts!
  ClipBoard.GetFormat(aFormats[i], aStreams[i]);
end;

Die Fehlermeldung lautet:
Zitat:
Projekt project1 hat Exception-Klasse "External SIGSEV" ausgelöst.

Bei Adresse: 7FF833245544

Wie gesagt, zig Mal funktioniert es, dann 1x nicht. Und auch nicht nur dann, wenn der RTF-formatierte Text schon in der Zwischenablage ist, bevor mein Programm startet, auch das muss ich korrigieren.
Auch ist es egal, wo ich CF_RICHTEXT deklariere, ob im CreateWnd oder im initialization-Abschnitt oder auch gar nicht. Es klappt meistens, aber eben nicht immer.

Das Beste: Wenn ich im Debug-Modus das Programm einfach weiter ausführe, ist die Grafik eingefügt und der Text ist samt Formatierung wieder in der Zwischenablage, so, als sei nichts gewesen!

Wenn ich das Programm alleine, ohne Lazarus, ausführe, kommt die Fehlermeldung:
Zitat:
project1.exe funktioniert nicht mehr. [...]

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 17.05.20 21:46 
Ich denke, ich habe die Ursache des Fehlers gefunden: Es geht (manchmal) schief, wenn versucht wird, auf ein ungültiges ClipBoard-Format zuzugreifen. Das passiert zB., wenn die Zwischenablage RTF-formatierten Text einer alten Microsoft-Word-Version enthält.
Leider kann ich das nicht abfangen, denn eine Funktion ClipBoard.isValidFormat(...) gibt es nicht.
Verwende ich als Quelle hingegen ein aktuelles LibreOffice, tritt der Fehler nicht mehr auf.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Das Beste: Wenn ich im Debug-Modus das Programm einfach weiter ausführe, ist die Grafik eingefügt und der Text ist samt Formatierung wieder in der Zwischenablage, so, als sei nichts gewesen!
Ja, das ist das Beste daran. Ich habe das jetzt so behoben, dass ich daraus eine Funktion gemacht habe, die False zurück gibt, wenn dieser Fehler auftritt, und dabei dennoch weiterarbeitet, denn es klappt ja trotzdem:
ausblenden Delphi-Quelltext
1:
2:
if not ClipBoard.GetFormat(aFormats[i], aStreams[i]) then
  Result := False;
Ob das ratsam ist, kann ich nicht beurteilen, aber, wie gesagt, alles funktioniert dabei ganz normal.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.05.20 00:11 
Interessant wäre bei dem Fehler der Stacktrace. Die Speicheradresse hilft da nicht viel...
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.05.20 09:16 
Ich muss den Code noch verbessern: So, wie er jetzt ist, sind danach alle ClipBoard-Formate im RTF-Format, normaler Text steht dann anderen Anwendungen nicht mehr zur Verfügung.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Interessant wäre bei dem Fehler der Stacktrace. Die Speicheradresse hilft da nicht viel...
Meinst du die Zeile, bei der der Debugger (in einem eigenen Fenster) anhält und diese markiert?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 18.05.20 11:05 
Ja, und dann das Fenster Call Stack (auch Stacktrace genannt) anschauen, um die genaue Ursache (hoffentlich) zu finden.

Aber was willst du überhaupt mit der Sonderbehandlung von CF_RICHTEXT (beim Wiederherstellen der Zwischenablage)?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.05.20 14:03 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Aber was willst du überhaupt mit der Sonderbehandlung von CF_RICHTEXT (beim Wiederherstellen der Zwischenablage)?
Ohne CF_RICHTEXT ist sonst nur der reine Text, ohne RTF-Formatierung, in der Zwischenablage.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 18.05.20 15:22 
Ich meine
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if cpFormat = CF_RICHTEXT then
    for i := Low(aFormats) to High(aFormats) do
    begin
        if aFormats[i] = cpFormat then
           Clipboard.SetFormat(cpFormat, aStreams[i])
    end
else
    ...

Warum du also nur im else-Zweig alle Formate wieder zurückschreibst?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.05.20 17:13 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Warum du also nur im else-Zweig alle Formate wieder zurückschreibst?
Ja, das meinte ich damit, dass ich dann nur noch den RTF-formatierten Text in der Zwischenablage habe. Ich weiss im Moment aber nicht, wie ich herausfinde, wo ich den RTF-formatierten Text zurückschreiben muss.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.05.20 18:00 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ja, und dann das Fenster Call Stack (auch Stacktrace genannt) anschauen, um die genaue Ursache (hoffentlich) zu finden.


Nun, das Assembler-Fenster markiert die Zeile:
00007FF833245544 807a0f05 cmpb $0x5,0xf(%rdx)

Wo finde ich das Fenster Call Stack bzw. Stacktrace?

Was die Wiederherstellung der verschiedenen Formate anlangt, komme ich nicht weiter:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
for i := 0 to n-1 do
begin
  aFormats[i] := ClipBoard.Formats[i];
    if not ClipBoard.GetFormat(aFormats[i], aStreams[i]) then
      Result := False;
//Merke hier, ob das Format CF_RICHEDIT ist (den Code habe ich verworfen, weil es nicht klappte)
end;

// füge die Grafik ein

for i := Low(aFormats) to High(aFormats) do
begin
  if aFormats[i] = CF_RICHEDIT then
    Clipboard.SetFormat(CF_RICHEDIT, aStreams[i])
  else
    ClipBoard.SetFormat(aFormats[i], aStreams[i]);
end;


Funktioniert aber nicht. Es ist dann nur reiner Text in der Zwischenablage.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 18.05.20 18:42 
Müsste im Menü "View -> Debug Windows -> Call stack" sein (laut Internet, da ich Lazarus nicht kenne).

Ich verstehe immer noch nicht, was du genau erreichen möchtest.
Fehlen dir noch Grundkenntnisse beim Programmieren? Die Sonderabfrage auf CF_RICHTEXT bei deiner unteren Schleife ist doch komplett überflüssig (da die Schleife doch sowieso über alle gespeicherten Formate iteriert).

Ich kann dir das Tool Free Clipboard Viewer empfehlen, das zeigt alle zurzeit enthaltenen Formate an (habe ich gestern auch für ein Programm bei mir bzgl. HTML-Format benötigt).
Es liegt ja an dem jeweiligen Programm, welches der aktuell enthaltenen Formate es benutzt (ein reiner Texteditor nutzt nur das Text-Format, wenn es denn enthalten ist und ignoriert alle anderen Formate - und andere Programme überprüfen dann die Formate in jeweiliger Priorität und das Text-Format dann meistens als letztes).
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.05.20 19:25 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Müsste im Menü "View -> Debug Windows -> Call stack" sein (laut Internet, da ich Lazarus nicht kenne).
Ok, das ist dann also "Aufrufstack". Dort steht:
Zitat:
Index Position Zeile Funktion
0 :7FF833245544 - ??

Ich muss das jedesmal abtippen, da kopieren nicht funktioniert, weil die Zwischenablage in diesen Momenten gesperrt ist.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ich verstehe immer noch nicht, was du genau erreichen möchtest.
Ich möchte ine Grafik in ein TRichMemo einfügen. Die Methode, die TRichMemo mitbringt, ist unbrauchbar, weil man damit zwar Grafiken einfügen kann, diese aber nicht gespeichert werden, weil die entsprechenden Daten nicht in die Datei geschrieben werden. Aber per ClipBoard funktioniert es. Also dachte ich, sichere den Inhalt der Zwischenablage, kopiere die Grafik hinein, füge die Grafik ins RichMemo ein, stelle den Inhalt der Zwischenablage wieder her.
Funktioniert prinzipiell. Ich kann aber nicht erreichen, dass bei RTF-Daten die beiden Formate CF_RICHEDIT und CF_TEXT erhalten bleiben. Entweder habe ich ausschliesslich CF_RICHEDIT oder ausschliesslich CF_TEXT, je nachdem, wie ich den Code abändere (s. den Code-Schnipsel).

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Fehlen dir noch Grundkenntnisse beim Programmieren? Die Sonderabfrage auf CF_RICHTEXT bei deiner unteren Schleife ist doch komplett überflüssig (da die Schleife doch sowieso über alle gespeicherten Formate iteriert).
Ja, das sollte man meinen. Es ist aber nicht so. Meine Grundkenntnisse beim Programmieren sind durchaus ausreichend, zu erkennen, dass das überflüssig ist - normalerweise. Hier aber nicht, denn wenn ich den Code so abändere: ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
(*      if cpFormat = CF_RICHTEXT then
        for i := Low(aFormats) to High(aFormats) do
        begin
          if aFormats[i] = cpFormat then
            Clipboard.SetFormat(cpFormat, aStreams[i]);
        end
      else
*)
        for i := Low(aFormats) to High(aFormats) do
          ClipBoard.SetFormat(aFormats[i], aStreams[i]);  {Andere Formate: Text, Grafiken usw.}

... schreibe ich natürlich alles in die Zwischenablage zurück, aber es ist danach nur reiner Text in der Zwischenablage, die RTF-Formatierung geht verloren.

Leider kann man das alles mit Delphi nicht nachstellen, da gibt es zB. kein ClipBoard.GetFormat.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.05.20 20:56 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Müsste im Menü "View -> Debug Windows -> Call stack" sein (laut Internet, da ich Lazarus nicht kenne).
Ok, das ist dann also "Aufrufstack". Dort steht:
Zitat:
Index Position Zeile Funktion
0 :7FF833245544 - ??

Ich muss das jedesmal abtippen, da kopieren nicht funktioniert, weil die Zwischenablage in diesen Momenten gesperrt ist.
Ein Screenshot ist auch möglich. ;-)
Aber es gibt auch einen Knopf für das Kopieren:

LazarusStacktrace
Einloggen, um Attachments anzusehen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 08:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ein Screenshot ist auch möglich. ;-)
Aber es gibt auch einen Knopf für das Kopieren:
Da gibt es einen Button "Alles kopieren" (oder so, in diesem Sinne, hab ich jetzt nicht vor mir). Das funktionierte nicht.

Es bleibt aber die Frage stehen, warum ich das RTF-Format nicht richtig hin bekomme! Es wird jedenfalls nicht automatisch erkannt, automatisch wird nur CF_TEXT, CF_BITMAP usw. erkannt.
Da gibt es noch eine weitere Möglichkeit: Ein temporäres TRichMemo. Unelegant, zugegeben, wird aber vermutlich funktionieren. Kann ich ja mal versuchen.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 19.05.20 14:25 
Wie überprüfst du denn, welche Formate alles in der Zwischenablage sind?

Wenn du also zweimal deinen Code aufrufst (mit Auslesen und zurückschreiben aller Formate), dann fehlt plötzlich das RTF-Format?

Was mich auch noch wundert, ist, daß du extra noch RichEdit.CF_RTF registrieren mußt, denn das ist ja ein Standard-Format (s.a. "Standard Clipboard Formats"-Liste im oben schon verlinkten FreeClipboardViewer).
Edit: OK, in Windows Clipboard Formats steht, daß es nur ein "Common Application Clipboard Format" ist und kein "Standard Clipboard Format".

Aber entspricht denn RichEdit.CF_RTF = 'Rich Text Format' (bzw. 'text/richtext')?
Edit: Auch das konnte ich jetzt in How to reliably detect RICHTEXT format on clipboard? nachlesen.

Du kannst auch mal mittels Clipboard.SupportedFormats(list) dir eine Liste aller vom System unterstützten Formate zurückliefern lassen (ohne vorher die extra Registrierung durchzuführen), s.a. View the clipboard contents.

Und bzgl.
galagher hat folgendes geschrieben:
Leider kann man das alles mit Delphi nicht nachstellen, da gibt es zB. kein ClipBoard.GetFormat.

In der VCL gibt es die Methoden TPicture.LoadFromClipboardFormat und TPicture.SaveToClipboardFormat, da diese hauptsächlich für die verschiedenen Bildformate benutzt werden. Andererseits sind dies auch nur Wrapper für die WinAPI-Funktionen, s. Using the Clipboard:
- Copying Information to the Clipboard
- Pasting Information from the Clipboard
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 17:08 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Wie überprüfst du denn, welche Formate alles in der Zwischenablage sind?
Gar nicht, ich sichere zuerst alle Formate und stelle sie danach wieder her. Das funktioniert aber mit dem RTF-Format nicht. Da bleibt nur Plain-Text übrig. Ansosnten funktioniert das sehr wohl, mit normalem Text, mit Icons und mit Bitmaps.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du also zweimal deinen Code aufrufst (mit Auslesen und zurückschreiben aller Formate), dann fehlt plötzlich das RTF-Format?
Nein, nur wenn ich alle Formate zurückschreibe, ohne das RTF-Format extra zu berücksichtigen. Es wird offenbar nicht erkannt.
Auch, wenn ich mir die Position im Array merke und das RTF-Format (den formatierten Text) explizit an diese Position zurückschreibe, klappt es nicht. Da passt offenbar der Wert von "i" bei aStream[i] nicht. Oder was weiss ich. :nixweiss: Es geht eben nicht.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Was mich auch noch wundert, ist, daß du extra noch RichEdit.CF_RTF registrieren mußt, denn das ist ja ein Standard-Format
Wie sonst? CF_RTF ist ja ein String, kein Format. Ich muss es also registrieren.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Aber entspricht denn RichEdit.CF_RTF = 'Rich Text Format' (bzw. 'text/richtext')?
Edit: Auch das konnte ich jetzt in How to reliably detect RICHTEXT format on clipboard? nachlesen.
Ja, es entspricht! Das habe ich mir von eben dieser Seite abgeschaut.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst auch mal mittels Clipboard.SupportedFormats(list) dir eine Liste aller vom System unterstützten Formate zurückliefern lassen (ohne vorher die extra Registrierung durchzuführen),
Da ist 'Rich Text Format' bzw. 'text/richtext' nicht dabei.

Wird vor dem Einfügen der Grafik, also beim Sichern der Formate der Zwischanablage, das RTF-Format noch erkannt (Clipboard.HasFormat(CF_RICHTEXT liefert True zurück), kann ich es nach dem Einfügen der Grafik, also bei Wiederherstellen der Formate der Zwischanablage, nicht mehr wiederherstellen. Der reine Text ist ja da, aber jede RTF-Formatierung ist verloren gegangen.

Wie erwartet, funktioniert es aber mit einem temporären TRichMemo, in das ich den RTF-formatierten Inhalt einfüge und hinterher von dort wieder in die Zwischanablage zurück kopiere. Aber irgendwie ist das doch nicht besonders schön. Klappt und kann man zur Not auch belassen, aber der direkte Weg über die Formate wäre eleganter.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 19.05.20 18:22 
Ich frage noch mal: Wie überprüfst du denn, welche Formate alles in der Zwischenablage sind?
Damit meine ich nicht codetechnisch, sondern verwendest du ein externes Programm oder woher weißt du, daß das Richtext-Format nicht mehr zurückgeschrieben wird?

Darum habe ich dir ja auch den Link zu dem FreeClipboardViewer gegeben.

Und mit welchem Programm erzeugst du denn überhaupt den Richtext in der Zwischenablage?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 18:44 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Ich frage noch mal: Wie überprüfst du denn, welche Formate alles in der Zwischenablage sind?
Damit meine ich nicht codetechnisch, sondern verwendest du ein externes Programm oder woher weißt du, daß das Richtext-Format nicht mehr zurückgeschrieben wird?
Ganz einfach: Indem ich den Text, der ja das RTF-Format sein müsste, wenn man alles korrekt wieder zurückschreibt, ins RichMemo einfüge. Da wird aber eben nur Text ohne Formatierung eingefügt.

Ich habe dabei jetzt den FreeClipboardViewer eingesetzt: das RTF-Format ist hinterher tatsächlich nicht mehr vorhanden, sondern (u. a.) nur noch der reine Text. Also entweder ist die Wiederherstellung nicht korrekt, aber was kann bei dieser for-Schleife falsch sein? Oder das RTF-Format wird in aStreams[i] nicht mit gesichert. Das wird's sein, denke ich.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und mit welchem Programm erzeugst du denn überhaupt den Richtext in der Zwischenablage?
Einerseits mit dem RichMemo selbst, andererseits mit Microsoft Word und mit LibreOffice, den RTF-Text kopiere ich dann in die Zwischenablage. Immer ist beim Zurückschreiben das RTF-Format weg, wie man mit FreeClipboardViewer sieht, obwohl es vorher vorhanden war.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 19.05.20 19:07 
Wenn ich den Kommentar in Clipboard.pp
Zitat:
SetFormat
Clears the clipboard and adds the data.

richtig verstehe, so kann mit dieser Funktion immer nur genau 1 Format gespeichert werden...

Probiere mal stattdessen AddFormat!
Zitat:
AddFormat:
Use these functions to add data to the supported formats.

(und vor der Schleife noch Clear aufrufen)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 20:54 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Probiere mal stattdessen AddFormat!
Es funktioniert! :dance: Jetzt passt alles!

Nun tritt aber der SIGSEGV-Fehler wieder auf, wenn ich RTF-Text aus dem alten Word verwende. Er tritt auf beim Sichern der Formate in der Schleife:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 0 to n-1 do
begin
  aFormats[i] := ClipBoard.Formats[i];  //<- Hier!
  //...
end;

Nicht schon beim 1.Durchlauf, sondern beim 8. Den Fehler kann ich aber nicht abfangen.

Klar, jetzt ist der Code besser, übersichlicher und sauberer als mit dem leidigen temporären TRichEdit. Aber nun habe ich das Problem wieder, dass der mit Daten alter Programme (ca. 20 Jahre) nicht kann. Ok, sollte man ja ohnehin nicht mehr verwenden, aber es geht ums Prinzip: Warum?

Vielleicht findest du ja die Ursache, oder man kann noch etwas verbessern. Hier die ganze Funktion:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
function TCustomRichMemo.InsertGraphic(const aPicture: TPicture): Boolean;
var
  i, n: Integer;
  aFormats: array of TClipBoardFormat;
  aStreams: array of TMemoryStream;
begin
  Result := True;

  try  {except}
{--------------------------- Zwischenablage sichern ---------------------------}
    n := ClipBoard.FormatCount;
    SetLength(aFormats, n);
    SetLength(aStreams, n);

    {Stream-Array anlegen für die ClipBoard-Formate}
    for i := 0 to n-1 do
      aStreams[i] := TMemoryStream.Create;

    try  {finally}
      {ClipBoard-Formate sichern}
      {Array aFormats (=die ClipBoard-Formate) befüllen und Daten in das Array aStreams schreiben}
      for i := 0 to n-1 do
      begin
        aFormats[i] := ClipBoard.Formats[i];
        Result := ClipBoard.GetFormat(aFormats[i], aStreams[i]);
      end;


{------------------------------ Grafik einfügen -------------------------------}
      {Grafik zuweisen und ...}
      ClipBoard.Assign(aPicture.Bitmap);
      PasteFromClipboard;  {... einfügen}


{---------------------- Zwischenablage wiederherstellen -----------------------}
      {ClipBoard-Formate wiederherstellen}
      ClipBoard.Clear;
      for i := Low(aFormats) to High(aFormats) do
        ClipBoard.AddFormat(aFormats[i], aStreams[i]);

    finally
      for i := High(aStreams) downto Low(aStreams) do
        aStreams[i].Free;
    end;

  except
    Result := False;
    ClipBoard.Clear;
  end;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!