Консультация № 29287
10.11.2005, 07:27
0.00 руб.
0 3 3
Есть программа по подсчёту премии. Но она врёт на копейки. Вопрос такой
как информацию из DBGrid перенести в ворд, вместо Фаст Репорта, для дальнейшего редактирования, посредством Делфи? И вообще возможно ли это?
P.S.Высылаю исходник программы.

Приложение:
unit fmbonus;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids, DBGrids, DB, DBTables, Mask, ToolEdit, CurrEdit, RXDBCtrl, Buttons, ImgList, ToolWin, FR_Class, FR_DSet, FR_DBSet;type TBonusForm = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; cbMonth: TComboBox; DataSource: TDataSource; ceGeneralSum: TRxCalcEdit; ImageList: TImageList; ToolBar1: TToolBar; NewBtn: TToolButton; RefreshBtn: TToolButton; ToolButton1: TToolButton; PrintBtn: TToolButton; BonusGrid: TRxDBGrid; DeleteBtn: TToolButton; DefaultBtn: TToolButton; ToolButton2: TToolButton; edYear: TEdit; udYear: TUpDown; Label3: TLabel; ToolButton3: TToolButton; ExitBtn: TToolButton; frReport: TfrReport; frDBDataSet: TfrDBDataSet; procedure FormCreate(Sender: TObject); procedure ceGeneralSumChange(Sender: TObject); procedure PrintBtnClick(Sender: TObject); procedure DefaultBtnClick(Sender: TObject); procedure NewBtnClick(Sender: TObject); procedure RefreshBtnClick(Sender: TObject); procedure ExitBtnClick(Sender: TObject); procedure DeleteBtnClick(Sender: TObject); procedure frReportGetValue(const ParName: String; var ParValue: Variant); private { Private declarations } public { Public declarations } end;var BonusForm: TBonusForm;implementationuses rxStrUtils, dmbonus, ShellApi;{$R *.dfm}procedure TBonusForm.FormCreate(Sender: TObject);var Y, M, D : Word;begin BonusData.SumValue := 10000; ceGeneralSum.Value := BonusData.SumValue; DecodeDate(Date,Y,M,D); cbMonth.ItemIndex := M-1; udYear.Position := Y;end;procedure TBonusForm.ceGeneralSumChange(Sender: TObject);begin with BonusData do begin SumValue := ceGeneralSum.Value; if taPremiya.Active then taPremiya.Refresh; end;end;procedure TBonusForm.frReportGetValue(const ParName: String; var ParValue: Variant);begin if AnsiCompareText(ParName, ‘MONTH‘) = 0 then ParValue := cbMonth.Text + ‘ ‘ + edYear.Text;end;procedure TBonusForm.PrintBtnClick(Sender: TObject);begin frReport.LoadFromFile(‘BonusList.frf‘); if frReport.PrepareReport then frReport.ShowPreparedReport;end;procedure TBonusForm.DefaultBtnClick(Sender: TObject);begin with BonusData.taPremiya do begin DisableControls; First; while not Eof do begin Edit; FieldByName(‘TAR‘).asFloat := FieldByName(‘TARN‘).asFloat; Post; Next; end; First; EnableControls; end;end;procedure TBonusForm.NewBtnClick(Sender: TObject);begin BonusData.taPremiya.Insert;end;procedure TBonusForm.DeleteBtnClick(Sender: TObject);begin if MessageDlg(‘Удалить запись?‘, mtConfirmation, [mbYes, mbNo], 0) = mrYes then BonusData.taPremiya.Delete;end;procedure TBonusForm.RefreshBtnClick(Sender: TObject);begin BonusData.taPremiya.Refresh;end;procedure TBonusForm.ExitBtnClick(Sender: TObject);begin Close;end;end.

Обсуждение

давно
Мастер-Эксперт
425
4118
10.11.2005, 08:18
общий
это ответ
Здравствуйте, Vbhjndjhtw!
Чтобы расчеты не врали на копейку, надо сделать 3 или 4 знака после запятой. У Вас, скорее всего, ошибка в последнем разряде, поэтому этот последний разряд надо отодвинуть, чтобы его ошибки не влияли на результат.
Дальше, зачем Вам пересылать данные в Word, чтобы все равно редактировать в Дельфи? Бессмыслица. Может быть Вы поясните, зачем это?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
10.11.2005, 09:53
общий
это ответ
Здравствуйте, Vbhjndjhtw!
Я использую "Ek RTF Report for Delphi". Простой компонент, позволяет выводить таблицы в шаблон в формате rtf. Это позволяет конечному пользователю создавать свои шаблоны (формы документов).
Хотя раньше я генерировал файл RTF впрямую, это тоже достаточно просто

Приложение:
Ek RTF Report for DelphiVersion 3.01 (D4, D5, D6, D7)CONTENTS1. Component description2. History3. License4. Installation5. Troubleshooting.6. Contact information1. COMPONENT DESCRIPTIONTEkRtf report is non visual component that allows you to use all power of MS Word or other rtf-compatible editorto create, preview, edit and print your reports.How to use it:- create report template in MS Word- save it in RTF format- place TEkRTF component on form, fill required properties- prepare data in your application- run report using one of Execute methods- run MS Word (or other editor) if you want to view, edit or print your documentFor more information see help and demo application.go topRegistered users will receive source code and updates applicable for current version.To register this product goto http://ekrtf.code.net.ru/reg.html Also you may go todirectly to registration pagego top4. INSTALLATION1. Uninstall previous version of EkRTF:Select "Component/Install Packages" from the Delphi IDE. Select the package file ecomp.bpl,click "Remove" button, click "OK". Select the package file edsn.bpl, click "Remove" button, click "OK".2. Install package ecomp.bpl:Select "Component/Install Packages" from the Delphi IDE. Press "Add" button. Select file ecomp.bpl,3. Install package edsn.bpl the same way as ecomp.bpl4. Select "Tools/Environment Options" from the Delphi IDE.5. Select the "Library" tab.6. Check the path to *.dcu files in "Library Path" edit box. It must reference to location where is thenew version of EK RTF components. Installed component will appear on "Data Access" panel.HELP INSTALLATION:1. Remove all previous versions of help from your computer.2. Delete lines referencing to ekrtf from DELPHI7.CNT (DELPHI6.CNT, DELPHI5.CNT, DELPHI4.CNT), DEL6VCL.CNT.3. Unpack new help files in some directory of your drive.There is no necessary to create multiple copies of help files for each version of Delphi.4. In Delphi IDE choose "Help/Customize". "Open Help" window will appear.5. Click on "Link" section. Click "Edit/Add files". Choose ekrtf.hlp.6. Click on "Index" section. Click "Edit/Add files". Choose ekrtf.hlp.7. Click "File/Save project"ATTENTION: Sometimes "Open help" doesn‘t work. In this case you may install help file manually:Remove EK RTF links from "Open Help" project;Edit file DELPHI7.CNT (DELPHI6.CNT, DELPHI5.CNT, DELPHI4.CNT):After line:Title Delphi Helpadd:Index TEkRTF report component=full_path\ekrtf.hlpIn addition, for Delphi 6 edit file del6vcl.cnt - after line:Title VCL Referenceadd:Index TEkRTF report component=full_path\ekrtf.hlpDelete file Delphi7.gid (Delphi6.gid, Delphi5.gid, Delphi4.gid) in Delphi help directory, to initiate help index rebuild on next help request in Delphi.go top5. TROUBLESHOUTINGBefore running demo projects, check that you have application associated with doc and rtf files.Otherwise output files will be saved on disk, but will not open automatically.Delete all pathes from menu Tools\Enviroment options\Library\Directories\ which references toold versions of component. If compiled programm cannot find input rtf file and generates exception placeyour compiled exe file into project source directory (directory with source rtf files) or type full path and filename in property "InputFile".Check a FAQ pagego top6. CONTACT INFORMATIONif you have any questions, comments or suggestions email to support@code.net.ruSee the latest version of Ek RTF Report on component home page at http://ekrtf.code.net.rugo top
Неизвестный
10.11.2005, 14:54
общий
это ответ
Здравствуйте, Vbhjndjhtw!
Высылаю исходник модуля, упрощающего работу автоматизации M$ Word.
Необходимые константы можно взять в самом Ворде (я их выделил в отдельный файл, слишком большой для аттача)


Приложение:
unit uWordApp;{* Модуль для полегшення роботи з MS Word Automation}interface uses ComObj;//{$I wdconst.inc} function CentimetersToPoints(cm : Single) : Single; {* перетворює сантиметри в точки} procedure NewDocument(var Wrd : Variant; visible : Boolean); {*Створює новий документ} procedure PageMargins(l,r,t,b : Single; var wrd : Variant); {*Встановлює поля} procedure HFDistance(h,f : Single; var wrd : Variant); {*Встановлює відступи для колонтитулів зверху і знизу} procedure FontSize(sz : Integer; var Wrd : Variant); {*Встановити розмір шрифта} procedure FontBold(Bold : Boolean; var Wrd : Variant); {*Встановити жирність шрифта} procedure FontItalic(Italic : Boolean; var Wrd : Variant); {*Встановити курсив шрифта} procedure FontName(name : String; var wrd : Variant); {*Ім‘я шрифта (напр. ‘Courier New‘)} procedure ParagraphAlign(align : Integer; var Wrd : Variant); {*Встановлює вирівнювання абзаца} procedure AddTabPosition(pos : Single; var wrd : Variant); {*Додає позицію табуляції в pos см} procedure AddText(s : String; var wrd : Variant); {*Додати рядок тексту} procedure CreateTable(Col,Row : Integer; var wrd : Variant); {*Створити таблицю з атрибутами оп замовчуванню} Procedure SetColWidth(wid : Single; var wrd : Variant); {*Встановлює ширину стовпця cln в таблиці tb в точках} Procedure MergeCells(count : Integer; var Wrd : Variant); {*Об‘єднати вказані ячейки. Курсор повинен знаходитись в перші з них} procedure GotoNextCell(wrd : Variant); {*Перейти на наступну ячейку. Якщо таблиця закінчилась, додати новий рядок} Procedure ExitTable(wrd : Variant); {*Вийти з таблиці коли всі дані вже внесені} implementation function CentimetersToPoints(cm : Single) : Single; begin Result := cm * 28.34646; end; procedure NewDocument(var Wrd : Variant; visible : Boolean); begin Wrd := CreateOleObject(‘Word.Application‘); Wrd.Visible := Visible; Wrd.Documents.Add; Wrd.Application.WindowState := wdWindowStateMaximize; end; procedure PageMargins(l,r,t,b : Single; var wrd : Variant); begin Wrd.ActiveDocument.PageSetup.LeftMargin := CentimetersToPoints(l); Wrd.ActiveDocument.PageSetup.RightMargin := CentimetersToPoints(r); Wrd.ActiveDocument.PageSetup.TopMargin := CentimetersToPoints(t); Wrd.ActiveDocument.PageSetup.BottomMargin := CentimetersToPoints(b); end; procedure HFDistance(h,f : Single; var wrd : Variant); begin Wrd.ActiveDocument.PageSetup.HeaderDistance := CentimetersToPoints(h); Wrd.ActiveDocument.PageSetup.FooterDistance := CentimetersToPoints(f); end; procedure FontName(name : String; var wrd : Variant); begin Wrd.Selection.Font.Name := name; end; procedure FontSize(sz : Integer; var Wrd : Variant); begin Wrd.Selection.Font.Size := sz; end; procedure FontBold(Bold : Boolean; var Wrd : Variant); begin Wrd.Selection.Font.Bold := Bold; end; procedure FontItalic(Italic : Boolean; var Wrd : Variant); begin Wrd.Selection.Font.Italic := Italic; end; procedure AddText(s : String; var wrd : Variant); begin Wrd.Selection.TypeText(s); end; procedure AddTabPosition(pos : Single; var wrd : Variant); begin Wrd.Selection.ParagraphFormat.TabStops.Add(CentimetersToPoints(pos),wdAlignTabLeft,wdTabLeaderSpaces); end; procedure ParagraphAlign(align : Integer; var wrd : Variant); begin Wrd.Selection.ParagraphFormat.Alignment := align; end; procedure CreateTable(Col,Row : Integer; var wrd : Variant); begin Wrd.ActiveDocument.Tables.Add(Wrd.Selection.Range,row,col,wdWord9TableBehavior,wdAutoFitContent); end; Procedure SetColWidth(wid : Single; var wrd : Variant); begin Wrd.Selection.Columns.SetWidth(wid, wdAdjustProportional); end; procedure GotoNextCell(wrd : Variant); begin Wrd.Selection.MoveRight(wdCell); end; Procedure MergeCells(count : Integer; var Wrd : Variant); begin Wrd.Selection.MoveRight(wdCharacter,count,wdExtend); Wrd.Selection.Cells.Merge; end; Procedure ExitTable(wrd : Variant); begin Wrd.Selection.MoveDown(wdLine,1); end;end.
Форма ответа