2010-07-14 1 views
0

Я использую Delphi 7 и QuickReports в Windows 7. Обычно QuickReports требует DataSet, сгенерированный запросом, но я хочу сделать отчет из содержимого StringGrid как хотя StringGrid представляет собой представление результатов запроса.Как создать QuickReport из содержимого TStringGrid

Как?

+0

Вы можете просто подключить clientdataset к dbgrid или мне что-то не хватает? –

+1

Извините, Марко, я не использую TDBGrid, у меня уже есть данные в TStringGrid. Я хочу сгенерировать свой отчет из этого StringGrid без запроса DB. – Sam

ответ

5

Используйте обработчик события QuickReport.OnNeedData. Он передает параметр var, называемый MoreData (логический); установка True означает, что он снова вызван. Оставьте свойство QuickReport.DataSource пустым и используйте простые элементы управления TQRText, а не TQRDBText.

// CurrLine is an Integer. In your case, it can represent a row in the StringGrid. 
procedure TPrintLogForm.QuickRep1NeedData(Sender: TObject; 
         var MoreData: Boolean); 
begin 
    MoreData := (CurrLine < StringGrid1.RowCount); 
    if MoreData then 
    begin 
    qrTextLine.Caption := StringGrid1.Cells[0, CurrLine]; 
    qrTextData.Caption := StringGrid1.Cells[1, CurrLine]; 
    Inc(CurrLine); 
    end; 
end; 
+0

Спасибо, Кен, я попробую. Приятно знать, что мне не обязательно нужен CDS. Цените свой опыт. +1 для вас тоже. – Sam

+0

Мне нравится этот ответ, потому что он выходит за рамки ответа на точный вопрос «CDS от StringGrid, How?» и вместо этого предоставил еще более простой способ добиться желаемого результата (QuickReport от StringGrid). – Sam

4

Я предполагаю, что набор столбцов фиксирован внутри StringGrid (и с соответствующим TClientDataSet). Шаг за шагом инструкции:

  1. Бросьте TClientDataSet на форме
  2. Doublic щелкните на TClientDataSet, нажмите клавишу INSERT на клавиатуре, чтобы добавить новое поле, добавьте одно поле для каждого из сетки-х колонны. Пример: COL1, String, 128 width.
  3. Щелкните правой кнопкой мыши на TClientDataSet на форму и нажмите кнопку «Создать DataSet»
  4. AT RUNTIME запустить этот вид кода:
 
    CS.Append; 
    CS['COL1'] := 'Whatever'; 
    CS['COL2'] := 'An other thing'; 
    CS.Post; 

Вам нужно сделать Append/Post в цикл, цикл по каждой строке в сетке. Вы можете назначить COL1, COL2 и т. Д. В другом цикле, или вы можете вручную его кодировать.

+0

Спасибо. Неплохо, возможно, работает (еще не пробовал), но я хотел сделать все во время выполнения (без изменения времени разработки). +1 Для хорошего своевременного ответа. – Sam

 Смежные вопросы

  • Нет связанных вопросов^_^