الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

3rd party components

مغلقرائج
بدأه محمد خليل أبو صلاح في 10 أبريل 2007 · 64 رد · 8,615 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#26

هيك الويكند بيكون خلص ضاع .. عموما نرجع للكود قبل ما اكمل مشاوير اليوم ..

الان وضعت أجزاء كبيرة من كلاس الرسم و سوف أعود لاحقا لأشرح بعض النقاط فيه و لكن لننتبه

هناك نقطة وهي عند عمل دوران للأشكال البيضاوية يحصل إزاحة للكائن وبالتالي لجأنا لل GDI+ لتطبيق بعض خوارزميات ال Transformation

هنا الشكل البدائي لكلاس ImageGlue.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using WebSupergoo.ImageGlue6;
using WebSupergoo.ImageGlue6.GDIPlus;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing;
/// 
///  <-- Drawing class based on ImageGlue.NET -->
/// This Code Is written By Mohammed K.
///  


public class ImageGlue
{
	Canvas ca;
	CanvasWrapper wr;
	Graphics gr;
	Pen pn;
	string imgPath, adsPath, backgroundImg;

	public ImageGlue()
	{
		imgPath = Web.GetWebConfigValue("PhoneImagePath");
		adsPath = Web.GetWebConfigValue("AdsImagePath");
		backgroundImg = Web.GetWebConfigValue("BackGroundImagePath");
		ca = new Canvas();
		wr = new CanvasWrapper();
	}
	public void LoadImage(string imgUrl, float width, float height)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(imgUrl), " Size=" + width.ToString() + "," + height.ToString());
	}

	public void DrawText(string Text, float x, float y, float width, float height, string TextColor, string TextFont, float TextSize, string TextStyle)
	{
		ca.DrawText(Text, "Pos=" + x + "," + y + " Size=" + width.ToString() + "," + height.ToString() + " TextColor=" + TextColor + " TextFont='" + TextFont + "' TextSize=" + TextSize + (TextStyle.Equals("") ? "" : " TextStyle=" + TextStyle));
	}
	public void DrawText(string Text, float x, float y, string TextColor, string TextFont, float TextSize, string TextStyle)
	{
		ca.DrawText(Text, "Pos=" + x + "," + y + " TextColor=" + TextColor + " TextFont='" + TextFont + "' TextSize=" + TextSize + (TextStyle.Equals("") ? "" : " TextStyle=" + TextStyle));
	}

	public void DrawOval(float x, float y, float width, float height, Color paintColor, float rotate, int alpha)
	{
		// pure GDI+ code // I had problems with ImageGlue.NET in this point, so I have used GDI+ here
		gr = wr.Wrap(ref ca);
		gr.SmoothingMode = SmoothingMode.HighQuality;
		gr.PixelOffsetMode = PixelOffsetMode.HighQuality;

		double fangle = (double)rotate / 180 * 3.1415926;
		Matrix xform = new Matrix((float)Math.Cos(fangle)
		, (float)Math.Sin(fangle)
		, (float)-Math.Sin(fangle)
		, (float)Math.Cos(fangle)
		, (float)((x + (width / 2)) - Math.Cos(fangle) * (x + (width / 2)) + Math.Sin(fangle) * (y + (height / 2)))
		, (float)((y + (height / 2)) - Math.Cos(fangle) * (y + (height / 2)) - Math.Sin(fangle) * (x + (width / 2))));
		gr.Transform = xform;

		SolidBrush b = new SolidBrush(Color.FromArgb(alpha, paintColor));
		gr.FillEllipse(b, x, y, width, height);

		ca = wr.Unwrap(ref gr);
	}


	public void AddTransparentImage(string inPath, float x, float y)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "Mode=transparent Pos=" + x + "," + y);
	}
	public void AddTransparentImage(string inPath, float x, float y, float width, float height)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "Mode=transparent Size=" + width.ToString() + "," + height.ToString() + " Pos=" + x + "," + y);
	}

	public void ResizeImage(string inPath, string outPath, int height, int width)
	{
		ca.Clear();
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "height<" + height + ", width<" + width);
		ca.SaveAs(HttpContext.Current.Server.MapPath(outPath), "");
		ca.Clear();
	}

	public void SaveAsImage(string imgUrl)
	{
		ca.SaveAs(HttpContext.Current.Server.MapPath(imgUrl), "Quality=100.0");
	}
	public void SaveAsImage(string imgUrl, string param)
	{

		ca.SaveAs(HttpContext.Current.Server.MapPath(imgUrl), param);
	}

	public void SaveAsPDF(string PDFUrl)
	{
		this.SaveAsImage(PDFUrl);
	}

	public void Close()
	{
		ca.Clear();
		ca.Dispose();
	}
}

نرى أن هناك ثوابت لمسارات معينة يتم إعادتها من خلال كلاس Web.Cs والموجودة بداخل Web.Config على الشكل التالي و طبعا داخل

التاج Configuration

  <appSettings>
	<add key="localhost.DatabaseConnectionString2" value="server=(Local); database=IG_Db; trusted_connection=true; pooling=false;"/>
	<add key="localhost.SmtpServer" value="127.0.0.1"/>
	<add key="ProductImagePath" value="Files/ProductImage/"/>
	<add key="AdsImagePath" value="Files/Ads/"/>
	<add key="BackGroundImagePath" value="Files/BackGroundImage/"/>
	<add key="DealerLogoPath" value="Files/DealerLogoImage/" />

  </appSettings>

أيضا مسار قاعدة البيانات موجود ..

إلى هنا أعتقد أنا أوفيت بوعدي اللي هو الاسراع في هذا المشروع في الويكند .. صح؟

بالتوفيق للجميع

You can fly while you can touch the sky

#27

بصراحة موضوع غاية في الروعة

أنا أول مرة أدخل عالموضوع وقرأت ثلاث صفحات متتالية بالردود (( طبعا تعبت جدا ))

حتى اني حسيت في النهاية ان الprossessor عندي حيضرب ..

بس عندي طلب بسيط ..

لعموم الاستفادة للزائرين الجدد امثالي .. ممكن تلخص الموضوع في نقاط ،، وتكون الردود لوحدها

وجزاك الله خير

#28

أهلا scool ..

الموضوع واضح من أوله ولكن ربما الجدد يحتاجون لقراءته أكثر من مرة ..

المشكلة أنا ما عندي وقت أبدا و كنت منتظر الويكند حتى أتفرغ للكتابة ..

لو لاحظت أغلب مشاركاتي قصيرة لضيق الوقت :)

طبعا أنا كتبت أجزاء اخرى و لكن يجب أن أشرح ما ذكرته للإخوة سابقا..

قد يسألني شخص ما:

لماذا كتبنا الكلاسات قبل كل شيء؟؟

المنطق يقول ان الفكرة في رأسك .. بالتالي يجب أن تكون قادرا في أي مشروع على بناء الكلاس قبل المباشرة به و الدليل المنطقي هو

أن من فوائد ال OOP هي ال Reusability أي اعادة استخدام الكلاسات مرة أخرى صح؟

طيب حلو .. نحنا كمان لما نستخدمها مرة تانية أكيد بنكون وضعنا الكلاسات قبل استخدام الادوات صح؟ جواب منطقي!

أنا شايف ان الكود صعب او معقد او وووو

لالالا .. حتى ولو كان صعب .. كل شيء ممكن فهمه و أيضا في الشركات عندما تعمل هناك مبرمجين على مستوى أعلى وهناك من هم على مستوى أقل

وبالتالي ربما أيضا تعمل مع فريق مستواه أعلى فكيف تتصرف؟؟ يجب أن تفهم فعود نفسك من الان ....

عندما ندخل في التفاصيل ستجدون الأمور أبسط بكثير .... صدقوني ..لو كان الأمر معقدا لما أضعت اجازة اخر الاسبوع من أجل كتابة مقال هنا أو هناك

ولكن هناك فائدة ..

بالنسبة لجوليا .. قلتي خبرتك بالجرافيك هي صفر .. جميل جدا .. فرصة حتى يصبح لك فيها رصيد ..

بالنسبة ل Students أتمنى أن ارى نشاطك من جديد ..

محمد الهباش = اختفى

أيضا Kathy التي كانت أول من تفاعل مع الموضوع

عموما خبر جميل .. لن أقوم فقط بتوضيح التعامل مع الاداة كما قلت .. هناك معلومات هنا و هناك سوف تفيدكم ...

سوف أعطيكم فكرة جميلة جدا في ال Sql Server و أيضا فكرة جميلة في أتمتة صفحات الموقع

أنا رح اعطي لنفسي بريك تكونوا جربتوا الأكواد عالاقل إنشاء المجلدات و اضافة الكلاسات و محاولة فهمها ثم طرح الأسئلة قبل المتابعة

مر الكثير على ما أظن ولم يبق إلا القليل

You can fly while you can touch the sky

#29

الأستاذ الفاضل : محمد

أنا متابعة للموضع من البداية حاولت أن أسير معك ..

- قمت بإنشاء البرنامج وإنشاء الكلاس ومحاولة فهم المطلوب ورسم تخيل له(نافذة للأدمن أدخل منها - إسم الإعلان -شعار الشركة -لون الاشكال البيضاوية يعني الأشياء التي سنتحكم فيها في الصورة ونغييرها ونافذة توليد الصورة والتي سوف نحتاج فيها للأداة ImageGlue)صح كلامي؟

الجزء الثاني :

أطلعت عليه وسوف أقوم بإذى الله بتطبيقه ولكن لدي الملاحظات التالية إذا كان ممكن :

- في البداية أول مالفت إنتباهي إستخدام static في الدوال وقلت إحنا مش حنحتاج نعرف instance من الكلاس؟؟؟؟

على حسب معلوماتي المتواضعة لايحبذ إستخدام ال static لأنه يظل محجوز في الذاكرةبشكل مستمر حتى يتم غلق التطبيق حتى لو لم نستخدمه , لماذا لا نعرف instance من الكلاس وقت مانحتاج ؟؟؟؟

- قمت بوضع الإتصال بقاعدة البيانات في web config ماهو السبب ولماذا لم تضعه مباشرة في الكلاس Web.cs ???

"

أن من فوائد ال OOP هي ال Reusability أي اعادة استخدام الكلاسات مرة أخرى صح؟

عموما خبر جميل .. لن أقوم فقط بتوضيح التعامل مع الاداة كما قلت .. هناك معلومات هنا و هناك سوف تفيدكم ...

سوف أعطيكم فكرة جميلة جدا في ال Sql Server و أيضا فكرة جميلة في أتمتة صفحات الموقع

"

أنا متحمسة لمعرفة هكذا أشياء من خبراء تمنيت أن أعرفها دائما

شكرا لك على مجهودك

kathy

#30

سلام أستاذ محمد أنا ما زلت في أتم النشاط و إن شاء الله يكون كل هذا في ميزان حسناتك.

كان عندي استفسارات عن الكلاسات التي وضعتها

في الكلاس Web.cs :

ـ الدالة GetApplicationPath

لماذا لم نكتب على طول

		HttpContext hc = HttpContext.Current;
		return hc.Request.PhysicalApplicationPath;

ـ الدالة RedirectToCurrentPage

ما أهميتها بالضبط!!

أما عن الكلاس الخاص بالرسم ،،،،،،،،،، الحمد لله زي الأطرش في الزفة :blink: لأن معلوماتي صفر في graphics ، على العموم أنا بحاول اقرئة أكثر من مرة حتى أفهمة و بإنتظار التوضيحات التي سوف تعطيها عن الكلاس.

و ألف شكر لك مقدما

تم تعديل هذه المشاركة بواسطة students في 21 أبريل 2007 في 21:25

سبحان الله وبحمده سبحان الله العظيم

#31

عزيزي أرجوك هال بالأمكان الكتابة على Vb

وشاكر لك مقدماً

joseph.gif

logo.gif

CCNA 640-802

مدونتي

#32

السلام عليكم ..

سأحاول الاجابة بسرعة لأني لم أذهب للعمل حتى الان ..

kathy .. لاستخدام Static فوائد مثل .. عندما يكون عندك MEthod تكون Independent تحتاجين لها لأن ال static تكون

على ال Class Level وليست على ال Instance Level أي لا داعي لعمل Instance من الكلاس .. أيضا يفضل إن كانت جميع الطرق

static أن نجعل فقط الكلاس من نوع static ولكن هنا الكلاس Web.cs قد نحتاجه في تعريف طرق أخرى تلزمنا في المشروع وبالتالي أضفتها فقط مقابل

الطرق التي نحتاج اليها بشكل مباشر ...

أيضا تصورك صحيح ..

بخصوص الاتصال وضعته في ملف ال Web.Config حتى يكون موحدا و يكون سهل معرفة مكانه و تغييره.

أيضا العفو منك .. هاد واجب .... أكيد انا تعلمت من مشاركات الناس و على فكرة .. انا للأسف ما درست ال OOP بالجامعة

وكنت اسمع عنها و اخاف منها و اللي درستوا ما تجاوز موضوع ال Inheritance يعني حتى ال Interfaces ما درسناها

لكن الحمد لله معلوماتي الان متواضعة ولكن جيدة فيها :)

الأخ students شكراا لنشاطك..

بخصوص سؤالك .. دائما جرب .. مش معقول أنا عملت شيء من فراغ .. جرب افتح صفحة في المشروع واكتب التالي و شوف الفرق:

Response.Write(HttpContext.Current.Request.PhysicalApplicationPath + "
" + Web.GetApplicationPath());

لا تنس بعد تنفيذ هذا الكود أنك سوف ترفع الملفات على هوست معين و سيكون له دومين أما في جهازك الخاص سيعتبر مجلد التطبيق هو فرع للدومين Localhost

سترى الفرق أيضا في التحويل لل CurrentPage لو استخدمت Redirect لوحدها سوف تعود لنفس الصفحة و لكن ماذا لو كان هناك Parameters

تم تمريرها لشريط العنوان؟؟ نود أن نحتفظ بها ..

تجد فائدة هذه الطريقة عند استخدامك مثلا ال IFrame على الأقل أو ال PlaceHolder والذي يعتمد على ال QueryString لجلب ال UserContol

التي تود عرضها ضمن الصفحة الرئيسية ..

أنا لم أطلب أن تفهموا تماما كلاس الرسم ولكن اقرؤوه حتى يساعد في فهم المطلوب عند شرح أجزائه ..

تحياتي .. انا تأخرت عن العمل

سلام

You can fly while you can touch the sky

#33

أخي الساحر لا يمكنني الكتابة بال VB.NET أولا لأنني أفضل ال #C و ثانيا لانها نفس الفكرة من ناحية تحويل الكود

يعني كل ما عليك هو تحويل الكود و هو أمر سهل لل VB.NET.

أساسا انا كنت مبرمج Classic ASP وكنت استخدم ال VbScript مجبرا من أجل تطوير صفحات ال ASP و أحيانا أستخدم ال Jscript

فقط لأخرج عن جو الفيجوال بيسك و أتباعه و عندما بدأت تعلم الدوت نت كنت أملك كتاب ASP.NET Unleashed و كان مكتوبا كله في نسخته الاولى

بال VB.NET رغم ذلك كنت أكتب كل الأكواد بال #C ...

المهم أن تفهم الفكرة ... في شركتنا مثلا هناك مبرمجون كانوا يبرمجون بال VB.NET ولكن طبيعة العمل أجبرتهم على ال #C

ثانيا .. أرفقت لكم صورة لمحتويات ال Solution Explorer الخاصة بالمشروع عندي .. يلزمنا إضافة مجلدات معينة و ملفات جديدة

أيضا سنقوم بوضع كل الصور داخل المجلد Files و حسب المجلد الخاص بكل صورة كمنتجات او اعلانات اووووو

سأعود بالقريب لوضع هيكيلة الصفحة الرئيسية و نبدأ معا العمل على ال User Interface

post-2041-1177231035_thumb.gif

You can fly while you can touch the sky

#34

عودة مرة أخرى لكلاس ImageGlue.cs .. ممكن ؟

إن شاء الله ممكن ..

سأحاول أن أكون خفيف الظل في هذا الشرح .. لأني أعرف جو الملل الذي يبدو أنه قد سادكم جميعا ..

طبعا سنقوم بالعمل من خلال ال Canvas و صدقوني لا أعرف ترجمة عربية لها .. افهم ما هي لكن بالعربي لا أعلم المقابل ..

ممكن تتخيلوها متل Panel طبعا بداخله سنقوم بإضافة مكونات الإعلان من صور إضافية و نص حرفي.

الان بداخل ال Constructor الخاص بالكلاس سنقوم بالتالي:

 public ImageGlue()
	{
		imgPath = Web.GetWebConfigValue("PhoneImagePath");
		adsPath = Web.GetWebConfigValue("AdsImagePath");
		backgroundImg = Web.GetWebConfigValue("BackGroundImagePath");
		ca = new Canvas();
		wr = new CanvasWrapper();
	}

طبعا لكن كلاس يوجد Constructor قد لا يقوم بأي وظيفة و قد يقوم بعمل أشياء معينة مثل اسناد قيمة أولية لمتغيرات أو يقوم

بإنشاء نسخ Instances لكلاسات قد نستخدمها

هنا نرى أننا قمنا بإسناد مسار مجلدات الصور الخاصة بالإعلان و أيضا أنشأنا نسختين لل Canvas وال CanvasWrapper

أو ما يمكن أن نسميه بالغلاف ..

منطقيا .. يجب أن نقوم بإضافة الخلفية لل Canvas .. انا فكرت بفكرتين .. ان تكون بداخل ال Constructor

أي عند إنشاء نسخة من الكلاس مباشرة تقوم بإضافتها كصورة أولية لل Canvas والذي تتم بداخله تجميع الصور و المكونات كخط و غيرها

إلى أن نقوم بعمل Canvas.Clear او Canvas.Dispose حيث يتم الغاء كل شيء بداخل ال Canvas

ولكن قلنا ان الخلفية قابلة للتغير و بالتالي يجب أن تكون في Method لوحدها كالتالي:

 public void LoadImage(string imgUrl, float width, float height)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(imgUrl), " Size=" + width.ToString() + "," + height.ToString());
	}

طبعا واضح جدا أننا مررنا الطول والعرض و ايضا عنوان الصورة والذي أسندنا قيمته في أول الكلاس بداخل ال Constructor.

الان من أجل إضافة النص .. لو فتحنا ملف المساعدة Help الموجود مع ال ImageGlue سوف نجد طريقة لكتابة النصوص تابعة للكائن Canvas و هي DrawText

و سنجد ان لها Parameters و بالتالي من خلالها قمنا بعمل طريقة تقوم بإستدعاء الطريقة الأصلية و تمرير الباراميتر لها بالشكل المطلوب ..

هنا قمت بعمل دالتين بنفس الاسم و لكن بعدد مختلف من البارميترات كالتالي:

 public void DrawText(string Text, float x, float y, float width, float height, string TextColor, string TextFont, float TextSize, string TextStyle)
	{
		ca.DrawText(Text, "Pos=" + x + "," + y + " Size=" + width.ToString() + "," + height.ToString() + " TextColor=" + TextColor + " TextFont='" + TextFont + "' TextSize=" + TextSize + (TextStyle.Equals("") ? "" : " TextStyle=" + TextStyle));
	}
	public void DrawText(string Text, float x, float y, string TextColor, string TextFont, float TextSize, string TextStyle)
	{
		ca.DrawText(Text, "Pos=" + x + "," + y + " TextColor=" + TextColor + " TextFont='" + TextFont + "' TextSize=" + TextSize + (TextStyle.Equals("") ? "" : " TextStyle=" + TextStyle));
	}

طبعا هذا المفهوم يسمى في ال OOP بال Overloading و طبعا يمكننا من تعريف نفس اسم الدالة أو الطريقة بإستخدام نفس الاسم ولكن

إما أن يكون عدد الباراميتر مختلف او ان يكون نوع الدالة مختلف مثلا

// Same parameters number but not da same method data type
  private string GetName(int para1)
	 {
	   return "Mohammed K.";
	 }
  private int GetName(int para1)
	 {
	   return 1;
	 }

// or another example -> 2 parameters in the first method
  private string GetName(int para1,string para2)
	 {
	   return "Mohammed K." + para2;
	 }

  private string GetName(int para1)
	 {
	   return "Mohammed K.";
	 }

دعونا نقف هنا قليلا .. حتى الان نرى أننا في كل طريقة Method قمنا باستدعاء النسخة من ال Canvas والتي أسميناها ca

دعونا نحسب كم من الوقت وفرنا لو أننا استخدمنا ال GDI+ أكيد الكثير :)

لكن .. أنا تعبت من عمل دوران Rotation للأشكال من خلال ال ImageGlue حيث فشلت مرارا في عمل ازاحة لنفس المكان

للاشكال بعد عمل دوران لها .. لجأت وقتها لل GDI+ و قد تظنوا أن ما سأقوم به الان صعب ولكنه سهل لمن له خبرة بالرياضيات !!

انا اصلا درست بالجامعة رياضيات قبل أن اتجول في جامعة أخرى دارسا علوم الكمبيوتر ..!!!

لمن يريد الإستزادة يمكن أن يبحث في أي كتاب للجبر Linear Algebra عن موضوع المصفوفات Matrices فصل ال

Transformations

بس لو مكانكم ما بضيع وقتي ... شيء جاهز خلص .. في قاعدة "إبدأ حيثما إنتهى الاخرون"

سنرى أولا ماذا كتبت في طريقة رسم الاشكال ثم أشرح بعض النقاط فيها:

public void DrawOval(float x, float y, float width, float height, Color paintColor, float rotate, int alpha)
	{
		// pure GDI+ code // I had problems with ImageGlue.NET in this point, so I have used GDI+ here
		gr = wr.Wrap(ref ca);
		gr.SmoothingMode = SmoothingMode.HighQuality;
		gr.PixelOffsetMode = PixelOffsetMode.HighQuality;

		double fangle = (double)rotate / 180 * 3.1415926;
		Matrix xform = new Matrix((float)Math.Cos(fangle)
		, (float)Math.Sin(fangle)
		, (float)-Math.Sin(fangle)
		, (float)Math.Cos(fangle)
		, (float)((x + (width / 2)) - Math.Cos(fangle) * (x + (width / 2)) + Math.Sin(fangle) * (y + (height / 2)))
		, (float)((y + (height / 2)) - Math.Cos(fangle) * (y + (height / 2)) - Math.Sin(fangle) * (x + (width / 2))));
		gr.Transform = xform;

		SolidBrush b = new SolidBrush(Color.FromArgb(alpha, paintColor));
		gr.FillEllipse(b, x, y, width, height);

		ca = wr.Unwrap(ref gr);
	}

أول شيء هو عملت حجز لل Ca في الذاكرة داخل ال Wrapper من أجل التمكين من الإضافة له

ثم حددت بعض الخصائص من أجل اظهار الصورة بدقة عالية

بدأت في تطبيق الدوران و الازاحة مثلما قلت باستخدام المصفوفات .. طبعا الكائن سيتم تخزينه داخل gr المشتقة من الكلاس

Graphics و بالتالي بعد عمل الازاحة قمت بإسناد المصفوفة لخاصية الدوران الخاصة بال gr

بدونها سوف يتم تدوير الشكل حسب الزاوية التي مررناها للطريقة ولكن سنجد الشكل موجود في مكان اخر

قمنا بعدها برسم الشكل البيضاوي Ellipse و حددنا إحداثياته و طوله و عرضه

اخر خطوة هي تحرير الكائن gr من أجل إضافته لل Canvas

يعني لو اضفنا قبله صورتين و نص ووووو سنجد أننا أضفنا أيضا الشكل البيضاوي مع البقية لتظهر لنا صورة

تحوي على أشكال عدة.

بعد ذلك قمنا بعمل طريقة و طبقنا عليها ال Overloading مرة أخى لرسم الصور أو بمعنى أصح

إضافتها لل Canvas و الفرق ان العادية تأخذ المسار للصورة و الإحداثيات اما الثانية فأضفنا لها أيضا

الطول والعرض كالتالي:

   public void AddTransparentImage(string inPath, float x, float y)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "Mode=transparent Pos=" + x + "," + y);
	}
	public void AddTransparentImage(string inPath, float x, float y, float width, float height)
	{
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "Mode=transparent Size=" + width.ToString() + "," + height.ToString() + " Pos=" + x + "," + y);
	}

لا ننسى أنه في حال استدعاء الطريقة الأولى فسيتم إضافة الصورة بنفس حجمها الأصلي و هذه مصيبة

في حال علمنا بأنها كبيرة و قد تكون أكبر من الخلفية ..

أيضا لا ننسى أن الصور ما عدا الخلفية يجب ان تكون شفافة لذا يفضل إستخدام نوعية PNG-24 كنوع للصور

الان عملت طريقة لاعادة تحجيم الصورة كالتالي:

public void ResizeImage(string inPath, string outPath, int height, int width)
	{
		ca.Clear();
		ca.DrawFile(HttpContext.Current.Server.MapPath(inPath), "height<" + height + ", width<" + width);
		ca.SaveAs(HttpContext.Current.Server.MapPath(outPath), "");
		ca.Clear();
	}

هناك أمر خطير جدا .. ستجدوني قمت بكتابة Ca.Clear و هذا يعني أن ما قبل استدعاء هذه الطريقة سيتم حذفه تماما

ولكن انا لست غبياّّّ!!!

أنا سأستدعيها في مرحلة لاحقة من أجل فقط جلب الاعلان بعد الانتهاء منه و تصغيره و عرضه ك Thumbnail

:)

مممممممم اقتربنا من نهاية هذا الكلاس المتعب و الممتع بنفس الوقت

حفظ الصورة النهائية

الكود هو

 public void SaveAsImage(string imgUrl)
	{
		ca.SaveAs(HttpContext.Current.Server.MapPath(imgUrl), "Quality=100.0");
	}
	public void SaveAsImage(string imgUrl, string param)
	{

		ca.SaveAs(HttpContext.Current.Server.MapPath(imgUrl), param);
	}

overloading مرة أخرى .. أعتقد أننا تعلمنا بعض استخدامات و ميزات ال OOP

كل ما علينا هو استدعاء ca.SaveAs و تمرير اسم الصورة لها .. ولكن في الحالة العادية سوف تحفظ بجودة عالية ولكن

ماذا لو أردنا ان تكون ذات جودة منخفضة لأسباب معينة؟؟؟؟؟؟؟؟

أحيانا قد نحتاج ذلك لأسباب معينة

مثلا: ربما نحتاج لعمل نافذة Preview تظهر الصورة في كل مرة عدلنا عليها حتى يستطيع المستخدم معرفة ماذا حصل.

و أنا أتسلى في ملفات المساعدة أكتشف أنه من أجل تصدير الصورة على شكل ملف PDF فكل ما عليه هو تمرير إسمها بإمتداد .pdf

فقط لذا قررت أن تكون الطريقة بهذا الاسم:

public void SaveAsPDF(string PDFUrl)
	{
		this.SaveAsImage(PDFUrl);
	}

قد يكون أحدنا اذكى مني و يقول: يا أستاذ محمد كان كل شيء جميل و لكن هنا أنصحك بان تحذف هذه

الطريقة و تقوم باستخدام SaveAsImage السابقة بدلا منها ما دمت تعلم أن تمرير اسم الصورة مع امتداد pdf يكفي

!!!!!!!!!

كلام جميل و قد يكون سليما ولكن .... أنا عشت 27 سنة ولا أعلم كم سأعيش .. لنفرض أني اختفيت!!

كيف سيعلم من بعدي أن حفظ الصورة و ملف ال PDF هو نفس الشيء ولكن الامتداد من يحدد؟؟

:) عرفتوا ليش؟

سؤال ترفيهي .. بتعرفوا ليش بيقولوا: "هو دخول الحمام زي خروجو"؟ على الطريقة المصرية

مممممممم أنا بعرف .. بس بطريقتي ..

جوابي لان دخول الحمام معناه فتح باب الحمام و الخروج معناه إغلاق باب الحمام بعدنا ..

نحن قمنا بفتح الباب و يجب أن نغلق الكلاس .. لذا وجب أن نقوم بإلغاء كل شيء يخص ال Canvas كالتالي

	public void Close()
	{
		ca.Clear();
		ca.Dispose();
	}

بصراحة من أول ما بلشت أكتب هالكلاس وانا بحلم بالوصول لنهايته .. الحمد لله وصلت ..

سأنتظر تعليقاتكم :)

موفقين جميعا

You can fly while you can touch the sky

#35

ممممممممم الشرح مرة حلو و ممتع :) و الأشياء التي شرحتها الحمد لله وصلت ، هناك أشياء تفصيلية أخرى لم أفهما بالضبط مثل الدالة الخاصة بالتدوير و لكن المفهوم العام وصل و أكيد أنة لما نستخدمها في البرمجة سوف تتوضح بشكل أكبر .

بإنتظار المزيد من الإبداعات .

سبحان الله وبحمده سبحان الله العظيم

#36

شكراا لك على الرد .. انا ظننت أن الكل قد هجر المكان .. عموما دعنا ننتظر مشاركات الاخرين فأنا لا زلت أفتقد خمس أعضاء بدأوا بالتفاعل معنا..

إن كان هناك إستفسار يا ريت تخبروني ولو كانت هناك مشاكل أو أسئلة فلا تقلقوا .. فقط إسألوني ..

و أيضا إن كان هناك إعتراض على طريقة الشرح ياريت أعرف وين المشكلة ..

انا أعددت المزيد من الاكواد لكن ساعطيكم الفرصة لتتابعوا ما حدث .. ثم نعود للمتابعة

You can fly while you can touch the sky

#37

السلام عليكم :

الحلو فيك أخ أبو صلاح أصرارك على تقديم المعرفة ومساعدة الآخرين ...

بصراحة أنت أستاذ رائع من الطراز الأول ، بالتوفيق ...

#38

شكراا لك أخ star من ذوقك .. انا اللي المفروض أشكرهم لأني بتعلم معهم :)

نكمل يا جماعة والا لأ؟

عموما انا باخر يوم عمل هذا الاسبوع و أكيد الجمعة والسبت اجازة = مجموعة أكواد جديدة ..

انتظروا المزيد مني ....

مضى من المشروع اسبوعين تقريبا وباقي إسبوعين بالأكثر .. يجب أن ننتهي منه

You can fly while you can touch the sky

#39

من الشكل الموضح هنا :

post-2041-1177231035.gif

سنبدأ التفكير كيف سنقوم بتصميم الموقع ..

فكرتي هي إستخدام صفحة Default.aspx لتحوي فقط على PalceHolder.. بعد عمليات على الكود نقوم بمعرفة أي صفحة سيتم عرضها.

طبعا الصفحات ستكون عبارة عن User Controls موجودة بداخل المجلد UserControls

بداية يلزمنا صفحة رئيسية تحوي نبذة عن الموقع مثلا

و صفحة للأخطاء على الأقل تفيد بأنك وصلت لصفحة غير موجودة و تعيدك للصفحة الرئيسة..

تمام؟

كيفية المنطق في هذه الحالة؟

س.كيف سيعرف ال PlaceHolder أنني هنا أود عرض الصفحة الرئيسية؟ ربما أريد أن أعرض صفحة الاعلانات؟

طبعا يجب أن نخبره.. أنا فكرت في إستخدام ال QueryString لإرسال إسم الكنترول الذي سيتم عرضه.

س. قد يأتي أحدهم ويقوم كلامك منطقي ولكن جزئيا .. كيف؟ لنفرض أنك قمت بعرض الموقع لأول مرة ماذا ستفعل؟ ليس هناك QueryString فكيف ستعرف الاداة المطلوبة؟

كلامك جميل جدا .. هناك حل من اثنين .. اولها غبي جدا و منطقي جزئيا وهي:

أن نقوم بعمل حدث PageLoad في الصفحة الاولى و نقوم بتحويل الصفحة لنفسها ولكن مع تمرير QueryString

والحل الثاني و الجيد أن نقوم بعمل فحص لل QueryString عن طريق if conditions او switch case

س. طيب ما الفرق؟ لماذا الحل الأول غبي والثاني صحيح؟

ممممم تعلمت بالرياضات ال Prove by induction .. سنثبت الثانية عكسيا حتى نثبت قوتها مقارنة بالأولى:

الان ماذا لو لم تكن هناك اي باراميتر لشريط العنوان؟

ال Switch case ستقوم بتحويله ل home.aspx و نستطيع من خلالها ايضا أن نحوله لصفحة البداية مرة أخرى إن تم العبث بشريط العنوان

من أجل الحصول على صفحة ربما تكون موجودة او لا.

بالتالي نستطيع عمل كل الاستثناءات و فحص وجود الادوات ووووووووو

الكود سيكون كالتالي في صفحة Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
	{
		if (Request.QueryString.HasKeys())
		{
			string page = Request.QueryString["page"].ToString();
			if (File.Exists(this.Server.MapPath(Web.GetControlPath(page))))
				ControlHolder.Controls.Add(
					this.LoadControl(Web.GetControlPath(page))
					);
			else
				ControlHolder.Controls.Add(
					this.LoadControl(Web.GetControlPath("invalidPage"))
					);
		}
		else
		{
			ControlHolder.Controls.Add(
				this.LoadControl(Web.GetControlPath("home"))
				);
		}

	}

الكود بإختصار مع إنه سهل للفهم .. نفحص محتويات ال QueryString إذا لما يكن بها مفاتيح نقوم بعرض الكنترول invalidPage و إن كان هناك نقوم بالفحص مرة أخرى

إن كانت الصفحة موجودة إعرض الاداة و إن لم تكن موجودة ربما بالخطأ او قام المستخدم بتغيير صيغة المفتاح في شريط العنوان إعرض ال invalidPage

طبعا إحتجت لإضافة Method للكلاس Web تقوم بإستخدام المسار الصحيح لمجلد الادوات و هذا هو الكود الخاص بها

public static string GetControlPath(string _control)
		{
			return "./UserControls/" + _control + ".ascx";
		}

طبعا هناك فكرة يمكنكم عملها لوحدكم و هي أن تقوموا أيضا بداخل هذه الطريقة أن تفحصوا وجود الاداة على السيرفر قبل عرضها و في حال عدم وجودها يتم إرسالنا للاداة InvalidPage

طيب أغششكم ..

الفكرة كالتالي:

public static string GetControlPath(string _control)
		{
			string path = "./UserControls/" + _control + ".ascx";
			if(File.Exists(HttpContext.Current.Server.MapPath(path)))
				return path;
			else return "./UserControls/invalidPage.ascx";
		}

كان هدفي من هذا الرد على الموضوع النقاط التالية:

- طرح فكرة جديدة في طريقة التفكير في تصميم هيكلية المواقع.

- التعامل مع الملفات ولو بشكل بسيط و تفعيل دورها المهمل في التطبيقات.

- تعلم كيفية جعل الموقع أبسط من ناحية الصيانة و فصل المحتويات كالأدوات و بالتالي يسهل الوصول لها و تعديلها و إضافة المزيد دون التأثير على بنية الموقع الأساسية.

يا ريت أرجع أشوف تفاعل الجميع مع المشروع :)

وسامحونا على التقصير

You can fly while you can touch the sky

#40

السلام عليكم و رحمة الله و بركاته أخ محمد

أنا تابعت معك حتى الآن و اعمل على vb2005

ولا يوجد مشاكل

فقط نسيت حضرتك ان تعرف (Dim ControlHolder As PlaceHolder) مزبوط?

انا دخلت بالموضوع مرة واحدة للوهلة الأولى يوجد معلومات جديدة لكن أحس أني أقدر أفهمها و أتابع فيها

و لكن متى يبدأ دور المشاركين بالبرمجة ؟

:rolleyes: و بعدين معقول عمرك 27 سنة و طالع منك كل ها الشي !

وفقكم الله

#41

وعليكم السلام ..

أولا انا ما نسيت أعرف ال PlaceHolder وانا ما ذكرت أي تعريفات ولكن مجرد وضعت الحدث Page_Load و عموما بمجرد إضافة الكنترول للفورم سوف

يتم إضافة تعريف له.

دور المبرمجين هو عمل نفس هذا المشروع في البيت بطريقتهم الخاصة .. يعني .. على الأقل كأفضل طريقة أنا أراها هو فهم الفكرة و عمل محاكاة لها

دون نسخ و لصق الأكواد لكي نرى أين تكمن المشاكل و أيضا اكتساب و تثبيت المعلومات الجديدة

للأسف انا عملت مشاريع جماعية عدة في هذا المنتدى و غيره ولكن نقطة البداية و النهاية في المشروع واحدة و هي أنا .. انا من يكتب وانا من يستفيد

ولا أرى تفاعلا .. اما هنا فضلت أن اكتب ان حتى في حال عدم وجود التفاعل على الأقل كي أكمل الموضوع :)

بخصوص 27 سنة .. بالعكس انا بعتبر نفسي متأخرا نوعا ما والسبب أنني تركت فلسطين سنة 2006 و للأسف لا يوجد بها مراجع كافية او بيئة عمل تساعد

على التطور ..

الحمد لله على كل شيء ..

You can fly while you can touch the sky

#42

المشروع على حالته الأخيرة مرفق هنا في المرفقات ..

بالتوفيق و أي ملاحظات أهلا وسهلا

IG28_4_07.rar

You can fly while you can touch the sky

#43

مشكوووووووووووووور

#44

السلام عليكم

أستاذ : محمد شكرا لك على جهودك في مواصلة وضع الدروس وأرجو أن تسمح لي بوضع مجموعة من الأسئلة على الجزء السابق

- بالنسبة لقاعدة البيانات قمت بعمل جدول خاص بالمنتجات وجدول خاص بالإعلانات هل هذا يعني أن لكل منتج أكثر من صور إعلان؟

إذا اسمح لي : لماذا لم تجعله جدول واحد (سواء كان لكل منتج صورة أو أكثر) ونضيف حقل لتمييز إذا كان هذا منتج أم صورة وإذا كانت صورة لإى

منتج تتبع, دمج الجدوليين سوف يسهل ويسرع عمليات البحث والتعامل مع هذة البيانات ؟

- لماذا قمت بإنشاء علاقة بين جدول للموزعين وجدول الإعلانات كنت أعتقد أن العلاقة فقظ بين الإعلانات والمنتجات حيث أن الإعلانات تتبع المنتجات؟

- طبعا قد يسألني البعض .. لماذا لا توجد علاقة بين جدول المنتجات و جدول الإعلانات؟

ممممممم المفروض في لكن مش بالطريقة اللي حابب أطرحها كفكرة برمجية .. هناك تكنيك جميل

سوف نتعرض له من خلال الإجرائيات المخزنة قد يكون جديدا على الكثير منا ...

ماهو هذاالتكنيك أم أنه لم يأتي وقته بعد ؟

- فكرة إستخدام user control فكرة جيدة من حيث الهيكلة الصحيحة للموقع لكني كنت أواجه مشكلة في ضبط تصميم الموقع عند إستخدامها وبالذات إذا كان الموقع تصميمه معقد نوع ما ؟؟؟ لم أعرف كيف يمكن التحكم بها بشكل كامل؟

أرجو أن لاأكون قد أطلت ؟؟؟ وسأحاول مواصلة تطبيق الجزء الأخر

شكرا لك.

#45

في البداية كان عندي سؤال عن الـ PlaceHolder ما مفهومة بالضبط , أنا بصراحة ما برمجت فية و حابب أعرف وين ممكن أحتاج إلى البرمجة بة .

اقتباس
دور المبرمجين هو عمل نفس هذا المشروع في البيت بطريقتهم الخاصة .. يعني .. على الأقل كأفضل طريقة أنا أراها هو فهم الفكرة و عمل محاكاة لها

دون نسخ و لصق الأكواد لكي نرى أين تكمن المشاكل و أيضا اكتساب و تثبيت المعلومات الجديدة

للأسف انا عملت مشاريع جماعية عدة في هذا المنتدى و غيره ولكن نقطة البداية و النهاية في المشروع واحدة و هي أنا .. انا من يكتب وانا من يستفيد

ولا أرى تفاعلا

أنا شخصيا مش شايف نفسي واصل إلى المرحلة التي أقرأ فية الكود فقط و أقوم بعملة بطريقتي الخاصة إن شاء الله سوف أصل إليها و لكن بالتدريج ، أما عن الإستفادة فأنا مستفيد جدا سواء كان من طريقة البرمجة , الهيكلة للموقع وأشياء كثيرة حتى أني بدأت أستخدم (بشكل مبدائي) هذة المفاهيم في برمجتي الخاصة .

في الأخير أتمنى فعلا أن يشاركوا ذوي الخبرة هنا لأنة أكيد بيكون عندهم أفكار مختلفة تثري الموضوع .

:)

سبحان الله وبحمده سبحان الله العظيم

#46

بالنسبة ل Kathy

كل اعلان قد يحتوي على منتج أو أكثر وليس العكس .. نحن نقوم بتوليد إعلانات من خلال النظام.

بشكل عام في تصميم قواعد البيانات إن كانت العلاقة 1-M يجب أن يتم وضع جدولين بالطبع و ليس فقط من أجل ذلك .. و إنما أيضا من أجل سهولة فهم قاعدة البيانات و عمل Diagrams

تقوم بشرح النظام

الموزع هو من يقوم بعمل إعلان له لنفس الماركة .. مثلا : شركة بيبسي كولا .. لها موزعين مثل فرضا الشركة العالمية و الشركة المتحدة للمشروبات على فرض .. كل شركة منها تقوم بعمل إعلانات لبيبسي ولكن بطريقتها الخاصة أي النص و المنتجات الخاصة بها .. هذا كان مثال للتوضيح

بخصوص التكنيك الذي قصدته سوف يعتمد على قدرات معينة بال Sql Server

مثلا سنقوم بتخزين أرقام المنتجات التي ستضاف للاعلان في حقل ال ProductsId على الشكل التالي فرضا

1,3,6,13,

ها هي محتويات الحقل في جدول الاعلان ..

سوف نتعلم كيف نمررها للاجرائية المخزنة لكي تعيد لنا DataTable به صفوف تحوي كل منتج في صف كلا على حدة

بخصوص فكرة ال UserControl أنتي حرة في الاستغناء عنها إن كان تصميمك معقدا ولكن أعتقد لو اعتمدت ال CSS فلن تواجهي مشاكل أبدا.

أيضا يمكنك إستخدام ال MasterPages و هي تعتمد كثيرا على ال Holders

سأعود للرد على students بالقريب .. وقت العمل الان !

You can fly while you can touch the sky

#47

أخ محمد

أقرأ الرسائل الشخصية من فضلك

#48

باختصار ال PlaceHolder و كالعادة لا أملك ترجمة مباشرة لها ولكن يمكن تشبيهها بحاوية نقوم بإضافة الكنترولز لها كالتالي:

ControlHolder.Controls.Add(
					this.LoadControl(CTRLwithVirtualPathParameter);

You can fly while you can touch the sky

#49

أستاذ محمد أنا لما قرأت الكود فهمت أنها عبارة عن حاوية تضيف لها objsct و لكن سؤالي ما فائدة أن نضيف لها كنترولز و أين سوف نستخدمها و ما فائدة البرمجة بها .

سبحان الله وبحمده سبحان الله العظيم

#50

تفيد كالتالي:

تسهل عملية عرض الادوات Controls

أيضا بديل عن ال drag and drop لل usercontrols في صفحة ال design وبالتالي تسمح لك بعمل dynamic calling for controls

تمام؟

You can fly while you can touch the sky

هذا الموضوع مغلق.

مواضيع مشابهة