자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi Richedit에 대해 질문 있습니다. RTF코드 추출 때문에 그렇습니다.
2013.12.31 16:49
안녕하세요
이번년도에도 많은 도움을 주셔서 정말 감사합니다.
내년에도 XE5가 잘 되어 번창하시길 바랍니다.
0 한림대의료원
1 데브기어
2 만만세
3 새해 복 많이 받으세요
저렇게 리치에디터내용이 있는 경우에
3번줄의 RTF코드를 추출하고 싶습니다.
새해 복 많이 받으세요 이렇게 그대로요 RTF코드 추출도 좋고 아니면 리치에디터에 카피가 되도 좋고요
혹시 방법이 없을 까요??
아 한라인씩 delete(x) 하는 명령어를 쓰지 않고 추출하는 방법을 여쭙는겁니다. ^^;;;
댓글 3
-
Humphery
2013.12.31 22:42
선택된 영역을 클립보드 복사, 붙여넣기 하는 방식으로 사용구현해 봤습니다.
function RELineIndex(RE: TRichEdit; CharPos: integer): integer;begin Result := RE.Perform(WM_USER +54, 0, CharPos);end;
function RELineStart(RE: TRichEdit; Index: integer): integer;begin if Index < 0 then Result := 0 else Result := RE.Perform(EM_LINEINDEX, Index, 0);end;function RELineLength(RE: TRichEdit; Index: integer): integer;var n, len : integer;begin Result := -1; n := RE.Perform(EM_LINEINDEX, Index, 0); len := RE.Perform(EM_LINEINDEX, Index +1, 0); if len > 0 then Result := len -n;end;
function RELineEnd(RE: TRichEdit; Index: integer): integer;var n : integer;begin n := RE.Perform(EM_LINEINDEX, Index, 0); Result := RE.FindText(#10, n, $7FFFFFFF, []);end;
procedure TForm3.FormCreate(Sender: TObject);var s, e: Integer;begin s := RELineStart(RichEdit1, 3) + 2; e := RELineEnd(RichEdit1, 3);
RichEdit1.SelStart := s; RichEdit1.SelLength := e - s;
RichEdit1.SelAttributes.Style := [fsItalic, fsUnderline];
RichEdit1.SelStart := 0; RichEdit1.SelLength := 0;end;
procedure TForm3.Button1Click(Sender: TObject);var s, e: Integer;begin s := RELineStart(RichEdit1, 3) + 2; e := RELineEnd(RichEdit1, 3);
RichEdit1.SelStart := s; RichEdit1.SelLength := e - s;
RichEdit1.CopyToClipboard; RichEdit2.PasteFromClipboard;end;
-
한림대의료원정보기술센터
2014.01.01 17:23
답변 감사합니다
이런 기발한 생각을 하시다니 정말 대단하십니다
그런데 한가지 의문점이 있습니다
우선 카피를 명령어를 쓰느데요
말씀해주신 방법을 구현 하게 되면 한 pc에서 적어도 하루에 몇천번은 거뜬히 실행할것 같은데요
혹시나 메모리 문제가 없을까요
6개병원을 xe2로 오픈해 봤는데요 저 카피 명령어나 클립보드 오픈 에러가 많이 나더라고요
선생님 생각은 어떠세요
-
한림대의료원정보기술센터
2014.01.03 17:38
Humphery 님 덕분에 해결됐습니다. 감사합니다.
카피 명령어를 쓰지 않고 한줄의 rtf코드를 가져옵니다.
혹시 필요한분 있을지 몰라 올렸놓겠습니다.
type
TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): Longint; stdcall;
TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
function OutCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint;
var pcb: Longint): Longint; stdcall;
begin
if cb > 0 then
pcb := TStream(dwCookie).Write(pbBuff^, cb);
Result := 0;
end;
/* 원본 리치에디터, 한줄이 복사될 리치에디터, 원본 리치에디터의 라인 */
procedure TForm.GetRTFTextCopy(redtFrom, redtTo: TRichEdit; ToLine: Integer);
procedure GetRTF(re: TRichEdit; stream: TStream);
var
editstream: TEditStream;
begin
editstream.dwCookie := Longint(stream);
editstream.dwError := 0;
editstream.pfnCallback := OutCallback;
/* 이줄이 중요합니다. */
re.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, Longint(@editstream));
stream.Position := 0;
end;
var StartPosi, SelectPosi : Integer;
mstream: TMemoryStream;
begin
StartPosi := redtFrom.Perform(EM_LINEINDEX, ToLine, 0);
SelectPosi := Length(TrimRight(rchText.Lines.Strings[ToLine]));
redtFrom.SelStart := StartPosi;
redtFrom.SelLength := SelectPosi;
if SelectPosi = 0 then
begin
redtTo.Clear;
redtTo.Text := #13#10;
end
else
begin
mstream := TMemoryStream.Create;
try
GetRTF(redtFrom, mstream);
redtTo.Clear;
redtTo.Lines.LoadFromStream(mstream);
finally
FreeAndNil(mstream);
end;
end;
end;
Delphi Richedit에 대해 질문 있습니다. RTF코드 추출 때문에 그렇습니다.
2013.12.31 16:49
안녕하세요
이번년도에도 많은 도움을 주셔서 정말 감사합니다.
내년에도 XE5가 잘 되어 번창하시길 바랍니다.
0 한림대의료원
1 데브기어
2 만만세
3 새해 복 많이 받으세요
저렇게 리치에디터내용이 있는 경우에
3번줄의 RTF코드를 추출하고 싶습니다.
새해 복 많이 받으세요 이렇게 그대로요 RTF코드 추출도 좋고 아니면 리치에디터에 카피가 되도 좋고요
혹시 방법이 없을 까요??
아 한라인씩 delete(x) 하는 명령어를 쓰지 않고 추출하는 방법을 여쭙는겁니다. ^^;;;
댓글 3
-
Humphery
2013.12.31 22:42
선택된 영역을 클립보드 복사, 붙여넣기 하는 방식으로 사용구현해 봤습니다.function RELineIndex(RE: TRichEdit; CharPos: integer): integer;beginResult := RE.Perform(WM_USER +54, 0, CharPos);end;function RELineStart(RE: TRichEdit; Index: integer): integer;beginif Index < 0 thenResult := 0elseResult := RE.Perform(EM_LINEINDEX, Index, 0);end;function RELineLength(RE: TRichEdit; Index: integer): integer;varn, len : integer;beginResult := -1;n := RE.Perform(EM_LINEINDEX, Index, 0);len := RE.Perform(EM_LINEINDEX, Index +1, 0);if len > 0 thenResult := len -n;end;function RELineEnd(RE: TRichEdit; Index: integer): integer;varn : integer;beginn := RE.Perform(EM_LINEINDEX, Index, 0);Result := RE.FindText(#10, n, $7FFFFFFF, []);end;procedure TForm3.FormCreate(Sender: TObject);vars, e: Integer;begins := RELineStart(RichEdit1, 3) + 2;e := RELineEnd(RichEdit1, 3);RichEdit1.SelStart := s;RichEdit1.SelLength := e - s;RichEdit1.SelAttributes.Style := [fsItalic, fsUnderline];RichEdit1.SelStart := 0;RichEdit1.SelLength := 0;end;procedure TForm3.Button1Click(Sender: TObject);vars, e: Integer;begins := RELineStart(RichEdit1, 3) + 2;e := RELineEnd(RichEdit1, 3);RichEdit1.SelStart := s;RichEdit1.SelLength := e - s;RichEdit1.CopyToClipboard;RichEdit2.PasteFromClipboard;end; -
한림대의료원정보기술센터
2014.01.01 17:23
답변 감사합니다
이런 기발한 생각을 하시다니 정말 대단하십니다
그런데 한가지 의문점이 있습니다
우선 카피를 명령어를 쓰느데요
말씀해주신 방법을 구현 하게 되면 한 pc에서 적어도 하루에 몇천번은 거뜬히 실행할것 같은데요
혹시나 메모리 문제가 없을까요
6개병원을 xe2로 오픈해 봤는데요 저 카피 명령어나 클립보드 오픈 에러가 많이 나더라고요
선생님 생각은 어떠세요 -
한림대의료원정보기술센터
2014.01.03 17:38
Humphery 님 덕분에 해결됐습니다. 감사합니다.
카피 명령어를 쓰지 않고 한줄의 rtf코드를 가져옵니다.
혹시 필요한분 있을지 몰라 올렸놓겠습니다.
type
TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): Longint; stdcall;
TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
function OutCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint;
var pcb: Longint): Longint; stdcall;
begin
if cb > 0 then
pcb := TStream(dwCookie).Write(pbBuff^, cb);
Result := 0;
end;
/* 원본 리치에디터, 한줄이 복사될 리치에디터, 원본 리치에디터의 라인 */
procedure TForm.GetRTFTextCopy(redtFrom, redtTo: TRichEdit; ToLine: Integer);
procedure GetRTF(re: TRichEdit; stream: TStream);
var
editstream: TEditStream;
begin
editstream.dwCookie := Longint(stream);
editstream.dwError := 0;
editstream.pfnCallback := OutCallback;
/* 이줄이 중요합니다. */
re.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, Longint(@editstream));
stream.Position := 0;
end;
var StartPosi, SelectPosi : Integer;
mstream: TMemoryStream;
begin
StartPosi := redtFrom.Perform(EM_LINEINDEX, ToLine, 0);
SelectPosi := Length(TrimRight(rchText.Lines.Strings[ToLine]));
redtFrom.SelStart := StartPosi;
redtFrom.SelLength := SelectPosi;
if SelectPosi = 0 then
begin
redtTo.Clear;
redtTo.Text := #13#10;
end
else
begin
mstream := TMemoryStream.Create;
try
GetRTF(redtFrom, mstream);
redtTo.Clear;
redtTo.Lines.LoadFromStream(mstream);
finally
FreeAndNil(mstream);
end;
end;
end;