كيفية إستدعاء دالة في الفاست ريبورت؟
#1
السلام عليكم
تقبل الله صيامكم
هل هناك مثال على كيفية إستدعاء دالة مكتوبة في البرنامج داخل الفاست ريبورت
الرد
#2
و عليكم السلام و رحمة الله

تقبل الله منا منكم

1. إنشاء الدالة
كود :
function TForm1.MyFunc(i: Integer): String; begin if i>0 then   result:='pos +' else   result:='neg -'; end;

2. نضيف الحدث UserFunction الخاص بـ frxReport المستعمل ( هذا الحدث يعتبر مسير الدوال الخارجية للمكون frxReport )

كود :
if MethodName = 'MYFUNC' then    Result := MyFunc(Params[0])

3. لإضافة الدالة لقائمة دوال الفاستريبورت نضعها في onCreate أو onShow
كود :
frxReport1.AddFunction('function MyFunc(i: Integer):String');

4. إستدعاء الدالة من داخل التقرير ( وقت التنفيذ)
ضع memo و نصها يكون كمثال  [MyFunc(10)]
[-] كل من 3 users say قال شكرا ل Lam.Abdeldjalil على المشاركة المفيدة
  • أبو معاذ, ALG2009, igidher
الرد
#3
الله يرضى عليك لقد فهمتها الآن
جزاك الله خيرا وزادك من علمه
الرد
#4
السلام عليكم
لقد حاولت كثيرا دون فائدة

عندي الفاست ريبورت موظوع في وحده DataModule والدالة في الفورم1 طبقت كل شيء ولكن يعطيني خطأ بأن الدالة غير معرفة مع العلم أني ضمنت الـ unit1 في الداتا موديول والداتا موديول في الفورم 1
هكذا

DataModule
كود :
unit Unit3; interface uses   System.SysUtils, System.Classes, frxClass; type   TDataModule3 = class(TDataModule)     frxReport1: TfrxReport;     function frxReport1UserFunction(const MethodName: string;       var Params: Variant): Variant;   private     { Private declarations }   public     { Public declarations }   end; var   DataModule3: TDataModule3; implementation {%CLASSGROUP 'Vcl.Controls.TControl'} uses Unit2; {$R *.dfm} function TDataModule3.frxReport1UserFunction(const MethodName: string;   var Params: Variant): Variant; begin   if MethodName = 'MYFUNC' then Result := MyFunc(Params[0]) end; end.

الفورم2
كود :
type   TForm2 = class(TForm)   function myfunc(i:integer):string  ;     procedure FormCreate(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end; var   Form2: TForm2; implementation {$R *.dfm} uses Unit3; { TForm2 } { TForm2 } procedure TForm2.FormCreate(Sender: TObject); begin DataModule3.frxReport1.AddFunction('function MyFunc(i: integer):string'); DataModule3.frxReport1.ShowReport(); end; function TForm2.myfunc(i: integer): string; begin if i>0 then   result:='pos +' else   result:='neg -'; end; end.

ما المشكلة
زما هي الطريقة الصحيحة  هل أضع الدالة في الداتا موديول أي كل الدوال أضعها في الداتا موديول؟
الرد
#5
كود :
https://www.youtube.com/watch?v=4OOrB6gSO9M&list=PL1c7L5EsigqIeOVzehGNfdEx_ij9iiMYS&index=17&t=977s
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 2 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • ALG2009, Lam.Abdeldjalil
الرد
#6
تقبل الله صيامكم وقيامكم
الفيديو يشرح طريقة كتابة دالة داخل الفاست ريبورت المشكلة لا يمكن منادتها داخل فاسست ريبورت آخر ويجب كتابنها من جديد
الشرح في الاعلى الذي شرحه Lam.Abdeldjalil يفي بالغرض زطبقته يعمل بشكل جيد ويمكن مناات الدالة في اكثر من فات ريبورت
مشكلتي هي ان الفاست ريبورت موضوع في DataModule فلم استطع منادة الدالة وتأتيني رسالة بأن الدالة غير معرفة لا اعرف ما السبب لقد وضعت الكود الذي به الخطأ في رد سابق
الرد
#7
وعليكم السلام ورحمة الله

حلول :
جرب تعريف الوحدة Unit1 في التبويب Uses العلوي
تأكد ان الدالة public عامة وليست خاصة Private ويمكن رؤيتها من خارج الوحدة
جرب وضع الدالة في الوحدة Unit2 في الـ DataMoudel
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#8
نفس الشيء لم تعمل والله تعبتني
بدون داتا موديول تعمل
لما أضع الفات في داتا موديول لا تعمل والرسالة تقول الدالة غير معرفة وضعتها عامه ولم تنفع
الرد
#9
الكود شغال لا مشكلة فيه

فقط اضف التالي في الحدث التالي للتقرير بالداتا موديل

كود :
function TDataModule2.frxReport1UserFunction(const MethodName: string;   var Params: Variant): Variant; begin if MethodName = 'MYFUNC' then    Result := form1.MyFunc(Params[0]) end;

اضف الدالة التالية في النموذج في القسم العام

كود :
type   TForm1 = class(TForm)     BitBtn1: TBitBtn;     procedure BitBtn1Click(Sender: TObject);   private     { Private declarations }   public     function  MyFunc(i: Integer): String;   end;

وفي جسم الوحدة اضف الدالة كاملة

كود :
function TForm1.MyFunc(i: Integer): String; begin if i > 0 then   result:='pos +' + i.ToString else   result:='neg -'; end;


في زر استدعاء التقرير 

كود :
DataModule2.frxReport1.AddFunction('function MyFunc(i: Integer):String'); DataModule2.frxReport1.ShowReport()


بالتوفيق
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • Lam.Abdeldjalil
الرد
#10
لا إله إلا الله محمد رسول الله

الخطأ كان هنا
كود :
  if MethodName = 'MYFUNC' then Result := MyFunc(Params[0])

والصحيح هو ينقص form1 قبل MyFunction
كود :
if MethodName = 'MYFUNC' then   Result := form1.MyFunc(Params[0])

جزاك الله خيرا وزادك من علمه
[-] كل من 2 users say قال شكرا ل ALG2009 على المشاركة المفيدة
  • Delphi4Us, Lam.Abdeldjalil
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم