كيفية إستدعاء دالة في الفاست ريبورت؟
#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 ) ضيف كريم