Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Wie kann ich Text an Cursorposition einfügen (RichEdit)


Chatfix - Di 24.09.02 18:16
Titel: Wie kann ich Text an Cursorposition einfügen (RichEdit)
Hallo

Wie kann ich bestimmten Text an Cursorposition einfügen (RichEdit)?


Sven - Di 24.09.02 18:22

Zuerst eine Unit.


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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
unit DirectRTF;

interface

uses
  Windows, Types, Classes,  RichEdit, RxRichEd;

// Stream Callback function
type
  TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
    cb: Longint; var pcb: Longint): DWORD;
  stdcall;

  TEditStream = record
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  end;

// RichEdit Type
type
  TMyRichEdit = TRxRichEdit;

function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);

implementation

// EditStreamInCallback callback function
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): DWORD; stdcall;
  // by P. Below
var
  theStream: TStream;
  dataAvail: LongInt;
begin
  theStream := TStream(dwCookie);
  with theStream do
  begin
    dataAvail := Size - Position;
    Result := 0;
    if dataAvail <= cb then
    begin
      pcb := read(pbBuff^, dataAvail);
      if pcb <> dataAvail then
        Result := UINT(E_FAIL);
    end 
    else 
    begin 
      pcb := read(pbBuff^, cb); 
      if pcb <> cb then 
        Result := UINT(E_FAIL); 
    end; 
  end; 
end; 

// Insert Stream into RichEdit 
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
  // by P. Below
var
  EditStream: TEditStream;
begin
  with EditStream do
  begin
    dwCookie := Longint(SourceStream);
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  end;
  RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
end;

end.


In dem folgenden Codefragment füge ich einen Seitenumbruch ein. Funktioniert aber auch mit beliebigen anderen Text


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TMainForm.ManuellerWechsel1Click(Sender: TObject);
  var Child : TForm;
      SS    : TStringStream;
      Pt    : integer;
begin
  Child := MainForm.ActiveMDIChild;
  with (Child as TMDIChild) do begin
    if Editor.SelStart < Length(Editor.Text) then
      SS := TStringStream.Create('{\rtf1\par\page}')
    else
      SS := TStringStream.Create('{\rtf1\par\page\par}');
  end;
  try
    //Jetzt wird der RTF-Text eingefügt
    PutRTFSelection((Child as TMDIChild).Editor, SS);
  finally
    SS.Free
  end;
  Pt := (Child as TMDIChild).Editor.SelStart;
  PageBreaks(true);
  (Child as TMDIChild).Editor.SelStart := Pt+Length(PAGETEXT)
end;


Chatfix - Di 24.09.02 18:26

Ich habe nur ein "normales" RichEdit woher bekomme ich ein RichEdit deiner sorte und was bietet es für vorteile gegenüber dem normalen RcihEdit und wo finde ich es?

*grins* Danke schonmal im Vorraus


Delete - Di 24.09.02 19:38

Hm. Interessante Lösung Sven. Aber was sagst du dazu:

Quelltext
1:
RichEdit1.SelText := 'bla';                    

Wenn kein Text markiert ist, wird der Text an der Position des Cursors eingefügt, ansonsten wird der markierte Text ersetzt.


Chatfix - Di 24.09.02 19:46

das is genau das was ich suche DANKE!!!!


Delete - Di 24.09.02 19:52

Das habe ich mir schon gedacht, dass Sven's Lösung nicht die Lösung für dein Problem ist.


Sven - Mi 25.09.02 07:44

Ok, ok,
hab da wohl etwas mißverstanden. Mit meiner Lösung ist es aber möglich direkt RTF-Text (mit den Token), wie man am Beispiel sieht, einzufügen. Vielleicht kann das ja jemand gebrauchen.

Gruß Sven