Monthly Archives: June 2013

C# Customize Input Box

Trong chương trình có những lúc chúng ta phải hỏi lại và nhận những Input của người sử dụng.

Ví dụ: Khi người sử dụng cần hủy một chứng từ, không thể chỉ cho hủy bằng một nút vì nếu đó chỉ là bấm nhầm thì rất mất thời gian để xử lý

– Hay khi cần làm một tác vụ quan trọng như Format hay Restore ổ cứng, đây là những quy trình khá mất thời gian lại rất nhạy cảm do sự thay đổi rất lớn nên cần có sự xác nhận của người sử dụng trong việc sử dụng

* Đây là code của form thông báo cho người dùng:

public static DialogResult LKInputBox(string title, string promptText, ref string value)
{
Form form = new Form();
Label label = new Label();
TextBox textBox = new TextBox();
Button buttonOk = new Button();
Button buttonCancel = new Button();

form.Text = title;
label.Text = promptText;
textBox.Text = value;

buttonOk.Text = “Nhập”;
buttonCancel.Text = “Hủy”;
buttonOk.DialogResult = DialogResult.OK;
buttonCancel.DialogResult = DialogResult.Cancel;

label.SetBounds(9, 20, 372, 13);
textBox.SetBounds(12, 36, 372, 20);
buttonOk.SetBounds(228, 72, 75, 23);
buttonCancel.SetBounds(309, 72, 75, 23);

label.AutoSize = true;
textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

form.ClientSize = new Size(396, 107);
form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MinimizeBox = false;
form.MaximizeBox = false;
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;

DialogResult dialogResult = form.ShowDialog();
value = textBox.Text;
return dialogResult;
}

* Mô tả: Input Box sẽ bao gồm tiêu đề (Title), một dòng thông báo và ô để nhập dữ liệu. Nếu sau khi người dùng nhập dữ liệu xong và nhấn vào nút “Nhập” thì chương sẽ trả về value trong contructor

* Sau đó ta có thể sử dụng như sau:

private void btnInput_Click(object sender, EventArgs e)
{
string value = “LapKan Supporting”;
if (LKSupport.LKInputBox(“Thông báo”, “Nhập thông báo:”, ref value) == DialogResult.OK)
{
txtThongBao.Text = value;
}
}

=> value sẽ được trả về sau khi form được nhập. bạn có thể có được kết quả là một DialogResult như một MessageBox bình thường của C#.

* Kết luận: Sử dụng MessageBox rất nhanh nhưng nhiều khi chúng ta cần phải customize lại các control để hợp với hoàn cảnh và cách sử dụng của bản thân

Đây là một control đơn giản phù hợp với tôi nhưng các bạn có thể customize lại để nó phù hợp với bản thân.

Image

* Mediafire: http://www.mediafire.com/download/w7fh6a4yyf7kt5w/LKMessageBoxX.rar

* Fshare: http://www.fshare.vn/file/TLSEF6DM0W

* Google Drive: https://docs.google.com/file/d/0B38uO5_VDZL4ZEV6R1JRQm5xV0k/edit?usp=sharing

* Infomation:

New view in the new world

Product: LapKan Company Product (LK)

Coder: Huygamer

Blog: huygamer.wordpress.com

Advertisements

Sự khác biệt giữa Modal và Push Segues trong Storyboard

I. Thông tin chung:

– Sự ra đời của Xcode 4.2 với Storyboard và ARC đã mang lại sự tiện dụng và khả năng lập trình nhanh hơn cho các lập trình viên IOS. Đối với Storyboard, rất nhiều người vẫn chưa hiểu được cách sử dụng nó.

 

II. Nội dung chính:

1. Sự giống nhau:

– Modal và Push Segues đều dùng để kết nối giữa những viewcontroller trong Storyboard với nhau.

– Bạn sử dụng Ctrl và click từ một control để kéo vào viewcontroller khác hoặc giữa 2 viewcontroller với nhau.

– Được sử dụng trong Storyboard.

 

2. Khác nhau:

– Điểm khác nhau của chúng là:

+ Khác biệt trong cách xữ lý bộ nhớ, với Modal ViewController trước đó sẽ được giải phóng hoàn toàn trong khi với Push, ViewController trước đó vẫn còn được giử trong bộ nhớ và sẽ được load lại đầy đủ.

Ví dụ: Chúng ta có 2 viewController: Một ViewController nhập thông tin cá nhân  và một ViewController nhập lịch sử làm việc.

+ Bạn dùng Push giữa chúng thì bạn có thể di chuyển giữa 2 viewcontroller để sửa chữa mà không có vấn đề gì. Bạn nhập sai ngày sinh, bạn có thể quay lại để sửa chữa sau khi bạn đã tới form lịch sử làm việc.

+ Bạn dùng Modal bạn không thế quay lại (ý nói không cần code thêm gì chứ code thêm thì cái gì chả làm được) muốn quay lại sửa ngày sinh bạn phải lưu lại nó ở đâu đó sau đó mới lấy ra để ghi lại.

=> Vậy Modal là đi một chiều trong khi Push thì đi tới và đi lui được

+ Đối với Modal Segues: View được gọi tới sẽ sữ dụng ViewDidLoad và load lại từ đầu mọi thứ.

+ Đối với Push Segues: View sẽ sử dụng ViewDidAppear.

* Cách sử dụng:

+ Đối với Modal: Bạn có thể sử dụng ở bất cứ đâu

+ Đối với Push: Bạn chỉ có thể sử dụng với Navigator Bar

 

III. Kết luận:

– Storyboard là một công cụ cực mạnh cho các lập trình viên IOS. Nó không chỉ cho phép lập trình viên có cái nhìn tổng quát về chương trình mà còn giúp chúng ta giảm bớt lượng code phải viết. Mà giảm lượng code phải viết nghĩa là ít lỗi hơn và chương trình ra nhanh hơn. Ra nhanh hơn thì kiếm được nhiều tiền hơn.

– Tiếc rằng những lão sư trong lập trình thì khó chịu thay đổi nên thường chỉ dùng những thứ từ cách đây 4-5 năm mà không sử dụng những công nghệ mới

Sử dụng Temporary Macro trong Visual Studio

* Tình huống:

Khi sử dụng Visual Studio, những khi gõ lệnh giống nhau và các lệnh y như nhau thì việc lặp đi lặp lại vô cùng nhàm chán lại mất thời gian vô cùng. Microsoft có những cách thức giúp bạn làm những việc này một cách tự động bao gồm:

+ Code Snipper

+ Temporary Macro (Dùng để làm chạy cho nhanh, quản lý macro thì tốt hơn nhiều)

* Sử dụng Temporary Macro trong Visual Studio:

* Menu Tools => Macros => Record Temporary Macro

=> Để lưu lại Macro trong chương trình

* Menu Tools => Macros => Play Temporary Macro

=> Để chạy Macro (tuy nhiên để làm việc nhanh thì không ai dùng cách này mà dùng phím tắt để chạy Macro nhanh)

* Phím tắt:

+ Ctrl + Shift  + P: Sử dụng Macro trong chương trình

+ Ctrl + Shift + R: Lưu lại Macro trong chương trình

Game Ninja Fruit để mọi người tham khảo

Game Ninja Fruit là game cực kì quen thuộc cho bất cứ người sử dụng IOS/Android nào. Game được dựa trên Cocos2 (Box2D).

Image

Màn chơi

ImageHiệu ứng nổ

Đây là source game để các bạn tham khảo

* Mediafire: http://www.mediafire.com/download/dzkrp05indme7ab/NinjaFruit.zip

New view in the new world

Product: LapKan Company Product (LK)

Coder: Huygamer

Blog: huygamer.wordpress.com

 

Game Push Box – Cocos2d

Game Push Box trên nền IOS với framework Cocos2d.

Game dựa vào lối chơi đầy hộp nhưng sử dụng các hình ảnh quen thuộc đến từ Boom Online tạo cảm giác thân thuộc và vui vẻ.

ImageMàn 1 của game

ImageMản 3 của game

* Github: https://github.com/lovesunstar/SBoxMan.git

* Mediafire: http://www.mediafire.com/download/po3lspd21pbfgot/SBoxMan.zip

* Lưu ý: Đây chưa phải là một game hoàn chỉnh. Bạn cần phải hoàn chỉnh nó theo cách của bạn. (Đối với tôi là như thế, Apple cũng vậy. Bạn mà up nguyên cái game này lên thì nó sẽ không bao giờ được duyết đâu vì nó thiếu quá nhiều thứ để tạo thành một game thật sự)

New view in the new world

Product: LapKan Company Product (LK)

Coder: Huygamer

Blog: huygamer.wordpress.com

Custom Datagridview Column

Bản thân của Winform đã lạc hậu và khó lòng tương thích với những thứ mới mẻ của các bản Window về sau (Window 7, Window 8 với giao diện được thiết kế mới hoàn toàn).

Nguyên nhân:

+ Winform vẫn còn sử dụng code để vẽ nên thiết kế trong khi phương pháp hiện đại là sử dụng XML để thiết kế giao diện (Không chỉ làm code trở nên dễ dàng, mạnh mẽ hơn mà còn có thể tách biệt giữa người thiết kế và lập trình viên)

– Tuy nhiên những lúc chúng ta đang sử dụng DataGridView của Winform thì chúng ta vẫn phải làm

Datagridview Datetime Column:

* Datagridview không có kiểu dữ liệu date cho column nên chúng ta cần phải thêm CalendarColumn.

public class CalendarColumn : DataGridViewColumn
{
public CalendarColumn()
: base(new CalendarCell())
{
//CalendarColumn c = new CalendarColumn();
//c.SetFormat(“MM/yyyy”);
}

public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a CalendarCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
{
throw new InvalidCastException(“Must be a CalendarCell”);
}
base.CellTemplate = value;
}
}
}

public class CalendarCell : DataGridViewTextBoxCell
{

public CalendarCell()
: base()
{
// Use the short date format.
this.Style.Format = “d”;
}

public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
CalendarEditingControl ctl =
DataGridView.EditingControl as CalendarEditingControl;
try
{
ctl.Value = (DateTime)this.Value;
}
catch
{
ctl.Value = DateTime.Now;
}
}

public override Type EditType
{
get
{
// Return the type of the editing contol that CalendarCell uses.
return typeof(CalendarEditingControl);
}
}

public override Type ValueType
{
get
{
// Return the type of the value that CalendarCell contains.
return typeof(DateTime);
}
}

public override object DefaultNewRowValue
{
get
{
// Use the current date and time as the default value.
return DateTime.Now;
}
}
}

class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;

public CalendarEditingControl()
{
this.Format = DateTimePickerFormat.Short;
}

// Implements the IDataGridViewEditingControl.EditingControlFormattedValue
// property.
public object EditingControlFormattedValue
{
get
{
return this.Value.ToShortDateString();
}
set
{
if (value is String)
{
this.Value = DateTime.Parse((String)value);
}
}
}

// Implements the
// IDataGridViewEditingControl.GetEditingControlFormattedValue method.
public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}

// Implements the
// IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
public void ApplyCellStyleToEditingControl(
DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
}

// Implements the IDataGridViewEditingControl.EditingControlRowIndex
// property.
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}

// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
// method.
public bool EditingControlWantsInputKey(
Keys key, bool dataGridViewWantsInputKey)
{
// Let the DateTimePicker handle the keys listed.
switch (key & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return false;
}
}

// Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
// method.
public void PrepareEditingControlForEdit(bool selectAll)
{
// No preparation needs to be done.
}

// Implements the IDataGridViewEditingControl
// .RepositionEditingControlOnValueChange property.
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}

// Implements the IDataGridViewEditingControl
// .EditingControlDataGridView property.
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}

// Implements the IDataGridViewEditingControl
// .EditingControlValueChanged property.
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}

// Implements the IDataGridViewEditingControl
// .EditingPanelCursor property.
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}

//public this void Format(String FormatType)
//{
//    return this.format
//}

protected override void OnValueChanged(EventArgs eventargs)
{
// Notify the DataGridView that the contents of the cell
// have changed.
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnValueChanged(eventargs);
}
}

MessageBox trong lập trình C#

I. Thông tin chung:

– Trong Window Form có hỗ trợ để hiển thị ra những thông báo giúp cho người sử dụng lưu ý hoặc đưa ra những lựa chọn cho người sử dụng.

– Có nhiều cách để sử dụng MessageBox.

II. Nội dung chính:

1. Những trường hợp sử dụng Message Box:

– Trong từng trường hợp, các MessageBox sẽ có cách sử dụng khác nhau:

+ Thông báo cho người sử dụng biết không thể sử dụng chức năng hay lưu ý một vấn đề trong chương trình

+ Cần sự xác nhận của người sử dụng đối với một lệnh quan trọng như:

– Xóa một dữ kiện quan trọng

– Thoát nhưng chưa lưu trữ

– Tắt một lúc nhiều ứng dụng

– Và các trường hợp cần được xác nhận

+ Thông báo những thứ quan trong trong chương trình.

 

2. Cách sử dụng của từng loại Message Box:

– Dạng thông báo đơn giản:

MessageBox.Show(“LapKan Product – Coder: Huygamer”);

– Dạng thông báo có tiêu đề:

MessageBox.Show(“LapKan Product – Coder: Huygamer”, “LapKan Corp – Huygamer”);

– Dạng thông báo có lựa chọn Yes hoặc No:

DialogResult lkResult = MessageBox.Show(“Bạn có biết đến huygamer.wordpress.com?”, “LapKan Corp – Huygamer”, MessageBoxButtons.YesNo);

           if (lkResult == DialogResult.Yes)

           {

               txtThongBao.Text = “Bạn đã biết tới website của tôi”;

               return;

           }

if (lkResult == DialogResult.No)

           {

               txtThongBao.Text = “Bạn chưa biết tới website đó. Vậy bạn nên vào đi!! ^.^ \r\nWebsite:huygamer.wordpress.com”;

               return;

           }

 

3. Những giá trị của DialogResult:

Sau đây là những giá trị mà DialogResult có thể nhận được:

DialogResult.None

DialogResult.OK

DialogResult.Cancel

DialogResult.Abort

DialogResult.Retry

DialogResult.Ignore

DialogResult.Yes

DialogResult.No

Tùy theo giá trị trả về mà bạn có thể quyết định được nên làm gì với kết quả đó.

Bạn có thể dùng Switch nếu kết quả trả về có nhiều:

switch (result)

   {

case DialogResult.OK:

   {

this.Text = “[OK]”;

break;

   }

case DialogResult.Cancel:

   {

this.Text = “[Cancel]”;

break;

   }

   }

III. Kết luận:

MessageBox là thành phần có sẵn trong lập trình .NET và cách sử dụng khá đơn giản. Nếu sử dụng được chương trình của bạn sẽ có quá trình chạy khá tốt (process).

Chương trình demo:

Mediafire: http://www.mediafire.com/download/7wx8v8b4vfquv2f/LKMessageBoxTutorial.rar

Fshare: