![]() |
RichEdit PasteFromClipboard OS Error 50
Hi,
ich möchte gerne einen selektierten Text eines Richedit in ein anderes RichEdit einfügen. Simpelster Weg erschien mir Copy&Paste.
Delphi-Quellcode:
Leider erhalte ich in der Zeile PasteFromClipboard immer OS Error 50 "Die Anforderung wird nicht unterstützt".
DestRTF.CopyToClipboard;
redt_formattext.PasteFromClipboard; ShowMessage(SysErrorMessage(GetLastError)); In einer früheren D7-Anwendung habe ich das mal so gemacht. Funktioniert wurderbar, allerdings was das damals ein TJvRichEdit. Jetzt will ich ein TRichEdit nehmen. Unter 10.1 will das nicht funktionieren. Hat jemand eine Idee warum? |
AW: RichEdit PasteFromClipboard OS Error 50
Erstmal, GetLastError prüft man immer nur, wenn man weiß, dass es "soeben" einen Fehler gab, in dem WinAPI-Aufruf davor.
Du prüfst aber garnicht, ob es einen Fehler gab. Der "Fehler" 5 kann also von irgendeiner anderen API gekommen sein, irgendwann vorher. |
AW: RichEdit PasteFromClipboard OS Error 50
Okay,
aber so
Delphi-Quellcode:
wirft er mir obige Fehlermeldung ( 50 ) eben nur beim Paste raus. Zusätzlich höre ich das an dem Ping. Davor ist GetLastError = 0.
DestRTF.CopyToClipboard;
if GetLastError<>ERROR_SUCCESS then ShowMessage('copyTo: '+SysErrorMessage(GetLastError)); redt_formattext.PasteFromClipboard; if GetLastError<>ERROR_SUCCESS then ShowMessage('pasteFrom: '+SysErrorMessage(GetLastError)); |
AW: RichEdit PasteFromClipboard OS Error 50
Nochmal, GetLastError gibt nur den letzten Fehlercode an, aber ob es einen Fehler gab und somit in GetLastError überhaupt etwas drin steht, dass muß man anders rüfen!
Delphi-Quellcode:
Hmmm, Problem ist nur, dass
//RichEdit1.PasteFromClipboard;
if SendMessage(RichEdit1.Handle, WM_PASTE, 0, 0) <> ... then RaiseLastOSError; //RaiseLastWin32Error; ![]()
Delphi-Quellcode:
Aber ob hier überhaupt ein Fehlercode gesetzt wird und ob der Wert überhaupt von Bedeutung ist, dass ist 'ne andere Geschichte.
SetLastError(NO_ERROR);
RichEdit1.PasteFromClipboard; //SendMessage(RichEdit1.Handle, WM_PASTE, 0, 0); if GetLastError <> NO_ERROR then RaiseLastOSError; //RaiseLastWin32Error; Laut Dokumentation nicht. PS: Eventuell muss die Komponente den Eingabefokus besitzen, um das Copy/Paste verarbeiten zu können. :stupid: |
AW: RichEdit PasteFromClipboard OS Error 50
Ich liebe Programme die mir meine Zwischenablage überschreiben :love:
|
AW: RichEdit PasteFromClipboard OS Error 50
Zitat:
Das gab mir den Anstoß nach einer anderen Möglichkeit zu suchen. Fündig geworden bin ich hier: ![]() |
AW: RichEdit PasteFromClipboard OS Error 50
Zitat:
Ist es also eine Frage der Information(en), ob die Zwischenablage überschrieben wird, oder kann es nur eine geben? Gruß K-H |
AW: RichEdit PasteFromClipboard OS Error 50
Es gibt nur eine Zwischenablage, aber man kann gleichzeitig mehrere Formate des "selben" Inhaltes darin ablegen.
z.B. beim Kopieren von RTF * den RTF-Text * den unformatierten TEXT als Unicode * den unformatierten TEXT als ANSI Und beim Einfügen kann sich dann jedes Programm das format nehmen, welches es versteht. ein RichTextEditor oder Word nimmt sich das RTF ein TextEditor nimmt sich den Text, da es den RTF nicht versteht und ein uralter Texteditor nimmt sich den ANSI-Text und ein Bild-Editor (Paint) nimmt nichts, da es garnichts kappiert. Würde man nur das RTF in die Zwischenablage legen und die unformatierten formate weg lassen, dann könnte man den kopierten Text nicht in einem Text-Editor einfügen. Wenn man in Word einen Text kopiert, dann legt Word zusätzlich noch das in seinem eigenem Format mit ab. |
AW: RichEdit PasteFromClipboard OS Error 50
Da ich das ja nun anders gelöst habe, bekomme ich beim Einfügen ein anderes Problem.
Hier mal zur Übersicht die Funktionen, die ich aus o.G. thead übernommen habe:
Delphi-Quellcode:
ich hole mir den selektierten Text mittels:
type
TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): DWORD; stdcall; TEditStream = record dwCookie: Longint; dwError: Longint; pfnCallback: TEditStreamCallBack; end; function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): DWORD; Stdcall; var theStream: TStream; dataAvail: LongInt; begin theStream := TStream(dwCookie); with theStream do begin dataAvail := Size - Position; Result := 0; {assume everything is ok} if dataAvail <= cb then begin pcb := Read(pbBuff^, dataAvail); if pcb <> dataAvail then {couldn't read req. amount of bytes} result := UInt(E_FAIL); end else begin pcb := Read(pbBuff^, cb); if pcb <> cb then result := UInt(E_FAIL); end; end; end; function EditStreamOutCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): DWORD; stdcall; var theStream: TStream; begin theStream := TStream(dwCookie); with theStream do begin if cb > 0 then pcb := Write(pbBuff^, cb); Result := 0; end; end; procedure GetRTFSelection( aRichEdit: TRichEdit; intoStream: TStream ); var editstream: TEditStream; begin with editstream do begin dwCookie:= Longint(intoStream); dwError:= 0; pfnCallback:= EditStreamOutCallBack; end; aRichedit.Perform( EM_STREAMOUT, SF_RTF or SFF_SELECTION, longint(@editstream)); end; procedure PutRTFSelection( aRichEdit: TRichEdit; sourceStream: TStream ); var editstream: TEditStream; begin with editstream do begin dwCookie:= Longint(sourceStream); dwError:= 0; pfnCallback:= EditStreamInCallBack; end; aRichedit.Perform( EM_STREAMIN, SF_RTF or SFF_SELECTION, longint(@editstream)); end; procedure InsertRTF(aRichEdit:TRichEdit; s : String); var aMemStream: TMemoryStream; begin if Length(s) > 0 then begin aMemStream := TMemoryStream.Create; try aMemStream.Write(s[1],length(s)); aMemStream.Position := 0; PutRTFSelection( aRichEdit, aMemStream ); finally aMemStream.Free; end; end; end; procedure CopyRTF(aSource, aDest:TRichEdit); var aMemStream: TMemoryStream; begin aMemStream := TMemoryStream.Create; try GetRTFSelection(aSource, aMemStream ); aMemStream.Position := 0; PutRTFSelection(aDest, aMemStream ); finally aMemStream.Free; end; end;
Delphi-Quellcode:
Speichere mir den in einer DB. Der Text enthält kein abschließenden Zeilenvorschub. (Den will ich auch gar nicht).
CopyRTF(DestRTF, frmTT.redt_formattext);
// Den kann man jetzt hier noch Bearbeiten frmTT.redt_formattext.Lines.SaveToStream(TT.FormatText); //TT.FormatText ist TMemoryStream Später lade ich mir dann das ganze wieder in den MemoryStream und will das in ein RichText an Cursorposition einfügen:
Delphi-Quellcode:
Problem ist jetzt, dass dann hinter TT.FormatText ein Zeilenvorschub mit eingefügt wird.
PutRTFSelection(DestRTF, TT.FormatText);
Aus der DB wieder eingelesen wird der Stream korrekt, das habe ich geprüft. Also muss innerhalb der Procedure PutRTFSelection dieses irgendwie angefügt werden. Leider ist mein Verständnis für den obigen Code nicht so groß, dass ich den Fehler so finde, und bräuchte diesbezüglich eure Unterstützung. Danke. |
AW: RichEdit PasteFromClipboard OS Error 50
Zitat:
Quelle (u.a.): ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz