المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
السلام عليكم
تقبل الله صيامكم
هل هناك مثال على كيفية إستدعاء دالة مكتوبة في البرنامج داخل الفاست ريبورت
المشاركات : 840
المواضيع 49
:
: 65
الإنتساب : Jun 2010
و عليكم السلام و رحمة الله
تقبل الله منا منكم
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)]
المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
الله يرضى عليك لقد فهمتها الآن
جزاك الله خيرا وزادك من علمه
المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
السلام عليكم
لقد حاولت كثيرا دون فائدة
عندي الفاست ريبورت موظوع في وحده 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.
ما المشكلة
زما هي الطريقة الصحيحة هل أضع الدالة في الداتا موديول أي كل الدوال أضعها في الداتا موديول؟
المشاركات : 1,370
المواضيع 331
:
: 1,045
الإنتساب : Nov 2013
كود :
https://www.youtube.com/watch?v=4OOrB6gSO9M&list=PL1c7L5EsigqIeOVzehGNfdEx_ij9iiMYS&index=17&t=977s
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
تقبل الله صيامكم وقيامكم
الفيديو يشرح طريقة كتابة دالة داخل الفاست ريبورت المشكلة لا يمكن منادتها داخل فاسست ريبورت آخر ويجب كتابنها من جديد
الشرح في الاعلى الذي شرحه Lam.Abdeldjalil يفي بالغرض زطبقته يعمل بشكل جيد ويمكن مناات الدالة في اكثر من فات ريبورت
مشكلتي هي ان الفاست ريبورت موضوع في DataModule فلم استطع منادة الدالة وتأتيني رسالة بأن الدالة غير معرفة لا اعرف ما السبب لقد وضعت الكود الذي به الخطأ في رد سابق
المشاركات : 1,370
المواضيع 331
:
: 1,045
الإنتساب : Nov 2013
وعليكم السلام ورحمة الله
حلول :
جرب تعريف الوحدة Unit1 في التبويب Uses العلوي
تأكد ان الدالة public عامة وليست خاصة Private ويمكن رؤيتها من خارج الوحدة
جرب وضع الدالة في الوحدة Unit2 في الـ DataMoudel
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
نفس الشيء لم تعمل والله تعبتني
بدون داتا موديول تعمل
لما أضع الفات في داتا موديول لا تعمل والرسالة تقول الدالة غير معرفة وضعتها عامه ولم تنفع
المشاركات : 1,370
المواضيع 331
:
: 1,045
الإنتساب : Nov 2013
27-04-2022, 12:26 AM
(آخر تعديل لهذه المشاركة: 27-04-2022, 12:27 AM بواسطة Delphi4Us.)
الكود شغال لا مشكلة فيه
فقط اضف التالي في الحدث التالي للتقرير بالداتا موديل
كود :
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()
بالتوفيق
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
المشاركات : 384
المواضيع 69
:
: 149
الإنتساب : Dec 2008
لا إله إلا الله محمد رسول الله
الخطأ كان هنا
كود :
if MethodName = 'MYFUNC' then
Result := MyFunc(Params[0])
والصحيح هو ينقص form1 قبل MyFunction
كود :
if MethodName = 'MYFUNC' then
Result := form1.MyFunc(Params[0])
جزاك الله خيرا وزادك من علمه