Требуется компоне под Дельфи 7 (типа Quick Report)

Форум для программистов

Сообщение ericbek » Ср авг 03, 2005 8:56 am

В общем когда пользовалься Дельфи 4, то мне хватало Quick Report (версии не помню). Но всё равно настройки принтера в нём отсутствовало практически, хотя я много раз пробовал писать программно, пытался использовать другие компоненты для этого, но всё тщетно.
1) Есть ли полноценная версия Quick Report'a для Дельфи 7 со всеми работоспособными настройками
2) Какие есть бесплатные альтернативы этому компоненту?
3) Что, где и как настроить в этом альтернативном компоненте?
4) Народ, кто, чем и как пользуется для таких целей (распечатка с базы данных)?
5) Другии пожелания, советы, критики и прочее.
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0

Сообщение Леха » Ср авг 03, 2005 2:09 pm

Есть FastReports - но он платный
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение ericbek » Чт авг 04, 2005 6:54 am

2Леха
Может быть есть таблетка?
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0

Сообщение Леха » Чт авг 04, 2005 7:19 am

есть исходники <!--emo&B)-->[img]style_emoticons/<#EMO_DIR#>/cool.gif[/img]<!--endemo--> Стучись в асю - дам
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение RAVen42 » Пт авг 05, 2005 12:38 am

ericbek Я в таких случая пользуюсь MS Excel ом. Намного универсальней и проще в использовании.
Программер просто Программер
RAVen42
Подполковник
 
Сообщений: 725
Зарегистрирован: Пт авг 27, 2004 1:04 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение earl » Пт авг 05, 2005 9:26 pm

<!--QuoteBegin-ericbek+Aug 3 2005, 11:56--><div class='quotetop'>QUOTE(ericbek @ Aug 3 2005, 11:56)</div><div class='quotemain'><!--QuoteEBegin-->...Но всё равно настройки принтера в нём отсутствовало практически
...<!--QuoteEnd--></div><!--QuoteEEnd-->
- там просто по-хитрому настройка принтера делается:
Код: выделить все
PrintForm.QuickReport1.PrinterSetup;

Лично мне - до сих пор его хватает "и за глаза, и за уши"; всё, что угодно сделать позволяет.
Есть еще такая штука CrystalReport, по моему, начиная с Delphi-6 на той же компашке идёт, после установки интегрируется с Дельфой, как замена стандартному QuickReport'у. "Поковырялся" я с ним, но... дофигищи там всего конечно, но оно или стандартными средствами реализуется, или не нужно (мне, по крайней мере). Попробуй его при желании.
earl
Подполковник
 
Сообщений: 614
Зарегистрирован: Ср июн 19, 2002 7:04 pm
Откуда: Череповец
Пункты репутации: 0

Сообщение ericbek » Сб авг 06, 2005 7:31 am

2Леха Большой сенькс за исходник!
2RAVen42 Большое спасибо за совет! А можно процедуру посмотреть?
2earl Большое спасибо за совет! А можно процедуру посмотреть?
2All Заранее всем ёще раз, сенькс!
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0

Сообщение RAVen42 » Пн авг 08, 2005 12:54 am

ericbek

Uses
ComObj;



public
E: Variant; // сам ексел


procedure TFmRepDril.BitBtn2Click(Sender: TObject);
var
FileName: string;
i: Integer;

begin

FileName := ExtractFilePath(ParamStr(0)) + '.\Report\DrilRep.xlt';
E := CreateOleObject('Excel.Application'); // запускае ексел
E.Visible := true; //делаем видимым ексел
E.Workbooks.Add(FileName); // открываем шаблон

E.ActiveWorkBook.ActiveSheet.Cells(4, 7) := DateToStr
(DTP1.Date); //Добавляем текст в ячейку (4,7)

{Таким образом выделяем граници ячеек в диапазоне A8:S8 ячейку}
E.ActiveWorkBook.ActiveSheet.Range['A8:S8'].Borders.item
[xlEdgeLeft].LineStyle := true;

E.ActiveWorkBook.ActiveSheet.Range['A8:S8'].Borders.item
[xlEdgeBottom].LineStyle := true;

E.ActiveWorkBook.ActiveSheet.Range['A8:S8'].Borders.item
[xlEdgeRight].LineStyle := true;

E.ActiveWorkBook.ActiveSheet.Range['A8:S8'].Borders.Weight := 3;
E.ActiveWorkBook.ActiveSheet.Range['A8:S8'].Borders.LineStyle := xLDouble;




end;

Это самое просто что можно сделать. А так из делфы можно делать всё с Екселем в плоть до записи и выполнения макрасов.

Вообще ежели надо могу выслать исходники с примерами по работе с Екселем, я на них кстати учился, так что , ежели что давай мыло.

Короче с опытом всё становиться ясно и понятно, а главное просто и удобно.
Последний раз редактировалось RAVen42 Пн авг 08, 2005 12:56 am, всего редактировалось 1 раз.
Программер просто Программер
RAVen42
Подполковник
 
Сообщений: 725
Зарегистрирован: Пт авг 27, 2004 1:04 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение DruiD » Пн авг 08, 2005 4:51 am

<!--QuoteBegin-RAVen42+Aug 8 2005, 04:54--><div class='quotetop'>QUOTE(RAVen42 @ Aug 8 2005, 04:54)</div><div class='quotemain'><!--QuoteEBegin-->ericbek
Вообще ежели надо могу выслать  исходники с примерами по работе с Екселем, я на них  кстати учился,  так что , ежели что давай мыло.
[right][snapback]182614[/snapback][/right]
<!--QuoteEnd--></div><!--QuoteEEnd-->
А можно и мне? <!--emo&:rolleyes:-->[img]style_emoticons/<#EMO_DIR#>/rolleyes.gif[/img]<!--endemo-->
dmitry@nekto.com
"Вы можете тысячу раз обвинять нас, богиня вечного суда истории усмехнется, разорвет приговор вашего суда, и, после, объявит нас свободными".
А. Гитлер, Mein Kampf.
DruiD
Полковник
 
Сообщений: 1171
Зарегистрирован: Чт июн 02, 2005 3:13 pm
Откуда: Зеленоград
Пункты репутации: 0

Сообщение ericbek » Пн авг 08, 2005 9:06 am

2RAVen42
Спасибо! Моё мыло - мой_ник@mail.ru
Мог бы как положено, но спам мягко говоря достал - никак не могу отвязаться.
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0

Сообщение RAVen42 » Вт авг 09, 2005 12:47 am

ericbek
DruiD
Усё улетело.
Программер просто Программер
RAVen42
Подполковник
 
Сообщений: 725
Зарегистрирован: Пт авг 27, 2004 1:04 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение ericbek » Вт авг 09, 2005 4:19 am

2RAVen42
А что и куда улетело-то <!--emo&:unsure:-->[img]style_emoticons/<#EMO_DIR#>/unsure.gif[/img]<!--endemo--> ? К сожаленью не в мой ящик! Повторяю ящик - ericbek<span style='font-family:Times'>бобик</span>mail.ru
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0

Сообщение DruiD » Вт авг 09, 2005 4:46 am

<!--QuoteBegin-ericbek+Aug 9 2005, 08:19--><div class='quotetop'>QUOTE(ericbek @ Aug 9 2005, 08:19)</div><div class='quotemain'><!--QuoteEBegin--> К сожаленью не в мой ящик!
[right][snapback]182665[/snapback][/right]
<!--QuoteEnd--></div><!--QuoteEEnd-->
И не в мой.. наверно в полете еще. <!--emo&;)-->[img]style_emoticons/<#EMO_DIR#>/wink.gif[/img]<!--endemo-->
"Вы можете тысячу раз обвинять нас, богиня вечного суда истории усмехнется, разорвет приговор вашего суда, и, после, объявит нас свободными".
А. Гитлер, Mein Kampf.
DruiD
Полковник
 
Сообщений: 1171
Зарегистрирован: Чт июн 02, 2005 3:13 pm
Откуда: Зеленоград
Пункты репутации: 0

Сообщение earl » Вт авг 16, 2005 6:40 pm

2ericbek:
Так, а собственно, там все и прописано (в приведенной строке), - в процедуре допольнительные действия только, если нужны. ...Ну, держи кусок процедуры из реального проекта.
Код: выделить все
Procedure TMainForm.Print3Report;
Var DH : Word;
   ST : Array[1..3] Of TStaticText;
Const BegTim : Array[0..2] Of String = ('23:00','07:00','15:00');
     EndTim : Array[0..2] Of String = ('07:00','15:00','23:00');
Begin
ST[1]:=ST1g; ST[2]:=ST2g; ST[3]:=ST3g;
Print3Form:=TPrint3Form.Create(Application);
Print3Form.QR1.PrinterSetup;                             // Вот собственно эта строчка только и нужна тебе
;
Print3Form.TtlLab.Caption:='Технологические режимы '+Agr_CB.Text;
Print3Form.DtLab.Caption:=DE.Text;
Print3Form.SmLab.Caption:=Group.SmenaNumStr;
Print3Form.BrLab.Caption:=Group.BrigadaNumStr;
Print3Form.StLab.Caption:=BegTim[CB.ItemIndex];
Print3Form.EtLab.Caption:=EndTim[CB.ItemIndex];
;
For CC:=1 To 3 Do
   If ST[CC].Caption<>Cp Then Begin
    If    (Pos('ТОЛЩИНА',AnsiUpperCase(ST[CC].Caption))>0)
       Or (Pos('ШИРИНА', AnsiUpperCase(ST[CC].Caption))>0)
       Then ChrtP[CC].Series[0].Marks.Visible:=True
       Else ChrtP[CC].Series[0].Marks.Visible:=False;
    If Not NameODS.Locate('Sig_Name', ST[CC].Caption, [loPartialKey,loCaseInsensitive]) Then Continue;
    If ValidateSignal (NameODSSig_prm.AsInteger,
                       DateToStr(Beg_Date) + BeginTime[CB.ItemIndex],
                       DateToStr(End_Date) + EndTime  [CB.ItemIndex],
                       RxValue1);
       Then FillPChart(ChrtP[CC]);
    ChrtP[CC].Title.Text[0]:=ST[CC].Caption+', '+Measure[CC];
    End { For CC - If...}
    Else Begin
    DH:=ChrtP[CC].Parent.Height;
    ChrtP[CC].Destroy;
    If CC=2 Then Print3Form.QRC3.Top:=Print3Form.QRC3.Top-DH;
    Print3Form.QRBand2.Height:=Print3Form.QRBand2.Height-DH;
    End; { For CC - Else...}
Print3Form.QR1.Print;
If Assigned(Print3Form) Then Print3Form.Free;
End;


Насчёт экспорта в Эксель, если никто не возражает ( <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo--> ), тоже вот пример:
Код: выделить все
Procedure TViewForm.FormKeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState);
Var I            : Integer;
   A, B, C, Lim : Integer;
XL, XLS : Variant;
Type  TViewMode = (vmTable, vmGraph);
Const ViewMode  : TViewMode = vmGraph;
Begin
Case Key Of
 VK_ESCAPE : Close;
 VK_F8     : Begin
   If ssShift In Shift Then Begin // Export to Excel
      Try
        Try
          XL := GetActiveOleObject('Excel.Application'); //Поиск запущенного Экселя;
          Except                                    // Кстати, подключить юнит ComObj !!
          XL := CreateOleObject('Excel.Application');    // Если не запущен еще, то запускаем сами
          End;
        Except
         ShowMessage('Ну уж, дружок, сначала Excel установи у себя на машине!!'); // Без комментариев :)
         Exit;
        End;
     ;
      Label1.Font.Color := clMaroon;
      Label1.Caption := 'Идёт передача данных в MS-Excel. Подождите, и выпейте пока чашечку кофе :)';
      ViewForm.Refresh;
      A := 0; B := 0; C := 0;
      If MainForm.RxValue1.Active Then A := MainForm.RxValue1.RecordCount;
      If MainForm.RxValue2.Active Then B := MainForm.RxValue2.RecordCount;
      If MainForm.RxValue3.Active Then C := MainForm.RxValue3.RecordCount;
      If A > B   Then Lim := A Else Lim := B;
      If Lim < C Then Lim := C;
     ;
      XL.WorkBooks.Add; // Создали новую книгу
     ;
       XL.ActiveSheet.PageSetup.PrintTitleRows    := '$3:$4'; // Какие ряды будут повторяться в качестве заголовка, если печать на несколько страниц
       XL.ActiveSheet.PageSetup.PrintTitleColumns := '';
       XL.ActiveSheet.PageSetup.LeftHeader := '';      //
       XL.ActiveSheet.PageSetup.CenterHeader := ''; // Заголовки на листе, если нужны
       XL.ActiveSheet.PageSetup.RightHeader := '';   //
       XL.ActiveSheet.PageSetup.TopMargin := XL.Application.InchesToPoints(0.393700787401575);    //
       XL.ActiveSheet.PageSetup.BottomMargin := XL.Application.InchesToPoints(0.78740157480315); //
       XL.ActiveSheet.PageSetup.HeaderMargin := XL.Application.InchesToPoints(0.31496062992126); // Границы печати
       XL.ActiveSheet.PageSetup.FooterMargin := XL.Application.InchesToPoints(0.433070866141732); //
       XL.ActiveSheet.PageSetup.PrintHeadings := False;
       XL.ActiveSheet.PageSetup.PrintGridlines := False;
       XL.ActiveSheet.PageSetup.PrintComments := xlPrintNoComments;
       XL.ActiveSheet.PageSetup.CenterHorizontally := False;
       XL.ActiveSheet.PageSetup.CenterVertically := False;
       XL.ActiveSheet.PageSetup.Orientation := xlPortrait;
       XL.ActiveSheet.PageSetup.Draft := False;
       XL.ActiveSheet.PageSetup.PaperSize := xlPaperA4;
       XL.ActiveSheet.PageSetup.FirstPageNumber := 1; //xlAutomatic;
       XL.ActiveSheet.PageSetup.Order := xlDownThenOver;
       XL.ActiveSheet.PageSetup.BlackAndWhite := False;
       XL.ActiveSheet.PageSetup.Zoom := 100;
       XL.ActiveSheet.PageSetup.PrintErrors := xlPrintErrorsBlank; //xlPrintErrorsDisplayed;
     ;
      XL.Cells[1,1].ColumnWidth         := 15; //
      XL.Cells[1,3].ColumnWidth         := 15; //
      XL.Cells[1,5].ColumnWidth         := 15; // Выставили необходимую ширину столбцов
      XL.Cells[1,6].ColumnWidth         := 12; //
      XL.Range[XL.Cells[1,1],XL.Cells[4,6]].Font.Name       := 'Times New Roman'; //
      XL.Range[XL.Cells[1,1],XL.Cells[4,6]].Font.Size       := 10;               // Установили шрифт
      XL.Range[XL.Cells[1,1],XL.Cells[4,6]].Font.ColorIndex := 1; { clBlack }        //
      XL.Range[XL.Cells[5,2],XL.Cells[Lim+4,2]].Interior.ColorIndex := 19; //
      XL.Range[XL.Cells[5,4],XL.Cells[Lim+4,4]].Interior.ColorIndex := 19; // Установили цвет фона
      XL.Range[XL.Cells[5,6],XL.Cells[Lim+4,6]].Interior.ColorIndex := 19; //
      XL.Range[XL.Cells[5,2],XL.Cells[Lim+4,2]].NumberFormat := '0.00';
      XL.Range[XL.Cells[5,4],XL.Cells[Lim+4,4]].NumberFormat := '0.00';
      XL.Range[XL.Cells[5,6],XL.Cells[Lim+4,6]].NumberFormat := '0.00';
     ;
      XL.Cells[1,1].Font.ColorIndex := 11; { clNavy }
      XL.Cells[1,1].HorizontalAlignment := xlLeft;           // Установили выравнивание по горизонтали...
      XL.Cells[1,1].VerticalAlignment   := xlVAlignTop;   // ... и вертикали
      XL.Cells[1,1].Value           := 'ОАО "СеверСталь"'; // вывели в ячейку необходимый текст
     ;
      XL.Range[XL.Cells[1,2],XL.Cells[1,5]].Merge(False); // Объединили несколько ячеек в одну
      XL.Cells[1,2].HorizontalAlignment := xlCenter;
      XL.Cells[1,2].Font.Size       := 16;
      XL.Cells[1,2].Font.FontStyle  := 'Bold';
      XL.Cells[1,2].Value           := 'Технологические режимы ' + MainForm.Agr_CB.Text;
     ;
      XL.Range[XL.Cells[1,1],XL.Cells[1,6]].Select; // Выбрали диапазон ячеек
      XL.Selection.Borders[xlEdgeBottom].LineStyle  := xlContinuous; // И установили границу ячеек
      XL.Selection.Borders[xlEdgeBottom].Weight     := xlThin;           // нужной толщины
      XL.Selection.Borders[xlEdgeBottom].ColorIndex := 1; { clBlack }//и цвета
     ;
      // Здесь у меня повторение несколько раз объединений, назначений цветов, рамок и т.п....
     ;  // Собственно, передаём данные...
      XL.Range[XL.Cells[4,1],XL.Cells[4,6]].HorizontalAlignment := xlCenter;
      XL.Cells[4,1].Value := 'Время';
      XL.Cells[4,2].Value := 'Значение';
      XL.Cells[4,3].Value := 'Время';
      XL.Cells[4,4].Value := 'Значение';
      XL.Cells[4,5].Value := 'Время';
      XL.Cells[4,6].Value := 'Значение';
     ;
      MainForm.RxValue1.DisableControls;
      MainForm.RxValue2.DisableControls;
      MainForm.RxValue3.DisableControls;
     ;
      If A > 0 Then Begin
      MainForm.RxValue1.First;
      For I := 1 To A Do Begin
          Application.ProcessMessages;
          XL.Cells[i+4,1].Value := FormatDateTime('dd.mm  hh:nn:ss', MainForm.RxValue1.FieldByName('Offset').Value);
          XL.Cells[i+4,2].Value := MainForm.RxValue1.FieldByName('Value').Text;
          XL.Cells[i+4,2].HorizontalAlignment := xlLeft;
          XL.Range[XL.Cells[i+4,1],XL.Cells[i+4,2]].Select;
          XL.Selection.Borders[xlEdgeLeft].LineStyle  := xlContinuous;
          XL.Selection.Borders[xlEdgeLeft].Weight     := xlThin;
          XL.Selection.Borders[xlEdgeLeft].ColorIndex := 1; { clBlack }
          XL.Selection.Borders[xlEdgeBottom].LineStyle  := xlContinuous;
          XL.Selection.Borders[xlEdgeBottom].Weight     := xlThin;
          XL.Selection.Borders[xlEdgeBottom].ColorIndex := 1; { clBlack }
          MainForm.RxValue1.Next;
          End;
      End;
     ;
      // Здесь то же самое для второй и третей таблицы...
     ;
      XL.ActiveSheet.PageSetup.LeftFooter := '&"Times New Roman,обычный"&9Технологические режимы '+MainForm.Agr_CB.Text+#13+'Дата:'+MainForm.DE.Text+' Смена:'+MainForm.Group.SmenaNumStr; // Нижний колонтитул слева
      XL.ActiveSheet.PageSetup.RightFooter := '&"Times New Roman,курсив"&8Copyright©2004  EARL®Alex'; // Нижний колонтитул справа
     ;
      XL.ActiveSheet.Protect('EARL®Report');  // Установили защиту от модификации значений ячеек
      XL.ActiveSheet.EnableSelection := xlNoSelection; //xlNoRestrictions; // Установили защиту от выбора ячеек (чтоб скопировать не могли)
     ;
      MainForm.RxValue1.EnableControls;
      MainForm.RxValue2.EnableControls;
      MainForm.RxValue3.EnableControls;
     ;
      XL.Visible := True; // Отобразили созданную книгу (да, она была создана, но неактивна, в скрытом состоянии)
     ;
      Panel4.SendToBack;
      ViewMode := vmGraph;
      Label1.Font.Color := clNavy;
      Label1.Caption := 'F8 - Вернуться к просмотру графиков;   Shift+F8 - Экспортировать в Excel и вернуться к просмотру графиков';
      End
   Else Begin
   If ViewMode = vmTable Then Begin Panel4.SendToBack;
                                    ViewMode := vmGraph; End
                         Else Begin Panel4.BringToFront;
                                    ViewMode := vmTable; End;
   End;
   End; {F8 pressed}
 End; {Case}
End;
earl
Подполковник
 
Сообщений: 614
Зарегистрирован: Ср июн 19, 2002 7:04 pm
Откуда: Череповец
Пункты репутации: 0

Сообщение ericbek » Ср авг 24, 2005 4:27 am

Большой, большой спасиб!
Ола киштак роторла!
ericbek
Капитан
 
Сообщений: 169
Зарегистрирован: Сб май 31, 2003 9:19 pm
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

cron