PDA

View Full Version : مقدار دهی به Font



zhilbert
چهارشنبه 15 اردیبهشت 1389, 20:07 عصر
دوستان سلام.من نام و سایز رو از طریق Font Dialog انتخاب کردم و همین مقادیر رو توی بانک ذخیره کردم و حالا میخوام مثلا روی فونت تکست باکسم همین مقادیری که توی بانک ذخیره کردم اعمال بشه یعنی اینطوری:


TextBox1.Font = New Font(BindingContext(dsChequeControl, "TBL1. fontname").Current, BindingContext(dsChequeControl, " TBL1.fontsize").Current, BindingContext(dsChequeControl, " TBL1. fontstyle").Current)


ولی این کد رو قبول نمیکنه:گریه::گریه::گریه:باید چکارش کنم؟دوستان لطفا کمکم کنین

iman_me
چهارشنبه 15 اردیبهشت 1389, 22:37 عصر
چرا این همه به خودت زحمت میدی و با یک تیبل اضافی برنامت روسنگین میکنی
توی ریجستری ذخیره کن هم راحت تره هم کار میکنه

zhilbert
پنج شنبه 16 اردیبهشت 1389, 12:47 عصر
درود

به دلایلی باید از بانک استفاده کنم . مشکل اینه که این رشته که حاوی مثلا نام فونته چجوری باید روی فونت یک تکست باکس اعمال بشه

یعنی اصلا امکان نداره ؟

barbodsoft.com
پنج شنبه 16 اردیبهشت 1389, 18:42 عصر
درود

به دلایلی باید از بانک استفاده کنم . مشکل اینه که این رشته که حاوی مثلا نام فونته چجوری باید روی فونت یک تکست باکس اعمال بشه

یعنی اصلا امکان نداره ؟

سلام
من برای ذخیره رنگ نتونستم از دیتابیس استفاده کنم. حق باشماست نمی شه همیشه از ریجستری استفاده کرد. فرض کنید می خواهیم اطلاعاتی مثل رنگ ، فونت و ... رو روی سیستم سرور تنظیم کنیم و همه کلاینت ها براساس سیستم سرور تنظیم بشن. در اینصورت رجستری نمی تونه مفید باشه.

یک پیشنهاد دارم . بیا و تعدادی فونت رو تعریف کن و از با یک سری کد در دیتابیس ذخیره کن و از طریق یک تابع که می نویسی تشخیص بده که فونت چی هست.

مثلا برای فونت تاهاما یک استرینگ "tahama" ذخیره کن و هنگامی که از دیتابیس می خونی به این شکل استفاده کن.



Dim strfont AsString = " مقداری که از دتابیس دریافت می شه"
SelectCase strfont
Case"tahama"
TextBox1 .Font =New ...
Case"arial"
....
EndSelect


البته این کار خیلی وقت گیر و غیر اصولی هست ولی فکر می کنم بعضی وقتا مفید باشه.

sari-1369
جمعه 17 اردیبهشت 1389, 00:50 صبح
این مثال که براتون گزاشتم ابتدا میاد نوع قلم و اندازه و همینطور رنگ رو از کاربر میگیره و نام و مقدار اونهارو توی حافظه هایی از نوع رشته ای ( مثل فیلد رشته ای در بانک ) نگهداری میکنه و بعد از اون بر اساس مقادیر این حافظه های رشته ای Font و Color و Size تکست باکس رو مقدار دهی میکنه .

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim _font, _R, _g, _b, _size As String
Dim f As New FontDialog
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
_font = f.Font.Name
_size = f.Font.Size
RichTextBox1.Font = New Font(_font, Convert.ToSingle(_size))
End If
Dim c As New ColorDialog
If c.ShowDialog = Windows.Forms.DialogResult.OK Then
_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))
End If
End Sub

zhilbert
شنبه 18 اردیبهشت 1389, 17:02 عصر
مرسی
حالا برای مقدار دهی بخش Style باید چکارکنم ؟

barbodsoft.com
شنبه 18 اردیبهشت 1389, 17:24 عصر
این مثال که براتون گزاشتم ابتدا میاد نوع قلم و اندازه و همینطور رنگ رو از کاربر میگیره و نام و مقدار اونهارو توی حافظه هایی از نوع رشته ای ( مثل فیلد رشته ای در بانک ) نگهداری میکنه و بعد از اون بر اساس مقادیر این حافظه های رشته ای Font و Color و Size تکست باکس رو مقدار دهی میکنه .

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim _font, _R, _g, _b, _size As String
Dim f As New FontDialog
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
_font = f.Font.Name
_size = f.Font.Size
RichTextBox1.Font = New Font(_font, Convert.ToSingle(_size))
End If
Dim c As New ColorDialog
If c.ShowDialog = Windows.Forms.DialogResult.OK Then
_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))
End If
End Sub

سلام
روش خوبی هست. من هم در حال حاضر از این روش استفاده می کنم. ولی فرض کنید تو برنامه تعداد زیادی گزینه برای تنظیم کردن وجود دارد آیا تعداد زیاد باعث سردرگمی نخواهد شد.

برنامه های مثل فتوشاپ تعداد زیادی گزینه برای تنظیم دارند اگه بخواهیم همچین کاری بکنیم کار خیلی سخت خواهد شد.

بهتره دنبال یک راه بهتر هم بگردیم.

mehdi.mousavi
شنبه 18 اردیبهشت 1389, 17:43 عصر
سلام من برای ذخیره رنگ نتونستم از دیتابیس استفاده کنم.

سلام.
منظورتون چیه که نتونستم از Database برای ذخیره رنگ استفاده کنم؟ مگه رنگ چیزی غیر از int32 هستش؟؟؟ میشه اندکی در این مورد توضیح بدید؟

mehdi.mousavi
شنبه 18 اردیبهشت 1389, 17:46 عصر
این مثال که براتون گزاشتم ابتدا میاد نوع قلم و اندازه و همینطور رنگ رو از کاربر میگیره


Dim c As New ColorDialog
If c.ShowDialog = Windows.Forms.DialogResult.OK Then
_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))
End If
End Sub

سلام.
واقعیتش متوجه نشدم جدا کردن RGB برای چی بوده. چرا جای این خطوط

_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))

از

RichTextBox1.ForeColor = c.Color

استفاده نکرده اید؟

موفق باشید.

sari-1369
شنبه 18 اردیبهشت 1389, 17:55 عصر
مرسی
حالا برای مقدار دهی بخش Style باید چکارکنم ؟


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim _font, _R, _g, _b, _size, _style As String
Dim f As New FontDialog
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
_font = f.Font.Name
_size = f.Font.Size
_style = f.Font.Style
Dim s As System.Drawing.FontStyle = _style
RichTextBox1.Font = New Font(_font, Convert.ToSingle(_size), s)
End If
Dim c As New ColorDialog
If c.ShowDialog = Windows.Forms.DialogResult.OK Then
_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))
End If
End Sub

sari-1369
شنبه 18 اردیبهشت 1389, 18:00 عصر
سلام.
واقعیتش متوجه نشدم جدا کردن RGB برای چی بوده. چرا جای این خطوط

_R = c.Color.R
_g = c.Color.G
_b = c.Color.B
RichTextBox1.ForeColor = Color.FromArgb(CInt(_R), CInt(_g), CInt(_b))

از

RichTextBox1.ForeColor = c.Color

استفاده نکرده اید؟

موفق باشید.

آخه c.clolor ازنوع color هستش و نمیشه اونو مستقیم توی حافظه string ذخیره کرد . مجبور شدم که تجزیش کنم .

البته اینکار رو هم میشه کرد :

Dim n As String = c.Color.Name
RichTextBox1.ForeColor = Color.FromName(n)

ولی گفتم شاید بعضی از رنگها اسم نداشته باشن از rgb استفاده کردم .

sari-1369
شنبه 18 اردیبهشت 1389, 18:11 عصر
سلام
روش خوبی هست. من هم در حال حاضر از این روش استفاده می کنم. ولی فرض کنید تو برنامه تعداد زیادی گزینه برای تنظیم کردن وجود دارد آیا تعداد زیاد باعث سردرگمی نخواهد شد.

برنامه های مثل فتوشاپ تعداد زیادی گزینه برای تنظیم دارند اگه بخواهیم همچین کاری بکنیم کار خیلی سخت خواهد شد.

بهتره دنبال یک راه بهتر هم بگردیم.

سر رد گمی کی ؟ برنامه نویس ؟ به نظر من که باعث سردرگمی نمیشه ولی هر طور حساب کنی هرچی برنامه پیشرفته تر باشه و تنظیمات بیشتری داشته باشه طبیعتا این کد ها بیشتر میشن . بقیش به ذوق برنامه نویس ربط داره که میخواد این کد هارو واسه هر آبجکتش کپی کنه یا اینکه یه تابع عمومی بنویسه .

mehdi.mousavi
شنبه 18 اردیبهشت 1389, 18:12 عصر
آخه c.clolor ازنوع color هستش و نمیشه اونو مستقیم توی حافظه string ذخیره کرد . مجبور شدم که تجزیش کنم .

string؟ متوجه نمیشم. ForeColor هم از نوع Color هستش.

sari-1369
شنبه 18 اردیبهشت 1389, 18:18 عصر
string؟ متوجه نمیشم. ForeColor هم از نوع Color هستش.

این که شما میگید درسته ولی به صورت مستقیم این کار رو انجام میده ، اون کاربر ایجاد کننده بحق میخواستن که رنگ رو درون دیتابیس ذخیره کنن و برای دفعات بعدی اجاری برنامه تنظیمات رو اعمال کنن . بخاطر همین من ابتدا مقادیر رو توی خافظه های string ریختم که یه جورایی اون حالت خوندن از بانک رو شبیه سازی کرده باشم .

mehdi.mousavi
شنبه 18 اردیبهشت 1389, 18:30 عصر
این که شما میگید درسته ولی به صورت مستقیم این کار رو انجام میده ، اون کاربر ایجاد کننده بحق میخواستن که رنگ رو درون دیتابیس ذخیره کنن و برای دفعات بعدی اجاری برنامه تنظیمات رو اعمال کنن . بخاطر همین من ابتدا مقادیر رو توی خافظه های string ریختم که یه جورایی اون حالت خوندن از بانک رو شبیه سازی کرده باشم .

آهان... اما بازهم نیازی نیست string نگه دارید. کافیه تا یه int32 نگهدارید. اگر دقت کنید، FromArgb یه Overload داره که int32 میگیره. از طرف دیگه Color متودی داره تحت عنوان ToArgb که بهتون یه int32 میده. بدین ترتیب می تونید در بانک، برای هر رنگ، یه int32 نگهدارید که همه جوره نسبت به string به صرفه هستش.

البته من در کل این روش رو نمی پسندم. برای انجام اینکار، بهتره برای همه کنترلهایی که قصد دارن باهاش اینکارو کنن، Interface خاصی رو پیاده سازی کنن. سپس از روی این Interface میتونن Property های مورد نظرشون رو Serialize/Deserialize کنن و دیگه نیازی به اینکار نخواهد بود.

برای تعیین این Property ها نیز (چون ممکنه همه Property های یک کلاس رو نخوان ذخیره کنن)، میشه یه سری Marker Attribute درست کرد و Attribute های مورد نظر رو توسط این خصیصه Decorate کرد، سپس در جای دیگه ای از کد با استفاده از Reflection این Marker Attribute ها رو پیدا کرد و اونها رو باز Serialize/Deserialize کرد.

از اونجاییکه ممکنه این مکانیزم رو بخوان در بخشهای متفاوت استفاده کنن، باید مکانیزمی Uniform رو برای اینکار ایجاد کنن، نه اینکه هر جای کد که به نگهداری چند Attribute در بانک نیاز بود، کد مزبور رو تکرار کنن...

موفق باشید.

sari-1369
شنبه 18 اردیبهشت 1389, 18:53 عصر
آهان... اما بازهم نیازی نیست string نگه دارید. کافیه تا یه int32 نگهدارید. اگر دقت کنید، FromArgb یه Overload داره که int32 میگیره. از طرف دیگه Color متودی داره تحت عنوان ToArgb که بهتون یه int32 میده. بدین ترتیب می تونید در بانک، برای هر رنگ، یه int32 نگهدارید که همه جوره نسبت به string به صرفه هستش.

البته من در کل این روش رو نمی پسندم. برای انجام اینکار، بهتره برای همه کنترلهایی که قصد دارن باهاش اینکارو کنن، Interface خاصی رو پیاده سازی کنن. سپس از روی این Interface میتونن Property های مورد نظرشون رو Serialize/Deserialize کنن و دیگه نیازی به اینکار نخواهد بود.

برای تعیین این Property ها نیز (چون ممکنه همه Property های یک کلاس رو نخوان ذخیره کنن)، میشه یه سری Marker Attribute درست کرد و Attribute های مورد نظر رو توسط این خصیصه Decorate کرد، سپس در جای دیگه ای از کد با استفاده از Reflection این Marker Attribute ها رو پیدا کرد و اونها رو باز Serialize/Deserialize کرد.

از اونجاییکه ممکنه این مکانیزم رو بخوان در بخشهای متفاوت استفاده کنن، باید مکانیزمی Uniform رو برای اینکار ایجاد کنن، نه اینکه هر جای کد که به نگهداری چند Attribute در بانک نیاز بود، کد مزبور رو تکرار کنن...

موفق باشید.

در مورد قسمت اول صحبتاتون موافقم . در مورد قسمت دوم چیزی متوجه نشدم :لبخند:

barbodsoft.com
چهارشنبه 22 اردیبهشت 1389, 18:28 عصر
سلام
جناب موسوی اگه می شه یک کم بیشتر توضیح بدید . من فکر نمی کردم بشه رنگ یا فونت رو تو دیتابیس ذخیره کرد.
اگه می شه با یک مثال توضیح بدید. ممنون.

mehdi.mousavi
پنج شنبه 23 اردیبهشت 1389, 11:47 صبح
سلام جناب موسوی اگه می شه یک کم بیشتر توضیح بدید . من فکر نمی کردم بشه رنگ یا فونت رو تو دیتابیس ذخیره کرد. اگه می شه با یک مثال توضیح بدید. ممنون.

سلام.
هر چیزی رو که بتونیم به شکل صفر و یک بیان کنیم رو میتونیم در بانک ذخیره کنیم. رنگ، فونت یا حتی به زودی "بو"...

ببینید. کافیه تا روش Serialization (عمل تبدیل یه Instance از یک کلاس به Byte Array) و Deserialization (عمل تبدیل Byte Array به یک Instance از کلاس) برای کلاس مورد نظر رو درست انجام بدیم. شما حتی می تونید کل فرم رو Serialize/Deserialize کنید. اما در این تاپیک قرار نیست تا اونجاها پیش بریم و فقط به سوال شما پاسخ میدم. اینکه چطور رنگ رو در بانک ذخیره کنیم.

برای ذخیره رنگ، شما هم میتونید کل Instance از کلاس Color مورد نظر رو بصورت باینری Serialize کنید و در فیلد image ای در بانک نگهدارید. هم میتونید فقط یک عدد integer بازای Color مورد نظر خودتون در بانک نگهداری کنید. در واقع این integer از کجا میاد؟

هر رنگ رو (برای مشاهده روی صفحه مانیتور، و نه چاپ) میتونیم با سه عنصر قرمز، سبز و آبی تعیین کنیم. یعنی کلیه رنگهای مورد نظر رو میتونیم از ترکیب این سه رنگ بدست بیاریم (که به اختصار RGB میگیم، یعنی Red، Green و Blue).

رنگ نارنجی رو بطور مثال در نظر بگیرید که RGB اش مثلا هست: ff9900
یعنی قرمزش هست ff هگز یا 255 دسیمال
سبزش هست 99 یا 153 دسیمال
و آبی اش هست 0

پس برای اینکه رنگ نارنجی رو ما بتونیم توی بانک نگهداریم، کافیه تا ff9900 رو در بانک ذخیره کنیم. یا مقدار معادل دسیمالش یعنی 16,750,848

بدین ترتیب میدونیم این عدد یعنی رنگ نارنجی با RGB ی 255، 153 و 0.

کلاس Color متودهایی داره که به ما اجازه این تبدیل رو میده. برای تعریف رنگ نارنجی، این کد رو داریم:

Color orangeColor = Color.FromArgb(0, 0xff, 0x99, 0x0);

حالا برای اینکه به عدد 16750848 برسیم، کافیه بدین شکل عمل کنیم:

int colorToSave = orangeColor.ToArgb();

با اینکار، همونطور که می بینید یه Integer داریم که عدد 16750848 در اون قرار میگیره. در نهایت از روی این عدد، میتونیم مجدد به اون Instance از Color برسیم:

Color colorReadFromDb = Color.FromArgb(colorToSave);

خوب. می بینید که بدون دردسر میتونیم رنگ رو تنها در یک integer در بانک (یا هر جای دیگه) ذخیره کنیم.

موفق باشید.

پاورقی: حواسم نبود اینجا بخش VB.NET هستش و کدهایی که نوشتم C# هستش. در کل فقط اندکی Syntax اش فرق میکنه والا روش همینه.

barbodsoft.com
پنج شنبه 23 اردیبهشت 1389, 16:51 عصر
سلام
کارتون خیلی درسته.
خوب حالا برای فونت چی رو باید ذخیره کرد. آیا می شه کل استایل رو یکجا ذخیره کرد یا باید هر پارامتر رو به صورت جداگانه ذخیره کرد؟

mehdi.mousavi
شنبه 25 اردیبهشت 1389, 11:29 صبح
سلام کارتون خیلی درسته. خوب حالا برای فونت چی رو باید ذخیره کرد. آیا می شه کل استایل رو یکجا ذخیره کرد یا باید هر پارامتر رو به صورت جداگانه ذخیره کرد؟

سلام.
اما در مورد فونت... از اونجاییکه کلاس Font متاسفانه یه Public Constructor بدون پارامتر نداره، در نتیجه نمیشه اونو Serialize کرد، پس باید دنبال روشی بود که بشه اینکارو ساده تر انجام داد. برای اینکار، کلاسی کمکی تعریف می کنیم، تا عمل Serialization/Deserialization رو بتونیم بکمک اون انجام بدیم و فقط بخشهایی از کلاس فونت رو ذخیره کنیم، که به اون نیاز داریم.


[Serializable]
public class XmlFont
{
public string FontFamily;
public float Size;
public FontStyle Style;

public XmlFont()
{
}

public XmlFont(Font font)
{
FontFamily = font.FontFamily.Name;
Size = font.Size;
Style = font.Style;
}

public Font ToFont()
{
return new Font(FontFamily, Size, Style);
}
}


سپس، فرض کنید فونتی داریم که میخواهیم اونو در بانک ذخیره کنیم:

Font font = new Font("verdana", 12f, FontStyle.Bold);


اکنون، برای ذخیره این Instance، من میام اونو به یک XML تبدیل میکنم:


XmlSerializer serializer = new XmlSerializer(typeof(XmlFont));

string saveThisInDatabase = string.Empty;
using (StringWriter stringWriter = new StringWriter())
{
serializer.Serialize(stringWriter, new XmlFont(font));
saveThisInDatabase = stringWriter.ToString();
}


وقتی اینکارو کنید، در واقع توی متغیر saveThisInDatabase، متوجه میشید که XML زیر قرار میگیره:

<?xml version="1.0" encoding="utf-16"?>
<XmlFont xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FontFamily>Verdana</FontFamily>
<Size>12</Size>
<Style>Bold</Style>
</XmlFont>

خوب، حالا میتونم این string رو در بانک ذخیره کنم و بهنگام نیاز، اونو بکمک کد زیر، دوباره با Font تبدیل کنم:


using (StringReader stringReader = new StringReader(saveThisInDatabase))
{
XmlFont retrivedXmlFont = (XmlFont)serializer.Deserialize(stringReader);
Font savedFont = retrivedXmlFont.ToFont();
}


فقط حواستون باشه، هر Property ای از کلاس Font رو خواستید ذخیره کنید، باید تو کلاس XmlFont دست ببرید و تغییرات لازم رو اونجا اعمال کنید.

موفق باشید.

پاورقی: شما همچنین میتونید از SOAP Serializer، Binary Serializer و ... نیز استفاده کنید، اما برای کار شما، XML گزینه بهتری هستش.

sari-1369
شنبه 25 اردیبهشت 1389, 13:26 عصر
واقعا عالی بود ، فکر کنم اینطوری توی سرعت هم تاثیر زیادی داشته باشه .
راستی ، مهندس موسوی ، اینجا تالار VB.net هستش :لبخند:

mehdi.mousavi
شنبه 25 اردیبهشت 1389, 13:37 عصر
واقعا عالی بود ، فکر کنم اینطوری توی سرعت هم تاثیر زیادی داشته باشه . راستی ، مهندس موسوی ، اینجا تالار VB.net هستش :لبخند:

سلام.
ببخشید، من یادم میره اون بالا رو نگاه کنم ببینم تاپیک تو چه بخشی ارسال شده. :ناراحت:
در هر حال، کدهایی که نوشتم رو میتونید با استفاده از این Converter (http://www.developerfusion.com/tools/convert/csharp-to-vb/) به VB.NET تبدیل کنید.

موفق باشید.

barbodsoft.com
یک شنبه 26 اردیبهشت 1389, 15:04 عصر
سلام جناب موسوی
این وقتا فقط دکمه تشکر کافی نیست.
می شه گفت در حد تیم ملی بود. شاید هم بالاتر. زبان برنامه نویسی مهم نیست. مهم توضیحاتی هست که دادید. ممنون از وقتی که می زارید.
من خیلی وقتا اسم شما رو سرچ می کنم و پستها تون رو دنبال می کنم. همیشه باید دنبال الماس (بهترینها) گشت.

FastCode
یک شنبه 26 اردیبهشت 1389, 17:32 عصر
آهان... اما بازهم نیازی نیست string نگه دارید. کافیه تا یه int32 نگهدارید. اگر دقت کنید، FromArgb یه Overload داره که int32 میگیره. از طرف دیگه Color متودی داره تحت عنوان ToArgb که بهتون یه int32 میده. بدین ترتیب می تونید در بانک، برای هر رنگ، یه int32 نگهدارید که همه جوره نسبت به string به صرفه هستش.

البته من در کل این روش رو نمی پسندم. برای انجام اینکار، بهتره برای همه کنترلهایی که قصد دارن باهاش اینکارو کنن، Interface خاصی رو پیاده سازی کنن. سپس از روی این Interface میتونن Property های مورد نظرشون رو Serialize/Deserialize کنن و دیگه نیازی به اینکار نخواهد بود.

برای تعیین این Property ها نیز (چون ممکنه همه Property های یک کلاس رو نخوان ذخیره کنن)، میشه یه سری Marker Attribute درست کرد و Attribute های مورد نظر رو توسط این خصیصه Decorate کرد، سپس در جای دیگه ای از کد با استفاده از Reflection این Marker Attribute ها رو پیدا کرد و اونها رو باز Serialize/Deserialize کرد.

از اونجاییکه ممکنه این مکانیزم رو بخوان در بخشهای متفاوت استفاده کنن، باید مکانیزمی Uniform رو برای اینکار ایجاد کنن، نه اینکه هر جای کد که به نگهداری چند Attribute در بانک نیاز بود، کد مزبور رو تکرار کنن...

موفق باشید.
این روش خیلی cpu میخواد:گیج:هم برای برنامه نویس هم برای اینتل و آی ام دی.
من چند وقت پیش که دقیقا؛ همین میشکل رو داشتم برای ذخیره فونت از این schema استفاده کردم:
index bigint IDENTITY(1, 1)
name nchar 50
size int
style tinyint

و هر جایی که فونت داشتم و میخواستم ویرایش کنم:
۱.جستوجو برای فونت مشابه
۲.در صورت وجود:استفاده از ایندکس فونت پیدا شده
۳.در صورت عدم وجود:ایجاد سطر در بانک اطلاعاتی
۴.اگر هیچ کنترلی از آن فونت قبلی استفاده نمیکند:حذف فونت از دیتابیس.
سرعت این روش واقعاً محشره.

الان برنامه من با ۷ تا کاربر فقط ۱kb فونت داره.ولی توی روش شما که البته سریعتر از روش من implement میشه و نیاز به overclock کردن مغز نداره.هر فونت تقریباً ۱kb فضا میخواد.

mehdi.mousavi
یک شنبه 26 اردیبهشت 1389, 18:57 عصر
این روش خیلی cpu میخواد:گیج:هم برای برنامه نویس هم برای اینتل و آی ام دی. من چند وقت پیش که دقیقا؛ همین میشکل رو داشتم برای ذخیره فونت از این schema استفاده کردم: الان برنامه من با ۷ تا کاربر فقط ۱kb فونت داره.ولی توی روش شما که البته سریعتر از روش من implement میشه و نیاز به overclock کردن مغز نداره.هر فونت تقریباً ۱kb فضا میخواد.

سلام.
نمیدونم با SharePoint و نحوه پیاده سازی اون آشنا هستید یا خیر، اما اگر اونجا رو هم نگاه کنید مایکروسافت دقیقا اطلاعات هر فیلد رو بصورت XML در بانک ذخیره و نگهداری میکنه. البته غیر این هم انتظار نمیره. منم بودم همین کارو می کردم.

برخی اوقات، طراح نرم افزار به Trade Off هایی میرسه و باید چیزی رو قربانی چیز دیگه ای کنه تا چیز دیگه ای بدست بیاره. دقت کنید، که ممکنه هر فونت 1KB فضا ببره، اما قرار نیست من این XML ها رو در بانک پشت سر هم تکرار کنم.

برای فونتی به سایز 12 با نام Verdana یه XML نگه میدارم و بهش ID ی یک رو اختصاص میدم. از اینجا به بعد هر جا خواستم اون Font رو Reference کنم، تنها کافیه به عدد 1 اشاره کنم (که البته SharePoint از UniqueIdentifier یا همون GUID استفاده کرده). از طرف دیگه، با امکانات فعلی موجود، میتونم XML Constraint هایی تعریف کنم که Integrity بانک رو حفظ کنه و بهم نریزه و XML ها نیز بر اساس Schema های تعریف شده قابل ذخیره یا Update شدن باشن و نشه هر xml ای رو اونجا ذخیره کرد.

تو روش شما، اگر من بخوام Unit فونت رو نگه دارم چیکار باید کنم؟


باید بانک رو Update کنم تا یه ستون Unit به بانک اضافه بشه.
جدول جدیدی بسازم که Unit های موجود از قبیل Point، Pixel و ... در اون تعریف بشه تا بتونم ID اش رو به جدول قبلی ببرم.
باید Business Logic Object هامو Update کنم تا فیلد جدید و همینطور جدول جدید به Business Logic ام اضافه بشه.
باید تو کد DAL دست ببرم تا عمل بازیابی و ذخیره این فیلد جدید به درستی انجام بشه.
Stored Procedure های Insert/Update و Select رو باید تغییر بدم تا فیلد و جدول جدید در نظر گرفته بشه.
Validation Code و UI ام رو تغییر بدم تا کاربر بتونه Unit یه فونت رو تعریف کنه.

در صورتیکه در روشی که من عنوان کردم، کافیه تا فقط Schema ی XML مزبور رو Update کنم و شماره 6 رو انجام بدم.

من اینطور تشخیص دادم که اگر اینجا چند اسب بخار از توان مغز خودم و پردازنده رو بیشتر درگیر کنم، Maintenance کد برام بسیار ساده تر خواهد بود. پس من توی این انتخاب XML رو انتخاب میکنم.

اما این مساله همواره صادق نیستش و کاملا بستگی به سناریویی داره که در دست داریم. البته بعید میدونم در این سناریوی خاص، من حاضر باشم کاری غیر از چیزی که توضیح دادم انجام بدم.

موفق باشید.