AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie Caretposition in RichEdit setzen?

Wie Caretposition in RichEdit setzen?

Ein Thema von Armageddon · begonnen am 25. Aug 2005 · letzter Beitrag vom 29. Aug 2005
Antwort Antwort
Seite 2 von 2     12
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#11

Re: Wie Caretposition in RichEdit setzen?

  Alt 27. Aug 2005, 23:39
Hallo,

hier mal meine Routinen:
Delphi-Quellcode:
type
  TBufferClass = class(TObject)
    Buffer: AnsiString;
    Position: Integer;
  end;

function StringSave(dwCookie: LongInt; pbBuff: PByte;
  cb: LongInt; var pcb: LongInt): LongInt; stdcall;
var
  S: PString;
begin
  Result := NoError;

  S := PAnsiString(dwCookie);
  try
    S^ := S^ + PChar(pbBuff);
    pcb := cb;
  except
    Result := $0002; // WriteError
  end;
end;

function StringLoad(dwCookie: LongInt; pbBuff: PByte;
  cb: LongInt; var pcb: LongInt): LongInt; stdcall;
var
  BC: TBufferClass;
  S: PAnsiString;
begin
  Result := NoError;

  BC := TBufferClass(dwCookie);

  try
    pcb := 0;
    try
      pcb := cb;
      if pcb > Length(BC.Buffer) - BC.Position then
        pcb := Length(BC.Buffer) - BC.Position;

      if pcb > 0 then
      begin
        S := PAnsiString(BC.Buffer);
        Inc(S, BC.Position);

        Move(S^, pbBuff^, pcb);
        BC.Position := BC.Position + pcb;
      end;
    except
      Result := $0003; // ReadError
    end;
  finally
  end;
end;

procedure LoadRichEditFromString(Handle: THandle; S: AnsiString);
var
  EditStream: TEditStream;
  BC: TBufferClass;
begin
  BC := nil;
  try
    BC := TBufferClass.Create;
    BC.Buffer := S;
    BC.Position := 0;
    with EditStream do
    begin
      dwCookie := Integer(BC);
      pfnCallBack := @StringLoad;
      dwError := 0;
    end;
    SendMessage(Handle, EM_STREAMIN, SF_RTF, Longint(@EditStream));
  finally
    BC.Free;
  end;
end;

function SaveRichEditToString(Handle: THandle): AnsiString;
var
  EditStream: TEditStream;
  S: AnsiString;
begin
  try
    with EditStream do
    begin
      dwCookie := Integer(@S);
      pfnCallBack := @StringSave;
      dwError := 0;
    end;

    SendMessage(Handle, EM_STREAMOUT, SF_RTF, Longint(@EditStream));
  finally
    Result := S;
  end;
end;
Wichtig sind nur die beiden Routinen am Ende. Diese lesen bzw. schreiben den kompletten Inhalt eines RichEdits,

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#12

Re: Wie Caretposition in RichEdit setzen?

  Alt 28. Aug 2005, 00:22
Danke xaromz,

aber irgendwie bin ich entweder zu blöd oder ich weiß auch nicht an was es liegt.
Egal welches Beispiel das ich bisher gefunden habe benutze, ich bekomme immer Zugriffsverletzungen sobald es ein RichEdit ist das in einer fremden Anwendung läuft. Ich weiß das es ein RichEdit ist welches in der fremden Anwendung ist, ich weiß das Handle und ich weiß daß das Programm welches das fremde RichEdit enthält mit Delphi programmiert wurde. Das müßte doch reichen verflixt noch eins. Habe mal ein paar Screenshots angehängt.

Hoffe es weiß jemand Rat.
Miniaturansicht angehängter Grafiken
4_174.jpg   3_112.jpg   2_118.jpg   1_159.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Wie Caretposition in RichEdit setzen?

  Alt 29. Aug 2005, 11:00
Es könnte daran liegen, dass der Prozess, dem das RichEdit gehört, einen anderen Adressraum hat. Hast du mal einen Breakpoint in "StringSave" gesetzt und geschaut was dort passiert?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#14

Re: Wie Caretposition in RichEdit setzen?

  Alt 29. Aug 2005, 16:26
Ohje jetzt scheint es kompliziert zu werden. Ich kann mir zwar Vorstellen was Du meinst aber ich weiß beim besten Willen nicht wie ich das anstellen soll. Das komische ist das dies auch passiert wenn ich ein leeres form nehme darauf ein RichEdit platziere dieses kompilieren lasse. Dann starte etwas reinschreibe, das Handle mit dem WinSpy herausfinde. Und schließlich versuche es miot meiner Anwwendung die das ja können soll, heraus zu streamen. Pling, plong, Außnahmefehler ohne Ende ist das Ergebnis. Es ist zum Heulen.

  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

Re: Wie Caretposition in RichEdit setzen?

  Alt 29. Aug 2005, 16:33
Wenn meine Vermutung stimmt, dann kann das RichEdit der fremden Anwendung ja noch nicht einmal etwas mit dem Inhalt der EditStream-Struktur anfangen.

Ich habe mehrere Lösungsansätze vor Auge (VirtualAllocEx im fremden Adressraum, Pipes), aber die sind alle alles andere als einfach.

[Nachtrag]

Wahrscheinlich ist von der Komplexität her dein erster Ansatz über die Zwischenablage wirklich der einfachste... auch wenn es für den User unangenehm ist, dass der Inhalt der Zwischenablage verändert wird und dass die Position im RichEdit verändert wird.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#16

Re: Wie Caretposition in RichEdit setzen?

  Alt 29. Aug 2005, 16:42
Also bleib ich doch bei der guten alten Zwischenablage. Die Leute die das Programm benutzen werden haben zu 99% sowieso nichts in der Windowszwischenablage. Von daher zu verschmerzen.

Nimmt man den Programm-Code um Daten von RichEdit1 an RichEdit2 in der gleichen Anwendung zu streamen dann gehts. Ist halt jammerschade das es von fremden Anwendungen aus so kompliziert ist. Vielleicht findet sich ja mal jemand der das in den Griff bekommt und der Allgemeinheit den Code zur Verfügung stellt.

Trotzdem Danke.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz