Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

Печать StringGrid из под Linux a (Kylix)   Найти похожие ветки 

 
Web ©   (2007-04-28 14:25) [0]

Добрый день, уважаемые знатоки.
На Вашем сайте (RSDN offline "Дайджест конференции "Общие вопросы" от 08.07.02" сообщение ниже) нашел интересное решение печати для Delphi. Под Виндовсом оно работает отлично, спасибо авторам, но сейчас стоит вопрос об написани CLX приложения (т.е. запустить из под Linux"a предварительно конечно откомпилировав с помощью Kylix 3).
"Ругается" программа в этих местах:

CellH := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_SINGLELINE or DT_CALCRECT or DT_NOPREFIX) + 3*d;

H := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_CALCRECT or DT_NOPREFIX);

DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
      DT_LEFT or DT_TOP or DT_WORDBREAK or DT_NOPREFIX);

при компилировании выдает:
Incompatible types: "HDC" and "QPainterH"
и указывает на этот параметр DestCanvas.Handle

Помогите решить эту проблему, или может укажете другой путь распечатки стрингрида средствами Kylix 3.

С ув. Алексей.
Заранее спасибо.

Полный текст кода, ссылку на саму ветку форума где поднимался этот вопрос не нашел:

Бурундук   (26.06.02 15:12)

Printer.BeginDoc;
K :=  Printer.Canvas.Font.PixelsPerInch / Canvas.Font.PixelsPerInch*1.2;

PrintStringGrid(StrGrid,
  K,   // zoom
  200, // left margin
  200, // top margin
  200  // bottom margin
  );

Printer.EndDoc;

{------------------------------------------------------------}
unit GrdPrn2;

interface

uses
Windows, Classes, Graphics, Grids, Printers, SysUtils;

const
OrdinaryLineWidth: Integer = 2;
BoldLineWidth: Integer = 4;

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow,  LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor

// Недоработки:
// не проверяет, вылезает ли общая длина таблицы за пределы страницы
// Слишком длинное слово обрежется

implementation

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);
var NextRow: Integer;
begin
//Printer.BeginDoc;

if not Printer.Printing then raise Exception.Create("function PrintStringGrid must be called between Printer.BeginDoc and Printer.EndDoc");

NextRow := 0;
repeat
  NextRow := DrawStringGridEx(Grid, Scale, NextRow, LeftMargin, TopMargin,
    Printer.PageHeight - BottomMargin, Printer.Canvas);
  if NextRow <> -1 then Printer.NewPage;
until NextRow = -1;

//Printer.EndDoc;
end;

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow,  LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor
var
i, j, d, TotalPrevH, TotalPrevW, CellH, CellW: Integer;
R: TRect;
s: string;

  procedure CorrectCellHeight(ARow: Integer);
  // вычисление правильной высоты ячейки с учетом многострочного текста
  // Текст рабивается только по словам слишком длинное слово обрубается
  var
    i, H: Integer;
    R: TRect;
    s: string;
  begin
    R := Rect(0, 0, CellH*2, CellH);
    s := ":)"; // Одинарная высота строки
    CellH := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_SINGLELINE or DT_CALCRECT or DT_NOPREFIX) + 3*d;
    for i := 0 to Grid.ColCount-1 do
    begin
      CellW := Round(Grid.ColWidths[i]*Scale);
      R := Rect(0, 0, CellW, CellH);
      //InflateRect(R, -d, -d);
      R.Left := R.Left+d;
      R.Top := R.Top + d;

      s := Grid.Cells[i, ARow];
      H := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_CALCRECT or DT_NOPREFIX); // Вычисление ширины и высоты текста
      if CellH < H + 2*d then CellH := H + 2*d;
      // if CellW < R.Right - R.Left then Слишком длинное слово - не помещается в одну строку;
      // Перенос слов не поддерживается
    end;
  end;

begin
Result := -1; // все строки уместились между TopMargin и Yfloor
if (FromRow < 0)or(FromRow >= Grid.RowCount) then Exit;

d := Round(2*Scale);

DestCanvas.Brush.Style := bsClear;
DestCanvas.Font := Grid.Font;
DestCanvas.Font.Height := Round(Grid.Font.Height*Scale);

//  Scale := DestCanvas.Font.Height/Grid.Font.Height;

TotalPrevH := 0;

for j := 0 to Grid.RowCount-1 do
begin
  if (j >= Grid.FixedRows) and (j < FromRow) then Continue;
  // Fixed Rows рисуются на каждой странице

  TotalPrevW := 0;
  CellH := Round(Grid.RowHeights[j]*Scale);
  CorrectCellHeight(j);

  if TopMargin + TotalPrevH + CellH > YFloor then
  begin
    Result := j; // j-я строка не помещается в заданный диапазон
    if Result < Grid.FixedRows then Result := -1;
    // если фиксированные строки не влезают на страницу - это тяжёлый случай...
    Exit;
  end;

  for i := 0 to Grid.ColCount-1 do
  begin
    CellW := Round(Grid.ColWidths[i]*Scale);

    R := Rect(TotalPrevW, TotalPrevH, TotalPrevW + CellW, TotalPrevH + CellH);
    OffSetRect(R, LeftMargin, TopMargin);

    if (i < Grid.FixedCols)or(j < Grid.FixedRows) then
      DestCanvas.Pen.Width := BoldLineWidth
    else
      DestCanvas.Pen.Width := OrdinaryLineWidth;

    DestCanvas.Rectangle(R.Left, R.Top, R.Right+1, R.Bottom+1);
    //InflateRect(R, -d, -d);
    R.Left := R.Left+d;
    R.Top := R.Top + d;

    s := Grid.Cells[i, j];
    DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
      DT_LEFT or DT_TOP or DT_WORDBREAK or DT_NOPREFIX);

    TotalPrevW := TotalPrevW + CellW; // Общая ширина всех предыдущих колонок
  end;

  TotalPrevH := TotalPrevH + CellH;   // Общая высота всех предыдущих строк
end;
end;

end.


 
Web ©   (2007-05-03 13:09) [1]

Что ни у кого нет ни единой идеи как решить мою проблему?


 
Плохиш ©   (2007-05-03 14:34) [2]

DrawText замени на QPainter_drawText.
Опции расположения текста смотри в модуле Qt.pas, тип AlignmentFlags.


 
Web ©   (2007-05-03 16:02) [3]

Плохиш, спасибо за Ваш ответ.
DT_LEFT заменил на AlignmentFlags_AlignLeft
DT_TOP заменил на AlignmentFlags_AlignTop
DT_WORDBREAK заменил на AlignmentFlags_WordBreak
DT_SINGLELINE заменил на AlignmentFlags_SingleLine
с остальными двумя DT_CALCRECT и DT_NOPREFIX возникла проблема, аналогов нет в в модуле Qt.pas.

следовательно строка выглядит так:

CellH := QPainter_drawText(DestCanvas.Handle, PChar(s), Length(s), R,
        AlignmentFlags_AlignLeft or AlignmentFlags_AlignTop or
        AlignmentFlags_WordBreak or AlignmentFlags_SingleLine or
        DT_CALCRECT or DT_NOPREFIX) + 3*d;

(подчеркнутое я не знаю что туда писать)
И при компиляции выдает
[Error] GridPrnt2.pas(62): Operator not applicable to this operand type
после каждого or начиная со второго, т.е. первый AlignmentFlag он "понимает", дальше ошибки...
в конце

[Error] GridPrnt2.pas(62): There is no overloaded version of "QPainter_drawText" that can be called with these arguments

комбинации с разными вариантами подстановки значений в процедуру QPainter_drawText ни к чему хорошему не привели.

Заранее спасибо.


 
Плохиш ©   (2007-05-03 16:30) [4]


> CellH := QPainter_drawText(DestCanvas.Handle, PChar(s), Length(s), R,
>         AlignmentFlags_AlignLeft or AlignmentFlags_AlignTop or
>         AlignmentFlags_WordBreak or AlignmentFlags_SingleLine or
>         DT_CALCRECT or DT_NOPREFIX) + 3*d;

Ничего не понял, там нет функций с такой последовательностью параметров...
Последний раз ищу за кого-либо...
http://www.scitools.com/documents/sample_reports/udelphi_example_reports/60491.html


 
Плохиш ©   (2007-05-03 16:44) [5]

Кстати, должно быть тоже интересно
http://andy.jgknet.de/oss/kylix/wiki/index.php/Main_Page


 
Web ©   (2007-05-03 22:15) [6]

Плохиш, простите если обидел Вас, просто я никогда раньше не импортировал код на другую платформу. Задача стоит в банальной распечатке уже готового Stringgrida. (как Вы видите все мои попытки преобразовать Виндовский код не принесли плода :( ). Может Вы подскажете действенное решение данной проблемы?


 
Плохиш ©   (2007-05-04 11:25) [7]


> Web ©   (03.05.07 22:15) [6]

В ссылке из [4] дан подробный пример использования функции с использованием всех опций для вывода текста. Неужели это не помогло?
Судя по [3], Вы даже не соизволии посмотреть описание функции, а просто сделали замену названий. В этом случае мне Вам помочь нечем.

PS. Мне обижаться незачем, проблема-то у Вас...


 
Web ©   (2007-05-07 15:25) [8]


> Судя по [3], Вы даже не соизволии посмотреть описание функции,
>  а просто сделали замену названий

Согласен, виноват, думал на скорую руку получится, но увы...

> В ссылке из [4] дан подробный пример использования функции
> с использованием всех опций для вывода текста. Неужели это
> не помогло?

я не совсем понимаю про какой пример Вы говорите. Если про этот:
QPainter_drawText(Canvas.Handle, @lpRect, flags, @s, nCount, nil, nil);
то я поробую показать как я его понимаю в контексте данной проблемы, а Вы мне покажете на ошибки. Итак
1) Canvas.Handle это понятно DestCanvas.Handle
2) @lpRect, это R: TRect
3) flags или 0 или integer(AlignmentFlags_...)
4) @s вот тут непонятно??? в примере это WStrFromWCharLen(lpString: PWideChar, nCount:integer), в моем случае я не могу понять какой параметр является lpString, nCount это Length (s)
5) nCount это Length (s)
6,7) в описании функции (ниже) в модуле Qt это br: PRect; internal: PPAnsiChar... что означают они для данной процедуры я не знаю... в примере стоят nil -  что они означают?.

QPainter_drawText(handle: QPainterH; p1: PRect; flags: Integer; p3: PWideString; len: Integer; br: PRect; internal: PPAnsiChar);


 
Web ©   (2007-05-07 15:42) [9]

и кстати (как я раньше не заметил).
В Виндовсе (Windows.pas) эта функция, возвращающая Integer.

function DrawText(hDC: QPainterH; lpString: PChar; nCount: Integer;
 var lpRect: TRect; uFormat: UINT): Integer;


в Линуксе (Qt.pas) это процедура, которая ничего не возвращает:
procedure QPainter_drawText(handle: QPainterH; p1: PRect; flags: Integer; p3: PWideString; len: Integer; br: PRect; internal: PPAnsiChar)
что с этим делать? ведь судя по коду мне надо получить CellH и H типа Integer.

P.s
процедура откомпилировалась без ошибок при таких исходных данных:

QPainter_DrawText(DestCanvas.Handle, @R, 0, @s, Length(s),nil,nil)


 
Плохиш ©   (2007-05-07 16:17) [10]


> 4) @s вот тут непонятно??? в примере это WStrFromWCharLen(lpString:
>  PWideChar, nCount:integer), в моем случае я не могу понять
> какой параметр является lpString, nCount это Length (s)

Измени тип у своей переменной s со string на WideString. В функцию подставляешь в виде PWideString(@s). В качестве длины можно подставлять -1.


 
Web ©   (2007-05-16 14:27) [11]

Наконецто добрался до программки.
Тип у s я еше заменил в прошлый раз...
с PWideString(@s), да! спасибо, заработало....но..... только из под Виндовса.
Т.е. CLX приложение на Delphi 7 откомпилировалось без ошибок, и даже распечатал Стринггрид так как надо.
Я на радостях пошел на Линуксовскую машину, собрал там программку... и не печатается таблица...просто белый листок и в верхнем углу черная полоса размером 0.5х4 см... я так понял это и есть моя таблица...
но почему то только в этом диапазне, понять не могу...из Виндовса она печатается без проблем...что делать дальше я не знаю...в какую сторону копать тоже (.
Сидел разбирался с Rave Reports, Fast Reports и тп... но там все примеры Виндовс - ориентированы... ничего толкового не нашел.

P.s.
Написал процедурку для преобразования моего грида в .html, может как-то можно средствами Delphi/Kylix распечатать его?
Или как вариант сохранять в обычный текстовый файл...но как сохранить исходное форматирование (размеры) таблицы при сохранении? ума не приложу...



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

Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.041 c
1-1179287475
kukuikar
2007-05-16 07:51
2007.07.22
Синхронизатор: проблема быстрой проверки большого кол-ва файлов


15-1182836940
Kolan
2007-06-26 09:49
2007.07.22
Локализация встроенных констант


4-1171368057
Larsik
2007-02-13 15:00
2007.07.22
Получение owner a файла


6-1161301119
Святослав
2006-10-20 03:38
2007.07.22
Помогите сделать простое клиент-сервер приложение


15-1182752797
de.
2007-06-25 10:26
2007.07.22
Открыть часть набора данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский