AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Text in ein DBRichEdit einfügen per SendMessage()
Thema durchsuchen
Ansicht
Themen-Optionen

Text in ein DBRichEdit einfügen per SendMessage()

Offene Frage von "himitsu"
Ein Thema von juergen · begonnen am 30. Jan 2021 · letzter Beitrag vom 6. Feb 2021
Antwort Antwort
jziersch

Registriert seit: 9. Okt 2003
Ort: München
258 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 31. Jan 2021, 10:58
Eine Möglichkeit wäre noch
WM_PASTE
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 31. Jan 2021, 11:51
WM_COPYDATA
Aber keine gewähr ob die andere Anwendung diese Message behandelt.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 31. Jan 2021, 20:13
Es liegt an der Fremdanwendung. Bei anderen Anwendungen funktioniert es. Da kann man wohl nichts machen.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 1. Feb 2021, 06:35
Hallo,
Zitat:
DBRichEdit und Fremdanwendung.
Woher weisst Du., dass es ein DBRichEdit ist?

Zitat:
Mit Notepad z.B. funktioniert es.
Dein Code trägt in Notepad was ein?

Klappt es denn über die Windows-Zwischenablage?
Dann wäre das obige WM_PASTE eine Überlegung wert.
Du kopierst deine Daten in die Zwischenablage und schickst dem Fenster ein WM_PASTE.
Heiko

Geändert von hoika ( 1. Feb 2021 um 06:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 1. Feb 2021, 07:41
Gute Morgen,
über WinSpy kann ich sehen welches Control es ist. Allerdings ist es kein Standardcontrol von Delphi, sondern ein abgeleitetes Control von DBRichEdit. (die Fremdanwendung ist auch in Delphi geschrieben)
Die Zwischenablage wollte ich nicht zerstören, da das Ganze recht häufig angewendet werden soll. Im Prinzip sollte es ein Ersatz für PhraseExpress werden. Also pro globalem Hotkey einen bestimmten Textbaustein am Mauscursor einfügen.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#6

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 1. Feb 2021, 08:02
Notepad ist ein Memo. (Wordpad ist das RichEdit)

WM_KEYDOWN alleine: Wenn man eine Taste drückt, dann muß man sie auch wieder loslassen!!!

WM_CHAR alleine reicht nicht immer aus.
Eine Tastendruck besteht aus einem/mehreren WM_KEYDOWN, einem WM_CHAR und einem/mehreren WM_KEYUP.
Rate mal, warum es mehrere Versuche von SndKey/SendKey/... gibt.



Tipp: EM_REPLACESEL (TCustomComboBox.SetSelText)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Feb 2021 um 08:07 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#7

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 1. Feb 2021, 16:49
Hmm...

Gute Morgen,
über WinSpy kann ich sehen welches Control es ist. Allerdings ist es kein Standardcontrol von Delphi, sondern ein abgeleitetes Control von DBRichEdit. (die Fremdanwendung ist auch in Delphi geschrieben)
Die Zwischenablage wollte ich nicht zerstören, da das Ganze recht häufig angewendet werden soll. Im Prinzip sollte es ein Ersatz für PhraseExpress werden. Also pro globalem Hotkey einen bestimmten Textbaustein am Mauscursor einfügen.


wie in diesem Tread aus 2018:

https://www.delphipraxis.net/1419689-post33.html

Das Testtool macht etwas ähnliches..

Es wartet auf einen (Hot-) Key und schickt einen Text als KeyEvent.

Musst jetzt nur eigenen Keys definieren und statt des Memos von Dir vorgegebene Texte schicken.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 1. Feb 2021, 18:40
Hallo Holger,
vielen Dank, lieb gemeint. U. a. hatte ich es auch so probiert wie in deinem Source. Aber es funktioniert einfach nicht.
Es muss an der Fremd-Anwendung liegen.
Ich habe zig Varianten durch probiert und es klappt einfach nicht. Mit anderen Anwendungen hatte ich kein Problem. Das Handle ist auch immer korrekt, das DBRichEdit ist im Editmodus, es wird aber kein Text übernommen.
WinSpy zeigt mir auch an, dass es wohl eine Midi-Anwendung ist. Ob es damit was zu tun haben könnte? Ich bin da echt ratlos.
Lt. Debugger wird alles korrekt ausgeführt.

@himitsu,
leider war mein Code-Ausschnitt unvollständig. Ich hatte das alles ausprobiert, auch mit WM_KEYUP. In Zukunft muss ich da etwas genauer den Code-Ausschnitt aufbereiten.

Was meintest du mit
Zitat:
Rate mal, warum es mehrere Versuche von SndKey/SendKey/... gibt.
Angehängte Grafiken
Dateityp: jpg WinSpy-Ermittlung der Handle-ID.jpg (45,0 KB, 10x aufgerufen)
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 5. Feb 2021, 21:48
Hallo zusammen,
also, ich weiß inzwischen, dass es nicht so einfach ist einen Text an ein RichEdit zu senden.
Ich taste mich nun so langsam ran, erst mal mit dem RichEdit von WordPad.
Das Handle zu ermitteln wenn Wordpad im Vordergrund ist, ist kein Problem.
Ich habe folgenden Source der prinzipiell einen Text an ein RichEdit innerhalb meiner eigenen Anwendung sendet:

Delphi-Quellcode:
// Source von Dr. Peter Below
TYPE
  TMyRichEdit = TRichEdit;

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 := 0; // E_FAIL;
    END
    ELSE BEGIN
      pcb := READ( pbBuff^, cb );
      IF pcb <> cb THEN
          result := 0; // 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;
Ich weiß nun nicht, wie ich es hinbekomme, dass ich einen Text an ein RichEdit einer Fremd-Anwendung (Wordpad) gesendet bekomme.
Die Frage ist, wie ich das Control in der Fremd-Anwendung ansprechen kann. Das was ich habe ist das Handle dieses Controls. Die Procedure PutRTFSelection erwartet ein RichEdit.

Delphi-Quellcode:
PROCEDURE Tfrm_Main.WMHotKey( VAR Msg: TWMHotKey );
VAR
  SS: TStringStream;

  FUNCTION WORDPAD_finden_TEST: THandle;
  VAR
    Len: LongInt;
    Title: STRING;
    Main_Wnd, wndChild: THandle;
  BEGIN
    Result := 0;
    Main_Wnd := GetForegroundWindow;
    IF Main_Wnd <> 0 THEN
    BEGIN
      Len := GetWindowTextLength( Main_Wnd ) + 1;
      SetLength( Title, Len );
      GetWindowText( Main_Wnd, PChar( Title ), Len );
      IF ( Pos( 'wordpad', LowerCase( Title ) ) > 0 ) THEN
      BEGIN
        IF Main_Wnd <> 0 THEN
        BEGIN
          wndChild := FindWindowEx( Main_Wnd, 0, 'RICHEDIT50W', NIL );
          IF wndChild <> 0 THEN
          BEGIN
            Result := wndChild;
          END;
        END;
      END;
    END;
  END;

BEGIN
  TRY
    gc_my_DBRichEdit_Handle := WORDPAD_finden_TEST;
    IF ( Msg.HotKey = Hotkey_id ) AND ( gc_my_DBRichEdit_Handle > 0 ) THEN
    BEGIN
      SS := TStringStream.Create
        ( '{\rtf1\ansi\ansicpg1252\deff0\deflang2055{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fnil MS Sans Serif;}}\viewkind4\uc1\pard\ul\b\f0\fs24 Test\ulnone\b0\f1\fs16\par}' );
      TRY
        PutRTFSelection( RICHEDIT1, SS ); // <==== wie komme ich hier das Control von Wordpad angesprochen (RICHEDIT50W), anstelle meinem RichEdit1
      FINALLY
        SS.Free;
      END;

      ShowMessage( 'Handle-ID=' + IntToStr( gc_my_DBRichEdit_Handle ) );
    END;
  FINALLY
    //
  END;
END;

Vielen Dank für Hinweise!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 5. Feb 2021 um 21:57 Uhr) Grund: Text deutlicher formuliert...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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