Добавлено спустя 2 часа 9 минут 39 секунд:
Более современный вариант:
- Код: Выделить всё
- uses lconvencoding, Printers, OSPrinters;
 ...
 var
 written: Integer;
 procedure Print(s: String);
 begin
 s := UTF8ToCP866(s);
 Printer.Write(s,Length(s),written); \\здесь ошибка - см. пост ниже.
 end;
 begin
 if not PrintDialog1.Execute then Exit;
 Printer.RawMode:=True;
 Printer.BeginDoc;
 Print(Memo1.Text);
 Printer.EndDoc;
 end;
и надо пропатчить в \lazarus\components\printers\win32\winprinters.inc
- Код: Выделить всё
- function TWinPrinter.Write(const Buffer; Count: Integer;
 var Written: Integer): Boolean;
 begin
 CheckRawMode(True);
 // result := WritePrinter(FPrinterHandle,@Buffer, Count, pdword(@Written));
 result := WritePrinter(FPrinterHandle, Pointer(Buffer), Count, pdword(@Written)); - мой баг - не надо патчить!
 end;



 !
 !