Не совсем понял - так а проблема в чем? Проверяй длинну строки перед тем как ее выводить. В приведенном примере - так как объем выводимых данных невелик, и данные жестко вшиты в код, функция автопереноса не выделялись отдельно - то есть я проверяю длину строки прямо в коде, и в принципе это нормально работало:
Код:
String = "Поставщик: " + Form1->stPostav->Caption+"\r\n";
int j = 1;
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
//Выводится каждый отдельный символ - не строка!!!
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
Но вобще-то бы стоило делать это отдельным потоком - на больших объемах вывода такой код здорово будет тормозить.
То же и у тебя - тебе нужно или проверять всю строку - и выводить ту дельту которая разница между шириной страницы и шириной строки в отдельную строку - используя субстринг - или выводить посимвольно - проверяя не попадает ли символ за пределы страницы.
Тут кстати, че-то я накрутил с фигурными скобками и объявлениями, звиняй, ессественно не нужно в конструкции do{}while объявлять переменную, просто реальный код менее читаем, там используется ряд полей класса и т.д. и объем его гораздо более. Я надеюсь общая идея понятна.