Đến nội dung


Hình ảnh
- - - - -

Cách đặt đối số hàm/sub theo list ??


  • Please log in to reply
9 replies to this topic

#1 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 19 March 2011 - 10:28 AM

Em chưa động đến cách đặt đối số của hàm mà số lượng đối số thay đổi, nay nhờ các bác giúp 1 ví dụ khai báo cụ thể.
Ví dụ e muốn tạo 1 sub chèn 1 block vào list các tọa độ điểm, kiểu như

Sub IS ([listpoint],Block)

.....
P/S 2 : Srr vì chưa diễn đạt đúng ý.điều em không muốn làm là gom list trước khi chạy sub.Tức là thay vì khởi tạo 1 list các point trước khi gọi hàm, rồi khai báo list đó để dùng vòng lặp xử lý, mà em muốn khai báo kiểu như

Sub IS (x1,y1,z1,x2,y2,z2...,Block)

vẫn hàm đấy
E khai báo IS (x1,y1,z1,block) thì nó chèn vào điểm 1
E khai báo IS (x1,y1,z1,x2,y2,z2,block) thì nó chèn vào 2 điểm 1,2
Tức số lượng đối số thay đổi, mà VBA nó cứ tự gom 3 đối số liền nhau thành 1 nhóm, cái cuối cùng là Block ^^
Nếu không được e xin quay về phương án tạo list trước, không tự làm khó mình nữa ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#2 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 19 March 2011 - 10:47 AM

nói cho dễ hiểu hơn nữa đuợc không hả ketxu? mình đọc 1 hồi mấy lần thì luận nó ra như thế này:
(defun IS (listpoint blockname)
(foreach L listpoint
(command "insert" "blockname" L ....)))

nhưng mình không chắc đã đúng ý bạn vì làm như trên thì với bạn là chuyện nhỏ.
Edit: ah, minh nhầm, bạn post bài ở box VBA, cứ tưởng box autolisp :rolleyes:
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 19 March 2011 - 10:58 AM

Em srr vì chưa diễn đạt hết ý, đã edit thêm ở PS2 ^^ Tức là e muốn tìm hiểu cách khai báo mà số đối số thay đổi, chứ không phải số lượng point trong list thay đổi ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 22 March 2011 - 08:45 AM

VB không hỗ trợ hàm có số lượng tham số thay đổi.

VB.NEt bạn có thể dùng kiểu khai báo hàm ghi đè:
Sub AAA()
Sub AAA(a as integer)
Sub AAA(a as integer, b as integer)
...

hoặc dùng từ khóa
Sub AAAByVal ParamArray a() As Integer)

C# hỗ trợ nhiều tham số như khai báo sau:
Sub AAA(params int a)

Lúc đó ta có thể dùng như sau
AAA(2,5,3,1)
AAA(6,2,6,1,34)
....
  • 1
Clear sky!

MF Rock collection.

#5 khatamxd

khatamxd

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 23 March 2011 - 12:24 AM

mình hay khai báo kiểu này ko bít có đúng ý bạn chưa!
Sub xu_ly(array_diem() As diem, ByVal dem)
for i=1 to dem

end sub
Trong đó
array_diem: là mảng chứa biến các điểm
dem: là số lượng điểm trong mảng array_diem
  • 1

#6 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 23 March 2011 - 08:34 AM

Hì..Đó là cách tạo list điểm trước rồi ^^ Như vậy thì dem của bạn = Ubound(array_diem) rồi đúng hok ^^
Phần khai báo như C# ví dụ bác anhcos kia chính là vấn đề mình thắc mắc có hay không trong VB ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 March 2011 - 10:22 AM

VB không hỗ trợ hàm có số lượng tham số thay đổi.

VB.NEt bạn có thể dùng kiểu khai báo hàm ghi đè:
Sub AAA()
Sub AAA(a as integer)
Sub AAA(a as integer, b as integer)
...

hoặc dùng từ khóa
Sub AAAByVal ParamArray a() As Integer)

C# hỗ trợ nhiều tham số như khai báo sau:
Sub AAA(params int a)


Lúc đó ta có thể dùng như sau
AAA(2,5,3,1)
AAA(6,2,6,1,34)
....

Tuơng tựC#, VB cũng hỗ trợ nhiều tham số, khai báo như sau:
Function calcSum(ByVal ParamArray args() As Double) As Double
vd :
Public Function calcSum(ByVal ParamArray args() As Double) As Double
calcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
calcSum += args(i)
Next i
End Function

gọi :
calcSum(4, 3, 2, 1)
calcSum(3, 2, 1)
calcSum(3, 2, 1)


tham khảo :
- Parameter Arrays (Visual Basic)
- Params (C# Reference)

Nhưng nói chung, VB hay C# cũng vẫn xử lý như 1 Array (hay List trong AutoLisp)
  • 1

#8 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 23 March 2011 - 10:59 AM

Cho e hỏi đây là cách khai báo trong VB.Net và không áp dụng được cho VBA đúng không ạ ?
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 March 2011 - 11:30 AM

Cho e hỏi đây là cách khai báo trong VB.Net và không áp dụng được cho VBA đúng không ạ ?

Trích từ VBA help:

Understanding Parameter Arrays
A parameter array can be used to pass an array of arguments to a procedure. You don't have to know the number of elements in the array when you define the procedure.

You use the ParamArray keyword to denote a parameter array. The array must be declared as an array of type Variant, and it must be the last argument in the procedure definition.

The following example shows how you might define a procedure with a parameter array.


Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As Integer

Debug.Print strName; " Scores"
' Use UBound function to determine upper limit of array.
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub


The following examples show how you can call this procedure.

AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16
AnyNumberArgs "Kelly", "High", "Low", "Average", "High"
  • 0

#10 phantuhuong

phantuhuong

    biết dimstyle

  • Moderator
  • PipPipPipPipPip
  • 383 Bài viết
Điểm đánh giá: 200 (khá)

Đã gửi 30 March 2011 - 09:29 PM

Tốt nhất là em tạo 1 Function, có đối số là điểm và block. Sau đó tạo 1 thủ tục gọi hàm đó ra, đối số của hàm gán trực tiếp trong thủ tục đó!
  • 0
Bồi dưỡng Excel & VBA cho các đơn vị ở Hà Nội và khu vực lân cận

Từng bước loại đồ Tàu ra khỏi cuộc sống!