على الفورم FFactureEtStatistique دائما ، نمر إلى الصفحة : Consultation De Cesse
على هذه الأخيرة نريد إظهار المبلغ الإجمالي لكل المبيعات ، المبلغ الإجمالي لكل الديون ، كل المبالغ المدفوعة ، و عليه نعرف كم يوجد في رصيد مؤسستنا (لهذه الأخيرة أقصد الرصيد نضيف sEdit أخرى ستأخذ الإسم sEdit21 )
- نحدد TabSheet6 و في الحدث OnShow لهذه الأخيرة نكتب :
كود :
(* Majmoo3e SommeVentes_Cesse *)
RecordPlaceSommeVentes_Cesse := FGSM.table2.GetBookmark;
MajmoueSommeVentes_Cesse:=0;
FGSM.table2.First;
while not FGSM.table2.Eof Do
begin
MajmoueSommeVentes_Cesse:=MajmoueSommeVentes_Cesse
+FGSM.table2.FieldByName('Prix_TTC').AsCurrency;
FGSM.table2.Next;
end;
sEdit18.Text:=CurrToStr(MajmoueSommeVentes_Cesse);
sEdit18.Text:=formatfloat('0.00',strtofloat(sEdit18.Text))+' DA';
(* Majmoo3e SommeDettes_Clients *)
RecordPlaceSommeDettes_Clients := FGSM.table7.GetBookmark;
MajmoueSommeDettes_Clients:=0;
FGSM.table7.First;
while not FGSM.table7.Eof Do
begin
MajmoueSommeDettes_Clients:=MajmoueSommeDettes_Clients
+FGSM.table7.FieldByName('Valeur_Reste').AsCurrency;
FGSM.table7.Next;
end;
sEdit19.Text:=CurrToStr(MajmoueSommeDettes_Clients);
sEdit19.Text:=formatfloat('0.00',strtofloat(sEdit19.Text))+' DA';
(* Majmoo3e SommeVersements_Clients *)
RecordPlaceSommeVersements_Clients := FGSM.table8.GetBookmark;
MajmoueSommeVersements_Clients:=0;
FGSM.table8.First;
while not FGSM.table8.Eof Do
begin
MajmoueSommeVersements_Clients:=MajmoueSommeVersements_Clients
+FGSM.table8.FieldByName('Somme_Versée').AsCurrency;
FGSM.table8.Next;
end;
sEdit20.Text:=CurrToStr(MajmoueSommeVersements_Clients);
sEdit20.Text:=formatfloat('0.00',strtofloat(sEdit20.Text))+' DA';
sEdit21.Text:=floattostr(strtofloat(CurrToStr(MajmoueSommeVentes_Cesse))
- (strtofloat(CurrToStr(MajmoueSommeDettes_Clients))
- strtofloat(CurrToStr(MajmoueSommeVersements_Clients)) ));
sEdit21.Text:=FormatFloat('0.00',StrToFloat(sEdit21.Text))+' DA';
إقتباس : - المطلوب : هناك شبه كامل و واضح بالنسبة لهذا العمل و ما يلزم فعله على الصفحة Historique Fournisseur ، المطلوب استعمال Query8-9 على التوالي و اتمام مايلزم .
المطلوب رفقة ما تقدم طرحه ، كل شيء بالمرفقات.
في المرة القادمة نبدأ في الطباعة .
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 11 أو الدرس الحادي عشر و الأخير من مشروع انجاز برنامج لتسيير المخزون و التسويق (GSM) . الجزء1
الموضوع : الطباعة
للطباعة هناك عدة تقارير منها ماهو مجاني و منها العكس ، منها ماهو صعب و منها العكس ، و لعل أشهرها و أبسطها (و مجاني أيضا_مرفق مع الدلفي) هو QuickRep ، يأتي مع دلفي6 بشكل أوتوماتيكي بعد التنصيب ، و مع دلفي7 يتم إضافته.
الآن لدينا عدة أمور حسب مشروعنا تتطلب الطباعة أما أنا فسأكتفي بطباعة شيء واحد أو إثنين ، و الباقي بنفس الأسلوب هو مهمتك أنت.
سنقوم باتاحة امكانية طباعة الفاتورة.
نقوم أولا بانشاء فورم جديد نسميه ( FPrintFacture ) و احفظ السورس الخاص بها تحت نفس الإسم مع تبديل أول حرف F بــ U .على هذا الفورم أو الصفحة نضيف QuickRep1 ، نحدد هذا الأخير و نذهب للخواص ، هناك عدة خواص أهمها و التي سنستخدمها :
1- الخاصية Bands :
تضم هذه الأخير ستة أقسام للصفحة المراد طباعتها ، نقوم بتفعيلها كلها إلا الأخير (HasTiltle) ، إذن نفعل خمسة:
- HasPageHeader هذه الأخيرة أو En-Tete de page هي القسم العلوي من صفحة الطباعة و التي ستبقى تظهر في كل صفحات الطباعة يعني هذا القسم سنقوم عليه باضافة معلومات المؤسسة من هاتف و اسمها التجاري و العنوان و غير ذلك و ممكن اسم الزبون و رقم الفاتورة و التاريخ لنستطيع تمييز الصفحة الثانية بأنها تابعة للأولى فلا تختلط الأمور ، فإذا اشترى الزبون سلعا كثيرة في فاتورة واحدة حيث تمثلت الطباعة في صفحتين يبقى رأس الصفحة هذا يتكرر في الصفحة الأولى و كل مايليها من صفحات مطبوعة .
HasColumnHeader : أو En-Tete de colonne : من تسمية هذا الأخير فهو واضح مثل الذي سبق و لكن يخص هذا عنوان الحقل في الجدول و يتكرر أيضا في كل الصفحات .
- HasDetail : هو جسم و تفاصيل الصفحة يعني يربط مع محتويات الحقول في الجدول المراد طباعتها .
- HasSummary يعني الخلاصة Résumé و في هذا القسم نضع المبلغ الإجمالي و ما إلى ذلك و لا يظهر هذا القسم أثناء الطباعة إلا في الصفحة الأخيرة ، سواء كانت الطباعة متمثلة في صفحة أو أكثر .
- HasPageFooter يعني Bas de Page أسفل الصفحة و يتكرر هذا القسم في كل الصفحات مثل الأول الذي يتكرر بالأعلى ، هذا يتكرر بالأسفل و نضع فيه رقم الصفحة .
كان هاذا عن الخاصية Bands ، الآن تملئ هذه الأقسام كل حسب مايراه و يقوم بالتجميل و كأنه في الوارد باستعمال العناصر مثلا : QRLabel-QRDBtext- QRShape ، و لكي لا نخوض في كل شيء هذا المرفق أدناه به مشروع من فورم واحد فقط و يحتوي تقرير الطباعة يمكنك عمل مثله أو بزيادة فيه حسب ماتره مناسبا ، لكن المهم نتفق على تسمية العناصر باللون الأحمر و الأزرق نثل التي عندي ، لكي لا نختلف على أسمائها أثناء البرمجة.
إذا كنت متمكنا من الأمر (تقريري كويكراب) يمكنك نسخه مباشرة بتحديده و الصاقه في مشروعنا على الصفحة أو الفورم FPrintFacture .
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 11 أو الدرس الحادي عشر و الأخير من مشروع انجاز برنامج لتسيير المخزون و التسويق (GSM) . الجزء 2
لازلنـا مع طباعة الفاتورة ، طيب الآن العنصر QuickRep1 يتعلق بالفاتورة ، و بيانات الفاتورة نجدها بكل تأكيد بــجدول المبيعات Vente و الذي جعلنا له في الفورم FFactureEtStatistique العنصر Query1 ، و على هذا يتوجب ربط QuickRep1 مع هذا الأخير ، يعني الخاصية DataSet للعنصر QuickRep1 نعطيها القيمة:
لدينا العناصر QrLabel اسمها يدل عليها ، هي مثل العناصر Label فقط هي خاصة بـ Quickrep ، و لدينا العناصر QrDBText اسمها أيضا كفيل بشرحها يعني هي خاصة بـ QuickRep و هي متعلقة بقاعدة البيانات (DB يعني DataBase) و على هذا فهذه الأخيرة يتوجب ربها مع قاعدة معينة ، و بكل تأكيد يتم ربطها كما تم مع QuickRep1 عن طريق الخاصية DataSet و نعطيها نفس القيمة :
يكون هذا مع كل العناصر الستة (QrDBText) و نحدد حقل كل واحد الذي يختلف عن غيره / مثلا QrDBText1 الذي يمثل رقم الفاتورة نعين الخاصية DataField باعطائها القيمة:
كود :
DataField=N_Fact
و نفس الشيء مع البقية . ملاحظة : لانكتب يدويا N_Fact ، فقط بمجرد تحديد قيمة DataSet ، نتمكن بــ DataField من رؤية كل الحقول المتضمنة ، و سنجد حتمــا الحقل N_Fact أو إذا سميته باسم غير ذلك فستجده ، المهم تقوم بتحديد الحقل المناسب ، و إن لم تظهر الحقول فتفقد الخلل ، هذا لنكون منهجيين و نتدارك الخلل في حينه .
- بعد اتمام ما سلف نحدد العنصر QuickRep1 و من الحدث OnStartPage نكتب :
17-02-2010, 07:34 PM (آخر تعديل لهذه المشاركة: 26-02-2011, 01:17 PM بواسطة kachwahed.)
السلام عليكم ورحمة الله
بارك الله لك أخي نبيل
مجهودك رائع يثمر عن موضوع أروع
كمساهمة صغيرة، رأيت في التقرير عبارة:
كود :
Arrêter la présente facture à la somme de:
أحسن ما وجدت لتحويل الأرقام إلى حروف (بالفرنسية) هذه الدالة:
كود :
function NombreEnLettres(n: Integer): string;
Const
unite: array [1 .. 19] of string = ('un', 'deux', 'trois', 'quatre', 'cinq',
'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize',
'quatorze', 'quinze', 'seize', 'dix sept', 'dix huit', 'dix neuf');
dizaineF: array [2 .. 9] of string = ('vingt', 'trente', 'quarante',
'cinquante', 'soixante', '', 'quatre-vingt', '');
dizaineB: array [2 .. 9] of string = ('vingt', 'trente', 'quarante',
'cinquante', 'soixante', 'septante', 'octante', 'nonante');
coefs: array [0 .. 3] of string = ('cent', 'mille', 'million', 'milliard');
Var
temp: String;
c, d, u: Integer;
coef: Integer;
I: Integer;
neg: Boolean;
Begin
Result := '';
// Cas particulier de zéro
If n = 0 then
begin
Result := ' zero';
Exit;
end;
// Mémorisation du signe
neg := n < 0;
If neg then
n := -n;
coef := 0;
Repeat
// Récupération de l'unité du bloc de trois chiffres en cours
u := n mod 10;
n := n div 10;
// Récupération de la dizaine du bloc de trois chiffres en cours
d := n mod 10;
n := n div 10;
// Traitement des dizaines
temp := '';
// Passage sur la dizaine inférieure pour 10 à 19
// et pour 70-79 90-99 dans le cas de la France
If (d = 1) Or ((d in [7, 9])) then
begin
Dec(d);
Inc(u, 10);
end;
if d > 1 then
begin
temp := ' ' + dizaineF[d];
// Ajout du cas particulier de 'et' entre la dizaine et 1
if (d < 8) and ((u = 1) or (u = 11)) then
temp := temp + ' et';
end;
// ajout du texte de l'unité
if u > 0 then
temp := temp + ' ' + unite[u];
// ajout du 's' à Quatre-vingt si rien ne suit
If (Result = '') and (d = 8) and (u = 0) then
Result := 's';
Result := temp + Result;
// Récupération de la centaine du bloc de trois chiffres en cours
c := n mod 10;
n := n div 10; { Récupère centaine }
If c > 0 then
begin
temp := '';
if c > 1 then
temp := ' ' + unite[c] + temp;
temp := temp + ' ' + coefs[0];
// Traitement du cas particulier du 's' à cent si rien ne suit
If (Result = '') and (c > 1) then
Result := 's';
Result := temp + Result;
end;
// Traitement du prochain groupe de 3 chiffres
if n > 0 then
begin
Inc(coef);
I := n mod 1000;
If (I > 1) and (coef > 1) then
Result := 's' + Result;
If I > 0 then
Result := ' ' + coefs[coef] + Result;
// Traitement du cas particulier 'mille' ( non pas 'un mille' )
If (I = 1) and (coef = 1) then
Dec(n);
end;
until n = 0;
Result := Trim(Result);
// Ajout du signe en cas de besoin
if neg then
Result := 'moins ' + Result;
End;
المميز فيها مراعاة دقيقة للقواعد النحوية الفرنسية والحالات الخاصة.
أيضا السرعة واختصار في الكود، غير أنها لا تأخذ الفواصل في الحسبان
المصدر: Developpez.com بتصرف (حذفت الجزء المتعلق بحالة استثنائية للفرنسيين).
ملاحظة: طرح أسئلتك في قسم الأسئلة، وأي سؤال خارج عن الموضوع هنا سيحذف، كما قد تحذف المشاركات التي لا تضيف إلى الموضوع
بالتوفيق أخي نبيل.
أخي العزيز أتينا الآن إلأى نهاية الطرح للدروس الخاصة بموضوعنا هذا ، و قد تتساءل أن المشروع غير مكتمل بعد؟
الجواب : تركت لك المبادرة بعد أن تم التعرف على الأساسيات لذلك ، فمثلا في موضوع الطباعة ، بعد تعرضنا لكيفية طباعة الفاتورة ، و شرح تقرير الطباعة المستخدم ، أكيد أنه صار بوسعك إكمال ماتبقى في هذا الشأن.
ملاحظة أخرى ممكن بشأن خاصية ملئ الشاشة و العكس في القائمة على الصفحة الرئيسية ، في هذا الصدد ممكن أن أدلك على هــــذا الرابط الذي سيغنيك عن أي طرح و شرح .
- لكتابة الصيغة الحرفية لمجموع قيم الحقول العددية (Memo1+2 في فورم الفاتورة) إليك هذا الرابط
ممكن أضيف نقطة أخرى مثلا جعل كل أو بعض الصفحات تتطلب كلمة مرور للعرض ، مثلا و تكون كلمة المرور تختلف عن غيرها ، يعني أنت مثلا يستعمل هذا البرنامج موظف لك لا تريده أن يطلع على صفحة الممونين أو صفحة المواد (المخزن) التي تتضمن تفاصيل الشراء و سعر شراء كل مادة ( مثال عن هذا الأمر بالذات بسيتم إرفاقه قريبا ) ، و ممكن تريد .... و تريد ....
أقول لك أخي الكريم لا يمكن لأحد الإحاطة بكل الإحتمالات الواردة و كل الإحتياجات إلا أنت في حد ذاتك ، لماذا ؟ بكل بساطة لأنك الأدرى بما تحتاج إليه و ماهو مطلوب منك لتضعه في يد زبونك.
أقصد أن نقطة البداية الحقيقية لك بدأت الآن و لابد لزاما أن تشمر عن ساعديك للجد و العلم و العمل .
الشيء الذي سيكون خاتمة الموضوع بالنسبة لي لأفسح المجال للأعضاء و الإخوة الأعزاء في إبداء آرائهم و نصائحهم و ملاحظاتهم و كذا العيوب و الأخطاء و تصحيحها ، لنتعلم منهم و تعم الفائدة ، هو البداية مني على عجالة بطرح ملاحظة أو تعليق هام :
- قواعد البيانات:
ممكن أهم ملاحظة أطرحها تتمثل في تكرار واضح في حقول الجداول من عير فائدة.
طيب سأعطي مثال للتضح الفكرة و تفهم أخي ماعليك عمله لتحصد فوائد لبرنامجك أهمها سرعة البرنامج خصوصا أثناء البحث و كذا توفير مساحة التخزين و التقليل من نسبة الوقوع في الخطأ. المثــال: ليكن لدينا جدول للكتب بمشروع تسيير مكتبة مثلا ، به 3 حقول هي : رقم الكتاب-اسم الكتاب-اسم المؤلف . وجدول آخر للمؤلفين يتكون من حقلين : رقم المؤلف - اسم المؤلف .
سنركز على الجدول الأخير و كذا الحقل الأخير بالجدول الأول.
أثناء استغلال قاعدة البيانات ، تلاحظ أنه عليك أولا تحديد المؤلفين بالجدول الثاني ، بالنسبة للجدول الأول أي كتاب تقوم بادراجه يتطل منك الأمر كتابة اسم المؤلف لهذا الكتاب على أن يكون المؤلف ضمن المؤلفين لديك بالجدول الثاني .
ماذا نلاحظ : أولا حقل المؤلف في كلا الجدولين هو من النوع النصي ، يعني لابد عليك كتابة الإسم الكامل للمؤلف أثناء إدراجك لكتاب ما بالجدول الأول ، و مع العلم أنه يحتمل أن يكون لديك عدة كتب للمؤلف الواحد فإنه عليك في كل مرة كتابة اسم المؤلف ، ماذا سيترتب عن هذا ؟
- احتمال الوقوع في الخطأ : إذا كان لديك مثلا المؤلف (طه حسين) فإنك ستكرر كتابة هذا الإسم عدد الكتب التي لديك له ، و أيضا في كل مرة تقتني كتابا لهذا المؤلف ، ما يقربك للخطأ فتكتب مثلا (طه حسن) . افرض معي أنك اعتقدت أن اسمه كذلك و كررت هذا الإسم الخاطئ في كل كتبه ، كم من سجل عليك تعديل اسم المؤلف فيه ؟
- بطئ البحث في قاعدة البيانات: معلوم أن البحث في الحقول العددية أسرع منه في الحقول النصية ، ستقول و ما دخل هذا الأمر مادام لزوما سيكون اسم المؤلف من النوع النصي ؟ لكن تابع معي لتتضح الفكرة و الغاية .
- استهلاك مساحة تخزين أكبر : للعلم أنه فب الحقل النصي كل حرف يخزن في بايت واحد ، يعني (طه حسين ) 7 بايت باعتبار الفراغ ، و لو تكرر هذا الإسم معنـا 20 مرة مثلا فستكون مساحة التخزين 140 بايت ، بينما تخزين رقم يصل إلى 32000 يحتاج إلى 2 بايت فقط ، و لكن الأمر لن يقتصر على هذه الملاحظة فحسب لأن الحقل النصي لا بد أن تحجز له مثلا 25 حرفا ، مما يعني 25 بايت ، و إذا كان لديك بالمكتبة 2000 كتاب مثلا فستكون المساحة 2000*25 = 50000 بايت ، بينما لو كان الحقل عددي (2000*2 = 4000بايت) فقط ، و الفرق واضح.
* الحل ببساطة في الجدول الأول اسم المؤلف نجعله رقم المؤلف (حقل عددي) ، بحيث نكتب اسم المؤلف مرة واحدة بجدول المؤلفين ، و بجدول الكتب يتكرر المؤلف على اعتبار رقمه بجدول المؤلفين فقط ، يعني يربط كلا الجدولين عن طريق هذا الحقل ( و للطريقة و المزيد ابحث بالمنتدى) و هذه الطريقة تعرف بالتطبيع Normalization .
إذا استوعبت المثال و الفكرة فبامكانك التمعن في قواعد البيانات لمشروعنــا هذا ، و ستعرف ما عليك فعله .
و أكيد أن هناك ملاحظات و تعقيبات أخرى ، أفضل كرم الإخوة معنا هنا ، أو في في أقسام أخرى كما ترى إدرة المنتدى .
السلام عليكم و رحمة الله تعالى و بركاته
اخي نبيل اردت فقط المشاركة و شكرك على مجهودك
اطلعت على برنامجك و اردت اضافةهذا الكود الخاص بالتفقيط
كود :
Function Convert_ch_let(chiffre: real; SM: String): string;
var tab_1_19 : array[0..19] of string[10];
tab_20_90: array[2..9] of string[20];
tab: array[1..5] of string[10];
ch_int: string[20];
ch, ch_r: string;
i, fin_I : integer;
Function result_1_99(ch: string): string;
begin
result_1_99 := '';
case strtoint(ch) of
0..19 : result_1_99 := tab_1_19[strtoint(ch)];
20..99 : case strtoint(ch) of
20,30,40,50,60: result_1_99 := tab_20_90[strtoint(copy(ch,1,1))];
21,31,41,51,61: result_1_99 := tab_20_90[strtoint(copy(ch,1,1))] + ' et' + tab_1_19[strtoint(copy(ch,2,1))];
80: result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) ];
70..79 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) - 1] + '-' + copy(tab_1_19[strtoint(ch) - 60],2,length(tab_1_19[strtoint(ch) - 60]) -1);
81..89 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) ] + '-' + copy(tab_1_19[strtoint(ch) - 80],2,length(tab_1_19[strtoint(ch) - 80]) -1);
90..99 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) - 1] + '-' + copy(tab_1_19[strtoint(ch) - 80],2,length(tab_1_19[strtoint(ch) - 80])-1 );
else
result_1_99 := tab_20_90[strtoint(copy(ch,1,1))] + '-' + copy(tab_1_19[strtoint(copy(ch,2,1))],2,length(tab_1_19[strtoint(copy(ch,2,1))]) -1);
end;
end;
end;
begin
if length(floattostr(int(chiffre))) > 15 then // s'il y a autre chose après le Billion, alors remplacer le 15 par 18
begin
messagedlg('Valeur incorrecte ',mtinformation,[mbok],0);
exit;
end;
tab_1_19[0] := '';
tab_1_19[1] := ' un'; tab_1_19[2] := ' deux'; tab_1_19[3] := ' trois';
tab_1_19[4] := ' quatre'; tab_1_19[5] := ' cinq'; tab_1_19[6] := ' six';
tab_1_19[7] := ' sept'; tab_1_19[8] := ' huit'; tab_1_19[9] := ' neuf';
tab_1_19[10] := ' dix'; tab_1_19[11] := ' onze'; tab_1_19[12] := ' douze';
tab_1_19[13] := ' treize'; tab_1_19[14] := ' quatorze'; tab_1_19[15] := ' quinze';
tab_1_19[16] := ' seize'; tab_1_19[17] := ' dix-sept'; tab_1_19[18] := ' dix-huit';
tab_1_19[19] := ' dix-neuf';
tab_20_90[2] := ' vingt'; tab_20_90[3] := ' trente'; tab_20_90[4] := ' quarante';
tab_20_90[5] := ' cinquante'; tab_20_90[6] := ' soixante';
tab_20_90[7] := ' soixante-dix'; tab_20_90[8] := ' quatre-vingt'; tab_20_90[9] := ' quatre-vingt-dix';
tab[1] := ' cent';
tab[2] := ' mille';
tab[3] := ' million';
tab[4] := ' milliard';
tab[5] := ' billion';
ch_int := floattostr(int(chiffre));
ch_r := '';
fin_i := length(ch_int) div 3;
if length(ch_int) > fin_i * 3 then
begin
ch := copy(ch_int,1, length(ch_int) - fin_i * 3);
ch_r := result_1_99(ch);
if (strtoint(ch) = 1) and (fin_i = 1) then
ch_r := tab[fin_i + 1]
else
if length(ch_int) > 2 then
ch_r := ch_r + tab[fin_i + 1];
end;
For i := fin_i downto 1 do
begin
ch := copy(ch_int, length(ch_int) - i * 3 + 1 , 3);
case strtoint(copy(ch,1,1)) of
0: ch_r := ch_r + result_1_99(copy(ch,1,1)); // dans le cas 0, on peut remplacer result_1_99(copy(ch,1,1)) par une chaine vide. C'est à dire ch_r := ch_r + '';
1: ch_r := ch_r + tab[1]; // là aussi on peut mettre cent à la place de tab[1]
else
ch_r := ch_r + result_1_99(copy(ch,1,1)) + tab[1];
end;
if (i = 2) and (strtoint(ch) = 1) then // pour le cas de: par ex 125001489
ch_r := ch_r + copy(result_1_99(copy(ch,2,2)),3,length(result_1_99(copy(ch,2,2))) - 3 )
else
ch_r := ch_r + result_1_99(copy(ch,2,2));
if (i > 1) and (strtoint(ch) > 0) then
ch_r := ch_r + tab[i];
end;
if SM <> '' then
begin
ch_r := Uppercase(copy(ch_r,2,1)) + copy(ch_r,3,length(ch_r) - 2) + SM;
if frac(chiffre) > 0 then
ch_r := ch_r + ', et ' + copy(floattostr(frac(chiffre) + 1.005 ),3,2) + ' cts.';
// le 1.005 pour obtenir le bon resultat, enlever le et essayer avec les montants suivants: par ex 15,20 ou 147,50
end;
Convert_ch_let := ch_r;
end;
كود :
procedure TForm1.DBEdit1Change(Sender: TObject);
begin
If (DbEdit15.text = '') then // si la chaine S est vide Erreur
begin
Application.MessageBox('Veuillez Saisir une somme d''abord.', 'Erreur: Rien à convertir !',mb_IconError+mb_Ok);
end
else
DbEdit17.text := Convert_ch_let(strtofloat(DbEdit15.text),' Dinars');
end;
end.
25-02-2010, 02:45 PM (آخر تعديل لهذه المشاركة: 05-08-2010, 03:04 AM بواسطة kachwahed.)
السلام علكيم ورحمة الله وبركاته
تحية طيبة وبعد
شرح وافى وقوى جدا
حاولت ان استخدم مكون الskins المرفق فى بداية المشروع ولكن بشتى الطرق لم يعمل معى الا بعد ان قمت بتنزيل النسخة الجديدة هذه:
كود :
http://www.alphaskins.com/sfiles/alite.zip
اشكرك جدا انا بدات اتابع الموضوع وربنا يسهل ان شاء الله ويكون فيه استفسارات ومشركات قد تكون فعالة
ما يؤخرنى هو انى لا اجيد الفرنسية
ولكن مع البحث واستخدام المترجمات قد نصل الى المراد
شكرا لك حبيب قلبى واتمنى ان يكون هناك قاعدة بيانات portable لتسهيل نقل البرامج
شكرا لك وان شاء الله لنا عودة
السلام عليكم ورحمة الله وبركاته
تحية طيبة وبعد
وصلت الى ربط قاعدة البانات وكل شئ على ما يرام (انشات جدول للمنتجات فقط وذلك لصعوبة الترجمة من الفرنسية لاسماء الحقول )
إقتباس :تظهر لكل كل الجداول تقوم بتحديد produit.db ، و أخيرا active تعطيها true .
هل يعنى هذا اننا بمجرد نقل الملف التنفيزى ووضع قاعدة البيانات فى المسار المحدد مسبقا هل سيعمل بدون الحاجة الى تثبيت برامج اضافية تهتم بقاعدة البيانات الخاصة بنا ؟؟
انتظر منك الاجابة
سيعمل بجهازك فقط ، لتوفر محرك قواعد البيانات ، و أي جهاز آخر لا يتوفر عليه ، لن يعمل
قضية إنشاء setup للبرنامج (تجميعه ليصبح يتنصب في أي جهاز و يعمل عادي ) هذا أمر آخر ، ابحث في المنتدى عن
InstallShield