Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как напечатать форму с полями из текстового файла


Автор: Sliva 29.5.2009, 17:09
Привет! Помогите, пожалуйста, в моей проблеме! Есть текстовый файл вида: 
000:111:сумма:ФИО
Мне нужно распечатать каждого человека с выданной ему суммой, я пробовала использовать Quick report, но у меня не получается, потому что у меня получается "вытащить" qrStringsBand только одно текстовое поле  smile 
Код

 qrStrBand.Items.Clear;
 for i:=0 to kol-1 do
  begin
    qrStrBand.Items.add(FIO[i]);
 end;
  fmUd.QuickRep1.Preview;

а с суммой не получается. Помогите, пожалуйста или подскажите лучший вариант  smile 
Очень надеюсь на вашу помощь!

Автор: Alkash 29.5.2009, 17:18
qrStrBand  - это что?

Автор: Sliva 29.5.2009, 17:26
Цитата(Alkash @ 29.5.2009,  17:18)
qrStrBand  - это что?

это компонент  TQRStringsBand в Quick report для текстовых записей

Автор: Sliva 29.5.2009, 18:58
Делаю теперь так: 
Код

// при вызове события OnPreview
    SomeList := TStringlist.Create;
    for i := 0 to kol-1 do
    SomeList.Add(tempSum[i]);
   CurrentIndex:=0;

 fmUd.qrStringsBand.Items.Clear;
 for i:=0 to kol-1 do
  begin
    fmUd.qrStringsBand.Items.add(FIo);
 end;
  fmUd.QuickRep1.Preview;
// на форме с печатью вызываю OnNeedData
procedure TfmUd.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
 if CurrentIndex<SomeList.Count then moredata:=true else moredata:=false; 
   if MoreData then
  begin
    QRNNN.Caption := SomeList[CurrentIndex];
 SomeList.Count;
  end ;
  Inc(CurrentIndex);
end;
 
Но ПЕЧАТАЕТ только первую сумму :( помогите, пожалуйста! В чем моя ошибка????? 

Автор: Keeper89 29.5.2009, 21:39
QuickRep1NeedData вызывается один раз?

Автор: Sliva 29.5.2009, 21:46
Да, один раз, причем ошибка вот в чем. Получается в отчете: 
Иванов И.И. 1000
ПетровП.П. 1000
Сидоров С.С. 1000
....
Иванов И.И. 2000
ПетровП.П. 2000
Сидоров С.С. 2000
...
Иванов И.И. 3000
ПетровП.П. 3000
Сидоров С.С. 3000? 
а должно быть: 
Иванов И.И. 1000
ПетровП.П. 2000
Сидоров С.С. 3000

OnneedData вызываю 1 раз уже после OnPreview. Мне кажется, что где-то здесь и ошибка.


Автор: Keeper89 29.5.2009, 22:08
А если переписать так:
Код

procedure TfmUd.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
var
  i: Integer;
begin
  for i := 1 to SomeList.Count do
    QRNNN.Caption := SomeList[i-1]; 
end;

Насколько я вижу что-то заполняется еще в Preview, а потом вызывается еще раз.

З.Ы. Дополните фрагмент кода. чтобы он был относительно самостоятельным. Например что такое kol?
Плюс объясните вкратце что делает каждая процедура, потому что мне кажется у вас идет дублирование вывода.

Автор: Sliva 29.5.2009, 23:21
Цитата(Keeper89 @ 29.5.2009,  22:08)
А если переписать так:
Код

procedure TfmUd.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
var
  i: Integer;
begin
  for i := 1 to SomeList.Count do
    QRNNN.Caption := SomeList[i-1]; 
end;


Если так переписать, то весь список с фамилиями будет выведен 1 раз, но сумма у каждого будет стоять последняя :( 

В Preview заполняются фамилии, а kol - количество всех людей. 

Код

procedure Tfm.PrevClick(Sender: TObject); // перед просмотрем печати
var i: integer;
begin
   SomeList := TStringlist.Create;
    for i := 0 to kol-1 do
    SomeList.Add(tempSum[i]); // заполняю суммами 
   CurrentIndex:=0;

 fmUd.qrStringsBand.Items.Clear;
 for i:=0 to kol-1 do
  begin
    fmUd.qrStringsBand.Items.add(FIO); // вывожу ФИО на Quick report
 end;
  fmUd.QuickRep1.Preview;
end;


Ну а на форме с самим отчетом стоит только: 
Код

procedure TfmUd.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
 if CurrentIndex<SomeList.Count then moredata:=true else moredata:=false; 
   if MoreData then
  begin
    QRNNN.Caption := SomeList[CurrentIndex];
 SomeList.Count;
  end ;
  Inc(CurrentIndex);
end;



Мне тоже кажется, что здесь дублирование, но я не пойму - где :( 
Помогите, пожалуйста! 

Автор: Keeper89 29.5.2009, 23:54
А зачем нужна строка
Код

SomeList.Count;

в QuickRep1NeedData?

Я бы переписал так: (попробуйте)
Код

procedure TfrmNeedData.QuickRep1NeedData(Sender: TObject;
  var MoreData: Boolean);
begin
  MoreData := (CurrentIndex < SomeList.Count); 
  if MoreData then
    QRNNN.Caption := SomeList[CurrentIndex]; 
  else
    SomeList.Free;  
  Inc(CurrentIndex);
end; 

Автор: Sliva 30.5.2009, 10:58
Я попробовала, результат такой же  smile  
Может быть, я не в том месте заполняю фамилии и это надо делать не в Preview? Я пробовала заполнять фамилии в событии OnNeedData, но снова получилось неправильно. 
Помогите, пожалуйста!  smile  smile  smile 

Автор: Akella 30.5.2009, 11:06
Возьми какой нибудь MemDataSet. Загрузи в него всё, и подключи к отчёту.

Автор: Sliva 30.5.2009, 12:39
Я ни разу не использовала этот компонент (MemDataSet) :( На какой вкладке он находится и есть ли там стандартные методы загрузки - типа LoadFromFile?

Автор: Keeper89 30.5.2009, 12:55
Проект прикрепить можете?

Автор: Sliva 30.5.2009, 13:46
Прикрепила smile 

Автор: Sliva 30.5.2009, 14:05
А это пример файла из которого я беру фио и суммы

Автор: Keeper89 30.5.2009, 14:13
У меня вообще пустой отчет выводится, ни ФИО, ничего.

Автор: Sliva 30.5.2009, 14:18
Я прикрепила еще текстовый файл, его надо открыть и потом нажать на печать удостоверений. 

Автор: Keeper89 30.5.2009, 16:26
Повозился, кое-что получилось.
  • замените на форме отчета замените объект где выводится имя сотрудника на еще один TQRLabel (у меня это qrFIO).
  • Измените код на следующий:
Код

procedure Tfm.N3Click(Sender: TObject);
var i: integer;
begin
  SomeList := TStringlist.Create;
  for i := 0 to kol-1 do
    SomeList.Add(tempSum[i]);
  CurrentIndex:=0;

  fmUd.qrBand.Items.Clear;
  fmUd.qrBand.Items.add('');
  fmUd.QuickRep1.Preview;
end;

procedure TfmUd.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
  MoreData := CurrentIndex < SomeList.Count;
  if MoreData then
  begin
    qrFIO.Caption := tempFam[CurrentIndex] + ' ' +
                     tempOt[CurrentIndex] + ' ' +
                     tempN[CurrentIndex];
    QRNNN.Caption := SomeList[CurrentIndex];
    Inc(CurrentIndex);
  end;
end;

На всякий случай прикрепляю измененный проект.

Автор: Sliva 30.5.2009, 16:34
о!!!!!!!!!!!!!!!!!!!!!! СПАСИБО ОГРОМННЕЙШЕЕ!!!!!!!!!!!  smile  smile  smile 
Получается, что не нужно было заполнять qrStringsBand??? 

Автор: Keeper89 30.5.2009, 16:51
Ну не то что бы не надо. Я сам никогда не работал с QuickReport (отчеты в Word для меня привычнее), но по-моему надо создавать один Band и через добавление данных в QuickRep1NeedData он сам "расксерит" их в необходимом кол-ве. Что я и сделал, собственно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)