مرجع حل Delphi + Word هذه هي العديد من الوظائف التي قمت بها أثناء المشروع. الآن أخرجها وشاركها مع الجميع. (آمل أن يتمكن بعض الأصدقاء من إضافة وظائف جديدة، أو تحويلها إلى حزم أو libs، وما إلى ذلك، لجعلها أكثر ملاءمة للجميع لاستخدامها. ليس لدي الوقت بنفسي، هاها) قبل الاستخدام، قم بإنشاء ملف WORD فارغ كقالب وفقًا لاحتياجاتك في القالب، يتم تعيين التنسيقات والنصوص المختلفة في الملف. بالإضافة إلى ذلك، فإن معلمة PRnWordTable هي عنصر تحكم من النوع TDBGridEh، وهو مأخوذ من Ehlib2.6. وقد قمت أيضًا بكتابة وظيفة shFileCopy (المستخدمة لنسخ الملفات) ووظيفة guiInfo (المستخدمة لعرض مربع الرسالة). الرموز مرفقة أيضًا. رمز العينة كما يلي: وظائف إكمال الكود: 1. استبدل النص "#TITLE#" في قالب الطباعة بـ "Demo Code 1" 2. وأدخل المحتوى المعروض حاليًا بواسطة عنصر التحكم DBGridEh1 في نهاية المستند 3. أدخل سطرًا فارغًا في نهاية المستند 4. أدخل سطرًا جديدًا من النص في نهاية المستند 5. قم بإزالة الأسطر الفارغة في المستند إذا كان PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC ') ثم ابدأ PrnWordReplace('#TITLE#','الرمز التجريبي 1'); PrnWordTable(DBGridEh1); PrnWordInsert(''); p',true); PrnWordSave end; // طباعة الكلمات (جزء الإعلان) wDoc,wApp:Variant; function PrnWordBegin(tempDoc,docName:String):boolean; function PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; وظيفة منطقية؛ الزائد؛ PrnWordInsert(var imgInsert:TIImage;sBookMark:String=''):boolean;overload; function PrnWordInsert(var ChartInsert:TChart;sBookMark:String=''):boolean;وظيفة التحميل الزائد PrnWordTable(var dbG:TDBGridEh;sBookMark:String='' ) : boolean; الإجراء PrnWordSave ; { الوظيفة: إنشاء ملف هدف جديد docName بناءً على ملف القالب tempDoc وفتح الملف } function PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false; // انسخ القالب if tempDoc<>'' ثم if ليس shFileCopy(tempDoc, docName) ثم الخروج؛ // الاتصال بـ Word حاول wApp:=CreateOleObject('Word.application'); باستثناء guiInfo('الرجاء تثبيت Microsoft Word أولاً.'); end; حاول // افتح إذا كان tempDoc='' ثم ابدأ // أنشئ مستندًا جديدًا wDoc:=wApp.Document.Add; wDoc.SaveAs(docName); Documents.Open(docName); باستثناء guiInfo('فشل في فتح القالب، يرجى التحقق مما إذا كان القالب صحيحًا. '); wApp.Quit; end; wApp.Visible:=true; result:=true;end; { الوظيفة: استخدم newText لاستبدال محتوى docText bSimpleReplace : عندما يكون صحيحًا، يتم إجراء الاستبدال البسيط فقط، وعندما يكون false، معالجة النص } وظيفة PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace. ثم ابدأ // معالجة بسيطة، وقم بإجراء عملية الاستبدال مباشرةً، حاول wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; Text :=newText; wApp.Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchCase := False; Find.MatchWildcards := False; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); Lines.Clear; reWord.Lines.Add(newText); حاول // تحديد الموقع خلف الموضع المراد استبداله wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wApp.Selection; .Find.Format := False; wApp.Selection.Find.MatchWholeWord := False; wApp.Selection.Find.MatchByte := True; wApp.Selection.MatchWildcards := False; MatchAllWordForms := False; wApp.Selection.MoveRight(wdCharacter,1); // ابدأ في إدراج سطرًا تلو الآخر لـ i:=0 إلى reWord.Lines.Count-1 ابدأ // أدخل السطر الحالي wApp.Selection.InsertAfter(reWord.Lines[i) ]) ; // باستثناء السطر الأخير، أضف أسطرًا جديدة تلقائيًا إذا كان i<reWord.Lines.Count-1 ثم wApp.Selection.InsertAfter(#13); // حذف علامة الاستبدال wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := wApp.Selection.Find.Replacement.Text := ''; .Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchCase := False; MatchWildcards := False; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); { الوظيفة: طباعة المحتوى المعروض حاليًا بواسطة TDBGridEh، استنادًا إلى تنسيق ومحتوى عنصر التحكم TDBGridEh ، يتم إنشاء جدول Word تلقائيًا عند الإشارة المرجعية sBookMark في المستند الأسطر) والإجماليات السفلية والميزات الأخرى. sBookMark : Word اسم الإشارة المرجعية التي سيتم إدراجها في الجدول } وظيفة PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;var iCol,iLine,i,j,k:Integer;wRange:Variant;iRangeEnd:longint;iTitleLine:Integer; عدد صحيح;العنوان الأخير:سلسلة;بدء النتيجة: = خطأ حاول // حساب عدد الأعمدة في الجدول (باستثناء الأعمدة المخفية) iTitleLine:=1; // الافتراضي دائمًا هو 1 iCol:=0; ابدأ إذا كان dbG.Columns[i].Visible ثم ابدأ iCol:=iCol+1; end; dbG.DataSource.DataSet.Active ثم iLine:=dbG.DataSource.DataSet.RecordCount else iLine:=0; في نهاية المستند iRangeEnd:=wDoc.Range.End-1; إذا كان iRangeEnd<0 إذن iRangeEnd:=0; wRange:=wDoc.Range(iRangeEnd,iRangeEnd); Add(wRange,iGridLine,iCol); wTable.Columns.AutoFit; j:=1 إلى dbG.Columns.Count ابدأ إذا كان dbG.Columns[j-1].Visible ثم ابدأ إذا dbG.UseMultiTitle ثم ابدأ titleList:=strSplit(dbG.Columns[j-1].Title.Caption,' |'); wTable.Cell(1,k).Range.InsertAfter(titleList.Strings[0]); wTable.Cell(1,k).Range.InsertAfter(dbG.Columns[j-1].Title.Caption); // تعيين محاذاة الخلية إذا كان dbG.Columns[j-1].Title.Alignment=taCenter ثم wTable. الخلية (1، ك).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter وإلا إذا dbG.Columns[j-1].Title.Alignment=taRightJustify ثم wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight وإلا إذا كان dbG.Columns[j-1].Title.Alignment=taLeftJustify ثم wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; end; // املأ كل صف إذا كان iLine>0 ثم ابدأ dbG.DataSource.dataset.DisableControls; DataSource.DataSet.First; for i:=1 to iLine Do begin k:=1; dbG.Columns.Count ابدأ إذا كان dbG.Columns[j-1].Visible ثم ابدأ إذا dbG.Columns[j-1].FieldName<>'' ثم // تجنب الأخطاء بسبب الأعمدة الفارغة تبدأ // إذا كان العمود إذا كانت لديك وظيفة عرض التنسيق الخاصة بك، فاتصل بوظيفة العرض للحصول على سلسلة العرض getTextText:=''; المعينة (dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) ثم تبدأ dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName),getTextText,getTextDisplay); wTable.Cell(i+iTitleLine,k).Range.InsertAfter(getTextText); ( dbG.Columns[j-1].FieldName).AsString end;