delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيف استدعي صورة مخزنة بقاعدة البينات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3
السلام عليكم
كيف تخزين صورة Jpeg في قاعدة البينات وكذلك استدعائها للظهور
انا استعملت هذا الكود
كود :
dm.table5.FieldByName('photo').Assign(Image1.Picture);
هل الكود صحيح؟
واستدعائها للظهور في البرنامج بمجرد اختيار شخص معين في قاعدة البينات وشكرا
السلام عليكم ،
لتخزين الصورة هذا الكود :

كود :
Close; SQL.Clear; SQL.Add('UPDATE TABLE'); SQL.Add(' SET Logo = :Logo'); Parameters.ParamByName('Logo').LoadFromFile('c:\logo.bmp', ftGraphic); ExecSQL;

لعرض الصورة

كود :
if not eof then ImgLogo.Picture.Bitmap.LoadFromStream(CreateBlobStream(FieldByName('Logo'), bmRead));

:monster1:
استدعاء صورة بلاحقة Bmp و حفظها بجدول قاعدة بيانات (نوع الحقل Graphique أو Binaire )
إذا كان الحقل نوع Graphique فلا يقبل إلا Bmp
و إذا كانت الصور من نوع Jpg فما العمل ؟
إما أن تحويل الحقل إلى نوع Binaire أو تحويل صورة نوع jpg إلــى Bmp و تخزينها بالحقل ذو النوع Graphique
جزاك الله خيرا على مجهودك القيم اخي الكريم
وهذا مشروعي بالمرفقات فيه بعض المشاكل ساوضحها
1.في form7 عند ملاء الخانات بالمعلومات وفي حالة وجود خطا بالمعلومات المدخلة مثل التاريخ فانه بعد رسالة الخطا التي تظهر يقوم البرنامج بادخال المعلومات مباشرة الي قاعدة البينات دون الاستشارة
2.لاظهار المعلومات الموجودة بقاعدة البينات في edit ;maskedit ;combobox قمت بانشاء زر اسمه affichier يعمل بشكل جيد لكن الصورة لاتظهر.
اذا امكن التعديل على المشروع وارجاعه بالمرفقات اكون شاكر لكمSmile
المشروع مشروع تخرج ولم يبقى لي وقت كثير اتمنى ان يتسع صدركم لاسئلتي وجزاكم الله خيرا.
لا يوجد أي ازعاج ، فنحن جميعا هنا لنتعلم ، و من بركة العلم ألا يكتمه الإنسان . نحن بالخدمة متى أمكن.

هناك بعض الملاحظات _ إلى جانب الأخطاء المطروحة من طرفكم _ أذكر منها موضوع Alias ، يكون أفضل إذا كان هذا الأخير ديناميكيا ، كي لا يضطر كل مطلع على برنامجك من انشاء Alias من جديد و التعديل و .... ، إذا كان ديناميكيا فإنه يعمل على أي جهاز به محرك Bde بشكل عادي ، و من دون إعادة الإنشاء .
على العموم قمت بادراجه في مشروعكم ، و لمعرفة الطريقة راجعي هذا الرابط
أو : - إضافة Database1 إلى DM
- دوبل كليك على Database1
- اتباع ما هو مكتوب بالصورة بالمرفق Database1
- ثم Ok
- أخيرا كتابة اسم Database1 الذي هو data (الاسم اختياري) في الخاصية DataBaseName
لكل الجداول (table)
توضيح أكثر في المرفق موجود بالمرفق StarTimes

- ملاحظة أخرى فيما يخص الفورم الأساسي : هل سيبقى فارغا باستثناء MainMenu1 ؟ هذا ليس جميلا
- فيما يخص شكل الفورم 7 ، ليس جميلا ، و هو متعب أثناء التصفح بسبب كبر الحجم و سحب البار من كل الجهات ، جعله كما هو بالمرفق على سبيل المثال و اظهار أو اخفاء GroupBox1 حسب الحاجة ، و إذا كان لازم يظهر في كل الأحوال ، يمكن و ضعه مكان Panel3 ، و جعل الأزرار بهذا الأخير على شكل MainMenu في الفورم 7 .......
- يمكن نزع الزر المسمى :
و ادراج:
كود :
edit4.Text:= combobox7.Text+ edit16.Text+ combobox9.Text+ maskedit4.Text;
في الحدث OnChange أو OnExit للــ MaskEdit4 . إذ أن استحدام هذا الزر يتعب المستخدم بلا فائدة.

- بخصوص الأخطاء المذكور سأراجع أمرها .

بالتوفيق
- فيما يخص التاريخ:
الشرط المطلوب هو أن لا تساوي Edit1 قيمة ( / / ). ما ذا يعني هذا ؟
يعني لو يكون التاريخ مثلا 01/02/0100 ، الحفظ يكون عادي ؟؟؟؟؟؟؟؟؟
المشكل و الحل بسيط . لكن يكون أفضل من كل الجوانب لو تم استبدال Edt بــ DateTimePicker
و قد فعلت هذا في المشروع المرفق.
كما ألفت الإنتباه و التذكير بالمشاركة القيمة التي وردت بهذا الشأن

- ملاحظات أخرى:

- يكون أفضل و أأمن _كما فعلت_ لو تكون الجداول مغلقة ن تفتح و تغلق أثناء فتح المشروع و أثناء الغلق (الحدث مثلا: Onshow-OnClose للفورم الرئيسي كما هو في المرفق)


تحت عنوان لا بد من السيطرة قد الامكان على الأخطاء المحتملة من طرف المستخدم و منعها :
- يمكن اجبار Edt من قبول الحروف فقط ، أو الأرقام فقط حسب الحاجة ، من غير اللجوء إلى Mask
هذا الرابط يبين و يوضح ذلك
- فيما يخص رقم CCP ليس بالضرور7أرقام
- رقم الولاية يتكون من رقمين ، يعني بالامكان كتابة 99 و هذا خطأ ، لابد من اضافة شرط أصغر أو يساوي 48. كذلك البلديات . أحسن عمل و أتقن _وإن كان به بعض الصعوبة :انشاء جدول خاص لذلك.
السبب : الولايات تزيد (و ان كان بعد زمن) ، و لكل ولاية بلدياتها ، و يكون عدد التسجيلات للولايات هو الحصر الخاص بــ رقم الولاية الذي لا يزيد عنه. (يمكن الاستغناء عنذلك إذا كان الوقت ضيق)
- عدم تمكينه من ضغط أي زر بامكانه احداث خطا ، جعل الأزرار التي تؤدي لذلك مثلا Enabled:=false
و هناك ما يجب عمله بهذا الشأن ، هذا باختصار.
- ماذا يعني Combobox : يعني أن الاختيار محصور أو هناك ****** في الاختيار ، إذا كان الأول هو المراد لا بد من عدم تمكين المستخدم من كتابة أي شيء غير الحيارات المحددة (يعني لا بد أن يختار فقط) ، في خصائص الــ Combobox نجعل الخاصية : Style : csDropDownList

بالتوفيق
- فيما يخص Suprimer :
كود :
begin [COLOR=Blue] if dm.table5.RecordCount>0[/COLOR] then if MessageDlg('Voullez vous vraiment supprimer cet enregistrement ?', MtConfirmation, MbOkCancel,0)=mrok then dm.table5.Delete; end;
يمكن تغيير الكود باللون الأزرق إلى
كود :
[COLOR=Blue]if not DM.Table5.IsEmpty[/COLOR]
هذا الأخير يمكن ادراجه في مواضع أخرى لعدم حدوث خطأ إذا كان الجدول فارغا. في هذا المشروع لم أجد أي موضع لذلك (فقط هذه للإشارة)

- يمكن إضافة كود مسح كل معطيات الجدول:
كود :
[COLOR=Blue]While Not DM.Table5.IsEmpty do Table5.Delete[/COLOR]
أو
كود :
[COLOR=Blue]DM.Table5.Close; [/COLOR][COLOR=Blue]DM.Table5.EmptyTable; [/COLOR][COLOR=Blue]DM.Table5.Open;[/COLOR][COLOR=Blue][/COLOR]
هذا الأخير أفضل ، السبب: هناك ملف تحت اسم retraite.MB يتزايد كلما تم تخزين الصور حسب حجم هذه الأخيرة ، لا يتم تحرير حجم الملف و ارجاعه 04 كيلو الافتراضي إلا بالكود الأخير (و كلا الكودين يجعل الجدول يظهر فارغا )
- يمكن و يستحسن نزع زر الغلق مادام ذلك متوفر في النافذة (القاعدة : لا داع لما هو غير ضروري لراحة المستخدم و ليونة المشروع)

- وجود خطأ : عند الحفظ ، يتم حفظ المعطيات + انشاء سجل جديد فارغ
السبب : و جود الأمر Insert مرتين ، أولا بالزر Nouveau ثانيا بالزر Ajouter
التصحيح : بالزر Nouveau :
كود :
dm.table5.last; dm.table5.insert;
بالزر Ajouter حذف الكود
كود :
// dm.table5.last; // dm.table5.insert;

- خطأ فيما يخص الزر Modifier : إذا كانت مواضع الحجز (Edt-Combobox-.....) فارغة ، يتم الحفظ
الصواب : إضافة الشرط الذي تم استخدامه مع الزر Ajouter
كود :
if (edit4.text<>'') and (combobox7.text<>'') and (edit16.text<>'') and (combobox9.text<>'') and (combobox1.text<>'') and (maskedit4.text<>'') and (combobox2.text<>'') and (edit8.text<>'') and (maskedit5.text<>'') and (maskedit6.text<>'') and (combobox3.text<>'') and (maskedit7.text<>'') and (maskedit8.text<>'') and (maskedit9.text<>'') and (maskedit10.text<>'') and (combobox4.text<>'') and (combobox5.text<>'') and (maskedit11.text<>'') and (maskedit12.text<>'') and (maskedit13.text<>'') and (combobox6.text<>'') and (maskedit14.text<>'') and (maskedit15.text<>'') then begin
هذا ما يوجد لحد الآن ، و في انتظار التصحيح و التدارك ، نحن بالخدمة .

بالتوفيق أخي
شكرا على المجهود
اعمل على تنفيذ ملاحظاتك الا اني اجد انك اضفت dbnavigator وانا لا ارغب في استعماله وقد استعملت زر affichier وياريت لوكان اظهار المعلومات يكون بمجرد اختيار الشخص ب dbgrid كما ان مشكل الصورة لازال قائما حيث عند اضافة صورة لشخص جديد فانها تظهر في سطر وحدها في dbgrid .كما ان الصورة نفسها تظهر مكبرة وغيرواضحةوعند اختيار شخص معين تظهر معلوماته لكن لا تظهر صورته يعني نفس المشكل الاصلي
انا في انتظار ردودك القيمة
تم حذف DbNavigator و تعويض الكود في حدث OncellClick+OnKeyDown+OnKeyUp
و بذلك بمجرد تفقد DBGrid تظهر المعلومات فوق في العناصر .و تم حذف زر Afficher.
لكن مادام تم حذف DbNavigator يطلب تعويضه بأزرار Suivant+Précedent+Début+Fin
أضن أن المستعمل يحتاج لذلك . و لك الخيار .
نسلم ايديك على هذا المجهود
عندي اضافتي لشخص جديد وعمل صورة له فان الصورة تظهر جد كبيرة داخل اطارها كما انه عند الضغط على الازرار pré وsui فان الصور التي اضفتها انت تظهر بشكل جيد اما التي اضيفها انا فلا تظهر وانما يظهر اطار ابيضSad
الصفحات : 1 2 3