Autor Beitrag
tif
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46
Erhaltene Danke: 1

Winxxx
TP, BP, Delphi 1 - 2009
BeitragVerfasst: Fr 19.06.09 12:09 
Hallo,

vielleicht bin ich ja nicht der einzige, der immer noch Probleme mit Widestring <--> pWidechar bzw. generell der Übergabe von "Strings" ans Windows - API hat, deshalb poste ich einfach mal das Ergebnis meines heutigen Vormittags ;-).

Hintergrund: In einem Richtext sind Platzhalter eingebettet, die ich per Suchen und Ersetzen zur Laufzeit austauschen muss. Die Platzhalter in meinem Beispiel sind mit @@Platzhaltername maskiert.

Aber das nur nebenbei, interessant finde ich halt die Stringübergabe in der EM_GetSelText - Botschaft.

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:
..
USES ... Messages, Richedit, CommDlg ....

...

procedure TForm1.Test(re: TCustomRichEdit);
Var Start : Integer;
    Ende  : Integer;
    PLH   : WideString;

    Function FindText(aStart,aEnde:Integer;text:String) : Integer;
    Var FT :  TFindTextEx;
    Begin
      FT.chrg.cpMin := aStart;
      FT.chrg.cpMax :=aEnde;
      FT.lpstrText := PWideChar(Text);
      Result:=SendMessage(re.Handle,EM_FINDTEXTEX,FR_DOWN,Integer(@FT));
    End;

    Function SubstPLH(Plh : String):String;
    Begin
      // Nur Beispiel, hier 'was sinnvolles mit plh machen :-)
      Result:='??'+copy(plh,3,length(plh)-2);
    End;

begin
  // Anfang des Platzhalters
  Start:=FindText(0,-1,'@@');
  While start >= 0 do Begin
    // Ende des Platzhalter(wortes) suchen
    Ende:=SendMessage(re.Handle,EM_FINDWORDBREAK,WB_RIGHT,start+1)-1;
    if ende >= Start then begin
      // Platzhalter selektieren
      SendMessage(re.Handle,EM_SetSel,Start,Ende);
      // !!! Speicherplatz für den abzuholenden Platzhalter reservieren !!!
      setlength(PLH,Ende-Start+1);
      // Platzhalter abholen
      SendMessage(re.Handle,EM_GetSelText,0,Integer(PLH));
      // Platzhalter(inhalt) ersetzen
      PLH:=SubstPLH(PLH);
      // Platzhalter im Richedit ersetzen
      SendMessage(re.Handle,EM_ReplaceSel,-1,Integer(PLH));
    end;
    // weiter mit naechstem
    Start:=FindText(start,-1,'@@');
  End;
end;


Viele Grüße
Tino