Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

Как из RichEdit получить и засунуть текст в формате RTF?   Найти похожие ветки 

 
Nikfel   (2010-07-10 22:37) [0]

Подскажите, пожалуйста. Создаю RichEdit так:
Var hRichDll: HINST;
   RichWnd : HWND;
begin
hRichDll := LoadLibrary("RICHED20.DLL");
RichWnd := CreateWindowEx (WS_EX_STATICEDGE,"RichEdit20W","",
WS_VISIBLE or WS_VSCROLL or WS_HSCROLL or WS_CHILD or ES_AUTOVSCROLL or  ES_WANTRETURN or ES_MULTILINE,
0, 0,100, 100,hWin,0,Hinstance,nil);


А вот как получить и засунуть текст в формате RTF в RichEdit? Заранее спасибо.


 
Юрий Зотов ©   (2010-07-11 17:03) [1]

Неиспользование VCL принципиально важно? Просто с VCL все это делается за полминуты.


 
Anatoly Podgoretsky ©   (2010-07-11 17:09) [2]

> Юрий Зотов  (11.07.2010 17:03:01)  [1]

Может и важно, у него же RichEdit 3


 
Nikfel   (2010-07-11 21:44) [3]


> Неиспользование VCL принципиально важно? Просто с VCL все
> это делается за полминуты.

Да с VCL это делать очень просто, но мне так не нравится. Без VCL гораздо удобнее для меня, но знаний пока маловато.


 
Германн ©   (2010-07-12 01:37) [4]


> Без VCL гораздо удобнее для меня, но знаний пока маловато.

???


 
Leonid Troyanovsky ©   (2010-07-12 07:54) [5]


> Nikfel   (10.07.10 22:37)  

> А вот как получить и засунуть текст в формате RTF в RichEdit?

EM_STREAMIN, msdn.

> Без VCL гораздо удобнее для меня, но знаний пока маловато.

Удобнее, конечно, но одеяло все время падает.

--
Regards, LVT.


 
Nikfel   (2010-07-14 22:14) [6]

Открытие и сохранение файла:

Program TextOpenSave;

uses
 Windows,
 Messages,
 CommDlg;

Var
HWin, hRichDll: THandle;
RichWND: THandle;
ButtonWND:array[0..1] of THandle;
{ Сюда будет помещено значение оригинальной оконной процедуры класса Edit }
OldProc: Pointer;

const Capt = "TextOpenSave";
     dllRich = "RICHED20.DLL";
     c_myRichEdit = "RichEdit20W";
     c_myClassRichEdit = "RichEdit_";
     TopRich = 40;
     ID_FILE_OPEN = 10;
     ID_FILE_SAVE = 11;
     {$EXTERNALSYM EM_STREAMIN}
     EM_STREAMIN                         = WM_USER + 73;
     {$EXTERNALSYM EM_STREAMOUT}
     EM_STREAMOUT                        = WM_USER + 74;
     {$EXTERNALSYM SF_TEXT}
     SF_TEXT             = $0001;
     {$EXTERNALSYM SF_RTF}
     SF_RTF              = $0002;

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

 {$EXTERNALSYM _editstream}
 _editstream = record
   dwCookie: Longint;
   dwError: Longint;
   pfnCallback: TEditStreamCallBack;
 end;
 TEditStream = _editstream;
 {$EXTERNALSYM EDITSTREAM}
 EDITSTREAM = _editstream;

{ Устанавливает для окна AWindow шрифт для контролов по умолчанию }
Procedure SetDefFont(AWindow: THandle);
Begin
SendMessage(AWindow, WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), 1);
End;

{ Модифицированная оконная процедура RichEdit }
Function EditWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
Begin
Case Msg Of
WM_RBUTTONDOWN: messageBox(HWin,"Правая кнопка мыши","Нажата:",0);
End;
{ Вызов оригинальной оконной процедуры }
Result := CallWindowProc(OldProc,
HWin, Msg, WParam, LParam);
End;

function OpenDlgProc(hdlg: HWND; uiMsg: UINT; WPARAM: wParam; LPARAM: lParam): UINT; stdcall;
var
 pPnt: TPoint;
 dlgRect, prntRect: TRect;
begin
 if uiMsg = WM_INITDIALOG then
   begin
     GetWindowRect(GetParent(hdlg), dlgRect);
     GetWindowRect(GetDesktopWindow, prntRect);
     pPnt.X := ((prntRect.Right - prntRect.Left) - (dlgRect.Right - dlgRect.Left)) div 2;
     pPnt.Y := ((prntRect.Bottom - prntRect.Top) - (dlgRect.Bottom - dlgRect.Top)) div 2;
     SetWindowPos(GetParent(hdlg), HWND_TOPMOST, pPnt.x, pPnt.y, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
   end;
 Result:= 0;
end;


 
Nikfel   (2010-07-14 22:16) [7]

// Функция OpenCallback для чтения rtf
function OpenCallback(dwCookie: DWORD; pbBuff: PChar; cb: LongInt; pcb: pLongInt): DWORD; stdcall;
begin
       // Выполняем чтение блока данных длиной cb байт
       pcb^ := _lread( HFILE(dwCookie), pbBuff, cb);
       if pcb^ < 0 then
               pcb^ := 0;
       Result := 0;
end;

// Функция SaveCallback для записи rtf
function SaveCallback(dwCookie: DWORD; pbBuff: PChar; cb: LongInt; pcb: pLongInt): DWORD; stdcall;
begin
       // Выполняем чтение блока данных длиной cb байт
       pcb^ := _lwrite( HFILE(dwCookie), pbBuff, cb);
       if pcb^ < 0 then
               pcb^ := 0;
       Result := 0;
end;

function AnsiUpperCase(const S: string): string;
var Len: Integer;
begin
 Len := Length(S);
 SetString(Result, PChar(S), Len);
 if Len > 0 then CharUpperBuffA(Pointer(Result), Len);
end;

{ Оконная процедура главного окна }
Function MainWinProc(HWin: THandle; Msg: Cardinal;
WParam, LParam: Integer): Cardinal; Stdcall;
Var
TmpEdit: TWndClassEx;
w,h: Integer;
t:trect;
ps:PAINTSTRUCT;
pen,oldPen:hpen;
ofn:OPENFILENAME;
hFile:Thandle;
ofs: OFSTRUCT;
es: EDITSTREAM;
 procedure Line(DC_:HDC;x1,y1,x2,y2:integer);//для рисования линии
 begin
   MoveToEx(DC_,x1,y1,nil);
   LineTo(DC_,x2,y2);
 end;

 function getPath_:string;
 var s:string;
 i:integer;
 begin
   s:=Paramstr(0);
   i:=length(s);
   while i>0 do begin
     if s[i]="\" then begin
     delete(s,i+1,length(s)-i);
     result:=s;
     break;
     end;
     dec(i);
   end;
 end;
Begin
Case Msg Of
{ Здесь будет произведено создание дочерних окон }
WM_CREATE:
Begin
{ Начало суперклассинга }
If Not GetClassInfoEx(hRichDll, c_myRichEdit, TmpEdit) Then Halt;
{ Запоминаем оконную процедуры для правильной работы окна }
OldProc := TmpEdit.lpfnWndProc;
{ Модификация класса }
TmpEdit.cbSize := SizeOf(TWndClassEx);
TmpEdit.lpfnWndProc := @EditWinProc;
TmpEdit.lpszClassName := c_myClassRichEdit;
TmpEdit.hInstance := GetModuleHandle(NIL);
{ Регистрация класса }
If RegisterClassEx(TmpEdit) = 0 Then Halt;
{ Подготовка массива }
FillChar(RichWND, SizeOf(RichWND), 0);
RichWND := CreateWindowEx(0, c_myClassRichEdit, "",
WS_CHILD Or WS_VISIBLE Or ES_LEFT or WS_VSCROLL or WS_HSCROLL or ES_AUTOVSCROLL or  ES_WANTRETURN or ES_MULTILINE,
10, TopRich, 470, 450, HWin, 0, HInstance, NIL);
ButtonWnd[0]:=CreateWindowEx(0,"Button","Открыть",
BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD,//стиль кнопки
10, 7, 75, 25, HWin, ID_FILE_OPEN, hInstance, nil );
ButtonWnd[1]:=CreateWindowEx(0,"Button","Сохранить",
BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD,//стиль кнопки
95, 7, 75, 25, HWin, ID_FILE_SAVE, hInstance, nil );

SetDefFont(RichWND);
SetDefFont(ButtonWnd[0]);
SetDefFont(ButtonWnd[1]);
SendMessage(RichWND, EM_LIMITTEXT, 2099999999, 0);//максимальная длина текста в RichEdit
End;
WM_SETFOCUS:begin
SetFocus(RichWND);
end;


 
Nikfel   (2010-07-14 22:17) [8]

WM_SIZE:begin
 GetClientRect(HWin,t);
 MoveWindow(RichWND, 10,TopRich, t.Right-t.Left-20,t.Bottom-t.Top-TopRich-10,true);//изменяем размер RichEdit
end;

wm_Paint:begin
 GetClientRect(HWin,t);
 w:=t.Right-t.Left;
 h:=t.Bottom-t.Top;
 beginpaint(hWin,ps);//рисуем рамку вокруг RichEdit
   Pen:=CreatePen(PS_SOLID, 1, rgb(165,172,178));
   oldPen:=SelectObject(ps.hdc,pen);
   Line(ps.hdc, 10, TopRich-1, w-10, TopRich-1);
   Line(ps.hdc, 10, h-9, w-10, h-9);
   Line(ps.hdc, 9, TopRich-1, 9, h-8);
   Line(ps.hdc, w-10, TopRich-1, w-10, h-8);
   SelectObject(ps.hdc,Oldpen);
   DeleteObject(pen);
   ReleaseDC(hWin,ps.hdc);
 EndPaint(hWin, ps);
end;

WM_COMMAND:
   begin
    case LoWord(wParam) of
     ID_FILE_OPEN:begin
     ZeroMemory(@ofn, sizeof(OPENFILENAME));
       with ofn do
         begin
           lStructSize:=sizeof(OPENFILENAME);
           lpstrInitialDir:=pchar(getPath_);
           lpstrTitle:="Открыть";
           nMaxFile:=MAX_PATH;
           lpfnHook:=@OpenDlgProc;
           lpstrFile:=VirtualAlloc(nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
           lpstrFilter:="*.*"+#0+"*.*"#0#0;
           Flags:=OFN_EXPLORER or OFN_CREATEPROMPT or OFN_FILEMUSTEXIST or
            OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_ENABLEHOOK;
         end;

       if GetOpenFileName(ofn) then begin
       //Открытие файла
         hFile := OpenFile(ofn.lpstrFile, ofs, OF_READ);
         // Устанавливаем параметры функции обратного вызова, которая будет выполнять чтение
         es.dwCookie:=hFile;
         es.dwError:=0;
         es.pfnCallback:=@OpenCallback;

         SetWindowText(RichWND,"");

         if AnsiUpperCase(Copy(PChar(@ofn.lpstrFile[ofn.nFileExtension]), 1, 3)) = "RTF" then
                               SendMessage(RichWND, EM_STREAMIN, SF_RTF, LongInt(@es))
                       else
                               SendMessage(RichWND, EM_STREAMIN, SF_TEXT, LongInt(@es));
         // Закрываем файл
         _lclose(hFile);
         // Сбрасываем признак изменения содержимого окна редактора текста
         SendMessage(RichWND, EM_SETMODIFY, 0, 0);
       end;
       VirtualFree(ofn.lpstrFile, 0, MEM_RELEASE);
     end;
     ID_FILE_SAVE:begin
       ZeroMemory(@ofn, sizeof(OPENFILENAME));
       with ofn do
         begin
           lStructSize:=sizeof(OPENFILENAME);
           lpstrInitialDir:=pchar(getPath_);
           lpstrTitle:="Сохранить";
           nMaxFile:=MAX_PATH;
           lpfnHook:=@OpenDlgProc;
           lpstrFile:=VirtualAlloc(nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
           lpstrFilter:="*.*"+#0+"*.*"#0#0;
           Flags:=OFN_EXPLORER or OFN_CREATEPROMPT or OFN_FILEMUSTEXIST or
            OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_ENABLEHOOK;
         end;
       if GetSaveFileName(ofn) then begin
       //Сохранение файла
         hFile := OpenFile(ofn.lpstrFile, ofs, OF_CREATE);
         // Устанавливаем параметры функции обратного вызова, которая будет выполнять чтение
         es.dwCookie:=hFile;
         es.dwError:=0;
         es.pfnCallback:=@SaveCallback;

         if AnsiUpperCase(Copy(PChar(@ofn.lpstrFile[ofn.nFileExtension]), 1, 3)) = "RTF" then
                               SendMessage(RichWND, EM_STREAMOUT, SF_RTF, LongInt(@es))
                       else
                               SendMessage(RichWND, EM_STREAMOUT, SF_TEXT, LongInt(@es));
         // Закрываем файл
         _lclose(hFile);
         // Сбрасываем признак изменения содержимого окна редактора текста
         SendMessage(RichWND, EM_SETMODIFY, 0, 0);
       end;
       VirtualFree(ofn.lpstrFile, 0, MEM_RELEASE);
     end;
    end;
   end;

WM_DESTROY:
Begin
{ Уничтожение классов}
UnregisterClass(c_myClassRichEdit, HInstance);
{ Выход для освобождения памяти }
PostQuitMessage(0);
End;
End;
{ Обработка всех остальных сообщений по умолчанию }
Result := DefWindowProc(HWin, Msg, WParam, LParam);
End;

Procedure WinMain;
Var
Msg: TMsg;
{ Оконный класс }
WndClassEx: TWndClassEx;
Begin
{ Подготовка структуры класса окна }
ZeroMemory(@WndClassEx, SizeOf(WndClassEx));

{************* Заполнение структуры нужными значениями ******************* }

{ Размер структуры }
WndClassEx.cbSize := SizeOf(TWndClassEx);
{ Имя класса окна }
WndClassEx.lpszClassName := "SuperclassSampleWnd";
{ Стиль класса, не окна }
WndClassEx.style := CS_VREDRAW Or CS_HREDRAW;
{ Дескриптор программы (для доступа к сегменту данных) }
WndClassEx.hInstance := HInstance;
{ Адрес оконной процедуры }
WndClassEx.lpfnWndProc := @MainWinProc;
{ Курсор }
WndClassEx.hCursor := LoadCursor(0, IDC_ARROW);
{ Кисть для заполнения фона }
WndClassEx.hbrBackground := COLOR_BTNFACE + 1;
{ Меню }
WndClassEx.lpszMenuName := nil;

{ Регистрация оконного класса в Windows }
If RegisterClassEx(WndClassEx) = 0 Then
MessageBox(0, "Невозможно зарегистрировать класс окна",
"Ошибка", MB_OK Or MB_ICONHAND)
Else
Begin
{ Создание окна по зарегистрированному классу }
hWin := CreateWindowEx(0, WndClassEx.lpszClassName,
Capt,  WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW And Not WS_BORDER,
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 500, 500, 0, 0,
HInstance, NIL);

If hWin = 0 Then
MessageBox (0, "Окно не создалось!",
"Ошибка", MB_OK Or MB_ICONHAND)
Else
Begin
{ Показ окна }
ShowWindow(hWin, SW_SHOWNORMAL);
{ Обновление окна }
UpdateWindow(hWin);

{ Цикл обработки сообщений }
While GetMessage(Msg, 0, 0, 0) Do
Begin
if msg.message=WM_KEYDOWN then begin
 if msg.wParam=VK_ESCAPE then break;//выходим по нажатию ESC
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
DestroyWindow(RichWND);
DestroyWindow(ButtonWnd[0]);
DestroyWindow(ButtonWnd[1]);
{ Выход по прерыванию цикла }
Halt(Msg.WParam);
End;
End;
End;

Begin
hRichDll := LoadLibrary(dllRich);
{ Создание окна }
WinMain;
FreeLibrary(hRichDll);
End.


 
Leonid Troyanovsky ©   (2010-07-14 22:32) [9]


> Nikfel   (14.07.10 22:14) [6]

> Открытие и сохранение файла:

Т.е., благодарностей не будет?

--
Regards, LVT.


 
Nikfel   (2010-07-14 22:41) [10]

Leonid Troyanovsky, спасибо за подсказку. Вроде разобрался с этим, но  можно ли как-то перед сохранением зашифровать текст и тогда сохранить, а перед открытием произвести расшифровку и открыть? Как такое реализовать?


 
Leonid Troyanovsky ©   (2010-07-14 22:49) [11]


> Nikfel   (14.07.10 22:41) [10]

> с этим, но  можно ли как-то перед сохранением зашифровать
> текст и тогда сохранить, а перед открытием произвести расшифровку
> и открыть? Как такое реализовать?

http://groups.google.ru/group/fido7.ru.delphi.chainik/msg/b2fb08daf11406ff?hl=ru
--
Regards, LVT.


 
Nikfel   (2010-07-14 23:13) [12]


> http://groups.google.ru/group/fido7.ru.delphi.chainik/msg/b2fb08daf11406ff?
> hl=ru


Такой вариант мне не понятен и я не хочу использовать uses Classes;

Можно ли как-то в OpenCallback и SaveCallback прописать свой код шифровки?


 
Leonid Troyanovsky ©   (2010-07-15 07:36) [13]


> Nikfel   (14.07.10 23:13) [12]

> Такой вариант мне не понятен и я не хочу использовать uses
> Classes

Мазохист? :)
http://groups.google.ru/group/fido7.ru.delphi.chainik/msg/837239a40eb61173?hl=ru

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2010.10.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
2-1278947191
Hottabxp
2010-07-12 19:06
2010.10.10
Как написать Dll на Delphi 7 что-бы её можно было использовать ..


2-1279264750
И. Павел
2010-07-16 11:19
2010.10.10
Ошибка: "Cannot change visible in OnShow or OnHide"


2-1278787052
Nikfel
2010-07-10 22:37
2010.10.10
Как из RichEdit получить и засунуть текст в формате RTF?


11-1224541718
Harlong
2008-10-21 02:28
2010.10.10
Размер KOLTabControl в WinCE


2-1279271042
azamatufa
2010-07-16 13:04
2010.10.10
Помогите написать (оформить) функцию