MOHSEN731
جمعه 25 اردیبهشت 1383, 23:29 عصر
با سلام
من یک گزارش با qreport در دلفی 5 طراحی کردم که لیست حقوق کارکنان را چاپ می کند حال می خواهم تا کاربر این امکان را داشته باشد تا گزارش را از qreport به نرم افزار word تبدیل کند آیا کامپوننتی برای اینکار وجود دارد (Qreport to Word)
:?: :?: :?: ممنون
ahmad sajjad
یک شنبه 21 تیر 1383, 22:37 عصر
یعنی کسی نیست که جواب این سوال رو بلد باشه
اگه کسی بلده بگه تا ما هم یاد بگیریم
nasr
یک شنبه 21 تیر 1383, 23:20 عصر
با QRtextFilter می تونی بصورت Text وارد Word کنی
اگه نتونستی بگو تا یه نمونه برنامه برات ارسال کنم
_alish_
سه شنبه 23 تیر 1383, 15:16 عصر
البته با دلفی 5 و رورد 97 انجام دادم ولی در دلفی 6و7 اول ایرارد می گیرد که اگر دوباره پارامترها را بنویسید درست می شه
البته فابل اچ تی ام ال اون نتونستن Upload کنم past کردم خدا کنه همه چیز افتاده باشه
باword 97 این را باز کنید
راهنمـا
OleServer Word
--------------------------------------------------------------------------------
متغیر های ضروری
vParam: OleVariant
cDoc: string;
باز کردن Document درون word
نام فایل+مسیرفایل
به یک متغیر Olevariant نیاز است
برای باز کردن فایل doc بدون پارامتر(با این کار word نیز بطور خودکار باز خواهد شد.)
اتصال component ، worddocument1 به صفحه باز شده درون word
نمایش پنجره word
CDoc:=extractfilepath(application.exename)+'PageA4 .doc ';
vParam:=cDoc;
WordApplication1.Connect;
WordApplication1.Documents.Open(vparam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDoc ument);
WordApplication1.visible:=false;
vParam:=false;
روشی برای بردن متن به صفحه بازشده درون Word استفاده از ClipBoard میباشد.
برای قرار دادن هر Field Record بهتر است یک متن پیش ساخته داشته باشیدو پس از باز کردن آن با دستور بالا واستفاده از BookMark در Word جایگاه هر کدام را تعیین کنید.شما می توانیدبه صفحه خود با امکانات Wordجلوه زیبا دهید.
نکته 1: باید برای bookmark این تابع را در برنامه خود اضافه نمایید.
نکته 2: توجه داشته باشید در صورت استفاده از صفحه پیش سا خته پس از وارد کردن فیلدها bookmark ها از بین نروند و یا کاربر متن را بر روی صفحه پیش ساخته ذخیره ننماید تا bookmarkها از بین روند.(من برای جلوگیری از این کار فایلهای مربوطه را readonlyنموده ام).
نکته 3 : به علت اینکه پس از استفاده از bookmark آنها حذف می شوند.پس به کاربر پیغام دهید پس از استفاده از آن آنرا ببندد.برای همین من در تابع bookmark از boolean استفاده کرده ام که در صورت بروز استثناء به کاربر پیغام خطا دهم
استفاده از BookMark :
function Tinptfrm.GotoBookmark(Bookmark : string):boolean;
var
What : OLEVariant;
Which : OLEVariant;
Count : OLEVariant;
Name : OLEVariant;
Begin
try
What := wdGoToBookmark;
Which :=unAssigned;
Count :=unAssigned;
Name := Bookmark;
WordApplication1.Selection.GoTo_(What, Which, Count, Name);
GotoBookMark:=True;
Except
messageDlg('متن پیش فرض (چاپ قبلی)را ببندید',MTError,[MBOK],0);
GotoBookMark:=false;
WordApplication1.visible:=true;
end;
end;
اگر bookmark وجود داشت
درستور مربوطه متن انتخاب شده بوسیله تابع bookmark را با متن درون بانک جایگزین میکند و نوع فونت و سایز آن مطابق متن bookmark در می آید
if gotobookmark('matn')=false then exit;
WordApplication1.ActiveDocument.Application.Select ion.Set_Text(Dmod.master.fieldvalues['matn']);
قرار دادن Header
توسط این دستورمیتوان کار View/Header and footer… درون word را به طور اتومات از درون برنامه انجام داد
wdSeekCurrentPageFooter برای footer
WordApplication1.ActiveDocument.ActiveWindow.Activ ePane.View
.SeekView := wdSeekCurrentPageHeader;
نکته: درون پنجره header نمیتوان از bookmark استفاده کرد پس بهتر است از Set_Text ،typetext ویا ازclipboard استفاده کنید.
Save نکردن متن بدون سوال از کاربر:
SaveChanges : OLEVariant;
OriginalFormat : OLEVariant;
RouteDocument : OLEVariant;
...
SaveChanges := wdDoNotSaveChanges;
OriginalFormat := unAssigned;
RouteDocument := unAssigned;
WordApplication1.ActiveDocument.close(SaveChanges, OriginalFormat, RouteDocument);
تا بع MoveRight
این تابع برای خلاصی از انتخاب و حرکت مکانما به سمت راست استفاده میشود
procedure Tinptfrm.MoveRight(Count : integer);
var
MoveUnit : OleVariant;
vCount : OleVariant;
Extended : OleVariant;
begin
MoveUnit :=EmptyParam;
vCount := Count;
Extended := unassigned;
WordApplication1.selection.MoveRight(MoveUnit, vCount, Extended);
end;
برای انتخاب تمام متن یک document
WordApplication1.ActiveDocument.Select
کپی متن انتخابی درون clipboard
past از clipboard به صفحه
WordApplication1.ActiveDocument.Application.Select ion.Copy;
WordApplication1.ActiveDocument.Application.Select ion.Paste;
Print:
WordDocument1.PrintOut((
EmptyParam, EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
(EmptyParam,EmptyParam);
بستن صفحه :
WordDocument1.Close(vParam);
WordDocument1.Disconnect;
اضافه کردن صفحه New:
(WordApplication1.Documents.Add(EmptyParam, EmptyParam;
انتخاب ، فونت ، سایز ،استیل :
من در مورد تغییر سایز متن فارسی نتوانستم به طور مستقیم کاری کنم زیرا متن انگلیسی ساز آن با شماره وارد شده یزرگ و کوچک میشود ولی متن فارسی را من با bookmarkیا از طریق زیر بزرگ و کوچک میکردم
var
S: Selection;
d:pagesetup;
begin
S := WordApplication1.Selection;
S.Font.Bold := integer(True);
s.Font.Size:=18;
s.Font.Name:='lotus’;
S.TypeText(‘TEXT’);;
S.Font.Bold := integer(False);
s.Font.Size:=18;
s.Font.Name:='lotus’;
S.TypeText(‘مصطفی’(
این روش خصوصیت یک متن را مثل bookmark درون متغییرهای قرار داده
متن را از حالت انتخاب در آورده deselect
ایجاد پاراگراف جدید
متن را در کنار متن قبلی قرار میدهد
Var
Fontsize:single;
Fontname:widestring;
Fontbold : Integer;
fontsize:=WordDocument1.Range.Font.Get_Size;
fontname:=WordDocument1.Range.Font.Get_Name;
fontbold:=WordDocument1.Range.Font.Get_Bold;
moveright(1);
WordApplication1.ActiveDocument.Application.Select ion.InsertParagraph;
WordDocument1.Range.Font.set_Size(fontsize);
WordDocument1.Range.Font.set_Name(fontname);
WordDocument1.Range.Font.Set_Bold(fontbold);
WordApplication1.ActiveDocument.Application.Select ion.InsertAfter(str);
تراز کردن متن:
از دو طرف
WordApplication1.Selection.ParagraphFormat.Alignme nt:=wdAlignParagraphJustify;
تنظیم طول پنجره Header:
WordApplication1.ActiveDocument.PageSetup.Set_Head erDistance(2);
نوشتن متن :
تایپ شده
انتخاب شده s:selection
قرار دادن بعد یا قبل متن
WordApplication1.ActiveDocument.Application.Select ion.TypeText(str
);
S := WordApplication1.Selection;
s.Set_Text(str
);
WordApplication1.ActiveDocument.Application.Select ion.InsertBefore(str);
Find/Replace :
Var
SearchText, ReplaceText, Wrap, All: OleVariant;
TextRange: Range;
Begin
{ Replace text }
SearchText := 'alish';
ReplaceText := 'asd';
Wrap := wdFindContinue;
All := wdReplaceAll;
WordDocument1.Content.Find.Execute(SearchText, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, Wrap,
EmptyParam, ReplaceText, All);
بستن word :
destructor Tinptfrm.quit;
var
SaveChanges : OLEVariant;
OriginalFormat : OLEVariant;
RouteDocument : OLEVariant;
begin
SaveChanges := wdDoNotSaveChanges;
OriginalFormat := unAssigned;
RouteDocument := unAssigned;
Wordapplication1.Quit(SaveChanges, OriginalFormat, RouteDocument);
end;
saveas :
procedure Tinpfrm.SaveAs(Filename : string);
begin
OLEVariant(wordapplication1).ActiveDocument.SaveAs (FileName);
end;
این موارد را کامل تست نکرده ام فقط یکبار انجام داده و نتیجه گرفته ام و حالا تقریباً دارم ذهنی آنها را تایپ میکنم شاید مقداری اشتباه باشد.
فرمت یک پاراگراف:
With WordApplication1.ActiveDocument.Application.Select ion.ParagraphFormat do
begin
LeftIndent = InchesToPoints(0);
RightIndent = InchesToPoints(0);
SpaceBefore = 0;
SpaceAfter = 0;
LineSpacingRule = wdLineSpaceSingle;
Alignment = wdAlignParagraphLeft;
WidowControl = True;
KeepWithNext = False;
KeepTogether = False;
PageBreakBefore = False;
NoLineNumber = False;
Hyphenation = True;
FirstLineIndent = InchesToPoints(0);
OutlineLevel = wdOutlineLevelBodyText;
End;
قرار دادن break :
WordApplication1.ActiveDocument.Application.Select ion.InsertBreak:=wdPageBreak یا wdSectionBreakNextPage
ایجاد جدول :
WordApplication1.ActiveDocument.Tables.Add(WordApp lication1.ActiveDocument.application.Selection.Ran ge,3,3);
اگر اشتباه وجود داشت به بزرگواری خودتان ببخشید.
MOHSEN731
شنبه 27 تیر 1383, 18:02 عصر
ممنون از بزرگواریت :flower:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.