banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Hỏi về viết code cho nút undo (remove) trong VB.net  XML
  [Programming]   Hỏi về viết code cho nút undo (remove) trong VB.net 14/03/2009 11:06:39 (+0700) | #1 | 173168
[Avatar]
adri
Member

[Minus]    0    [Plus]
Joined: 21/05/2005 09:24:41
Messages: 17
Offline
[Profile] [PM]
Xin chào, mình đang viết code cho phần Graphics, viết về chương trình vẽ, trong đó có phần người sử dụng sẽ undo (remove) the bursts trở về bước trước đó, nếu ai biết cách hay biết ebook nào chỉ về phần này, chỉ mình nhé, cám ơn nhiều............. smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 14/03/2009 14:14:36 (+0700) | #2 | 173184
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Câu hỏi ngắn gọn nhưng giải quyết tốt cũng cần nỗ lực smilie

Vài gợi ý cho bạn thế này:
- Cần hiểu về cấu trúc dữ liệu của từng đối tượng graphic: phần này chắc chắn bạn phải nắm rồi. Như vậy khi thể hiện các đối tượng đã vẽ lên màn hình, giả định bạn đã có sẵn 1 danh sách (hay cấu trúc dữ liệu riêng) chứa danh sách này.
- Thao tác undo (và redo) là phục hồi lại dữ liệu đã lưu trước đó. Để phục hồi được thì ở mỗi thao tác trước đó phải lưu trữ hành động (vẽ vời) và đối tượng.

Ví dụ thao tác 1 undo đơn giản:
Trước đó có 1 hình vuông. Lúc này chương trình lưu danh sách có 1 đối tượng hình vuông.
- User thực hiện thao tác vẽ thêm hình tròn.
- Chương trình sẽ bổ sung vào danh sách hình tròn, đồng thời lưu trữ hành động vẽ và thuộc tính của đối tượng vừa thực hiện (hình tròn) vào một cáu trúc (list) khác dành để undo
- User thực hiện hành động undo (vd Ctrl-Z)
- Chương trình dò lại danh sách action, lấy action cuối cùng là vẽ hình tròn với ID bao nhiêu và vào danh sách dữ liệu chính mà xóa hình tròn đó đi.
- ....

Có thể liên kết những thao tác vẽ và hành động undo tương ứng: ví dụ Vẽ mới thì undo là Xóa, co giãn thì undo là phục hồi lại kích thước trước đó, di chuyển thì quay lại tọa độ cũ, ...

Thao tác redo thì làm tương tự. Nếu muốn undo nhiều lần thì tổ chức danh sách hành động undo thành 1 list. Tuy nhiên cần quan tâm đến vấn đề bộ nhớ chiếm giữ và tốc độ thể hiện.

Từ ý tưởng trên mở rộng ra các hành động phức tạp hơn mà thiết kế cho phù hợp smilie

Ai có ý tưởng hay xin mời cùng tham gia.
Hibernating
[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 15/03/2009 00:57:00 (+0700) | #3 | 173213
[Avatar]
adri
Member

[Minus]    0    [Plus]
Joined: 21/05/2005 09:24:41
Messages: 17
Offline
[Profile] [PM]
nghe có vẻ hơi mơ hồ 1 chút, nhưng bạn nói đúng, nếu có ebook để đọc thì sẽ tốt hơn
[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 15/03/2009 01:21:25 (+0700) | #4 | 173216
cafe.kfc
Member

[Minus]    0    [Plus]
Joined: 10/06/2008 19:29:28
Messages: 52
Offline
[Profile] [PM]
Tôi thấy Z0rr0 phân tích cũng rõ chứ bạn? Bạn hình dung chương trình sẽ lưu giữ các hành động của người dùng vào 1 ngăn xếp (vào trước thì lấy ra trước). Vd:

A->B->C

Khi undo ở C, bạn lấy ra B, hủy bỏ thao tác đã làm ở C.

Là chương trình graphics (như bạn nói), thì nếu dùng ngăn xếp lưu các hành động của người dùng bằng các thuật toán sẽ tiết kiệm bộ nhớ hơn. Còn đơn giản hơn, và tốn bộ nhớ thì bạn dùng như sau:

- Người dùng vẽ hình A.
+ Vẽ một đối tượng lên A (đường thẳng, hình tròn...), lúc này A thành B.
+ Tiếp tục, B thành C.
=> Bạn lưu vào ngăn xếp A->B->C.

- Undo: xóa C, vẽ lại B (lấy từ ngăn xếp).

Cách 2 có vẻ "sang" quá, không khéo cấu hình đòi hỏi cho chương trình của bạn lên cao như các phần mềm biên tập đa phương tiện khổng lồ như Maya, 3D MAX thì...

smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 25/03/2009 10:27:27 (+0700) | #5 | 174595
[Avatar]
adri
Member

[Minus]    0    [Plus]
Joined: 21/05/2005 09:24:41
Messages: 17
Offline
[Profile] [PM]
Mình mới có tài liệu về cách viết Undo nên post lên để mọi người tham khảo nhé

We will introduce undo using a simple application that keeps a running total of the numbers enterered.
Instruction Running total List
Start 0 -

Add 5
Add 7
Add 6
Undo
Undo
Add 4
Add 3
Undo
Add 7
Undo
Undo

To implement udo we need:
• Running total
• List of numbers added


Dim runningTotal As Integer = 0
Dim listSize As Integer = 0
Const MaxList As Integer = 100
Dim numbers(100) As Integer

Private Sub TabRunningTotal_Enter(...
lblRunningTotal.Text = "Running total = " & _
runningTotal
End Sub

Private Sub cmdAdd_Click(...
AddNumber(CInt(txtNumber.Text))
WriteNumbers()
lblRunningTotal.Text = "Running total = " & _
runningTotal
End Sub

Sub AddNumber(ByVal number As Integer)
runningTotal += number
numbers(listSize) = number
listSize += 1
End Sub

Sub WriteNumbers()
' display current number list
Dim nx As Integer
lblNumbers.Text = "Numbers"
For nx = 0 To listSize - 1
lblNumbers.Text &= vbNewLine & numbers(nx)
Next nx
End Sub

`Private Sub cmdUndo_Click(...
RemoveNumber()
WriteNumbers()
lblRunningTotal.Text = "Running total = " & _
runningTotal
End Sub

Sub RemoveNumber()
If (listSize > 0) Then
listSize -= 1
runningTotal -= numbers(listSize)
End If
End Sub


The code above is straightforward. Notes:
• Only the last two subs are required for undo.
• “RemoveNumber” protects against undoing with and empty list.
Could (should) also disable the undo button.
• Displaying the list of numbers is used for both “Add” and “Undo”
• The application uses tab controls. The equivalent of “Form_Load” is “Tab…_Enter”.
• The event methods (“cmdAdd_Click”, “cmdUndo_Click”) only do UI. The list handling is done by
separate subs. This is good style.

[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 25/03/2009 11:56:12 (+0700) | #6 | 174618
mfeng
Researcher

Joined: 29/10/2004 15:16:29
Messages: 243
Offline
[Profile] [PM]
Nên tham khảo các patterns trong OOP khi viết chức năng Undo, mã nguồn chương trình sẽ dễ quản lý và "đẹp" hơn, dễ bổ sung, nâng cấp hơn smilie

Ví dụ: trừu tượng hóa các hành động vẽ một vật thể thành một giao diện, mỗi hành động cụ thể cần được triển khai rõ sau. Mỗi khi thực hiện vẽ vật thể nào đó, tạo một đối tượng hành động tương ứng cho vào stack. Khi cần undo thì truy xuất stack này và thực hiện "ngược" lại hành động đó. Để thực hiện "ngược" được dễ dàng bạn cần tổ chức dữ liệu (bản vẽ, dữ liệu của các hành động..) cho tốt.
[Up] [Print Copy]
  [Question]   Re: Hỏi về viết code cho nút undo (remove) trong VB.net 26/03/2009 09:39:11 (+0700) | #7 | 174752
[Avatar]
adri
Member

[Minus]    0    [Plus]
Joined: 21/05/2005 09:24:41
Messages: 17
Offline
[Profile] [PM]
những gì bạn nói thì thật sự mình không hiểu rõ lắm vì mình chỉ bắt đầu học VB.net được 2 tháng nay, chưa biết nhiều nên nghe nói như thế thì khó hình dung, giờ mình chỉ hiểu khi nói rõ ràng và có lẽ nhìn code thì tốt nhất, xin lỗi nhé chỉ là vì mình là người mới học thôi........
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|