Đến nội dung


Hình ảnh
- - - - -

Xử lý List_box


  • Please log in to reply
9 replies to this topic

#1 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 02 July 2010 - 01:47 PM

Mình dùng list_box để thể hiện toạ độ điểm.
Khi dùng list_box có 1 vấn đề mình chưa hiểu, Khi mình nhập vào vị trí nó sẽ ra toạ độ. Nhưng các điểm trước sẽ bị đẩy xuống dưới, Mình muốn các điểm trước thì ở trên các điểm tiếp theo sẽ nối tiếp xuống dưới.
Sau đây là code của mình
(defun c:aaa (/ xn yn x y dcl_id hanh)
(setvar "cmdecho" 0)
(dialog)
(princ)
); End defun
;;;;;;---------------------------Xu ly du lieu dau vao-------------------------------

(defun dialog ()
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "mcdh.DCL"))
(if (not (new_dialog "mcdh" dcl_id))
(exit))
(test2)
(action_tile "dc" "(done_dialog 2)")
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(setq hanh (start_dialog))
(if (= hanh 2)
(progn
(setq dc (getpoint))
(test1)
)
)
)
(setq dcl_id (unload_dialog dcl_id))
)
(defun test1 ()
(setq x (car dc) y (cadr dc))
(setq x (rtos x 2 2))
(setq y (rtos y 2 2))
(setq xn (cons x xn))
(setq yn (cons y yn))
(setq ii 1)
(setq ik (length xn))

)
(defun test2 ()
(start_list "dauvao")
(mapcar 'add_list xn)
(end_list)
)

Và sau đây là dcl
mcdh : dialog { label = "Ch­¬ng tr×nh trî gióp vÏ mÆt c¾t";
:column {
:boxed_column { label = "D÷ liÖu ®Çu vµo";
fixed_height = true;
:row { fixed_width = true;
:text { width = 10;
label = "X";
}
:text { width = 10;
label = "Y";
}
}
:list_box { height = 21;
width = 25;
tabs = "10 20";
key = "dauvao";
fixed_height = true;
}
}
:row {
:text { label = "Chän ®iÓm c¾t"; }
:button {
key = "dc";
label = "Chän ®iÓm";
fixed_width = true;
}
}
:spacer {height=0.2;}
ok_cancel;
}
}

  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#2 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 02 July 2010 - 04:07 PM

Mình dùng list_box để thể hiện toạ độ điểm.
Khi dùng list_box có 1 vấn đề mình chưa hiểu, Khi mình nhập vào vị trí nó sẽ ra toạ độ. Nhưng các điểm trước sẽ bị đẩy xuống dưới, Mình muốn các điểm trước thì ở trên các điểm tiếp theo sẽ nối tiếp xuống dưới.
Sau đây là code của mình

(defun c:aaa (/ xn yn x y dcl_id hanh)
(setvar "cmdecho" 0)
(dialog)
(princ)
); End defun
;;;;;;---------------------------Xu ly du lieu dau vao-------------------------------

(defun dialog ()
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "mcdh.DCL"))
(if (not (new_dialog "mcdh" dcl_id))
(exit))
(test2)
(action_tile "dc" "(done_dialog 2)")
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(setq hanh (start_dialog))
(if (= hanh 2)
(progn
(setq dc (getpoint))
(test1)
)
)
)
(setq dcl_id (unload_dialog dcl_id))
)
(defun test1 ()
(setq x (car dc) y (cadr dc))
(setq x (rtos x 2 2))
(setq y (rtos y 2 2))
(setq xn (cons x xn))
(setq yn (cons y yn))
(setq ii 1)
(setq ik (length xn))

)
(defun test2 ()
(start_list "dauvao")
(mapcar 'add_list xn)
(end_list)
)

Và sau đây là dcl
mcdh : dialog { label = "Ch­¬ng tr×nh trî gióp vÏ mÆt c¾t";
:column {
:boxed_column { label = "D÷ liÖu ®Çu vµo";
fixed_height = true;
:row { fixed_width = true;
:text { width = 10;
label = "X";
}
:text { width = 10;
label = "Y";
}
}
:list_box { height = 21;
width = 25;
tabs = "10 20";
key = "dauvao";
fixed_height = true;
}
}
:row {
:text { label = "Chän ®iÓm c¾t"; }
:button {
key = "dc";
label = "Chän ®iÓm";
fixed_width = true;
}
}
:spacer {height=0.2;}
ok_cancel;
}
}

Thay dòng
(setq xn (cons x xn))
bằng dòng
(setq xn (append xn (list x)))

T/hợp muốn dùng CONS thì phải kết hợp với (reverse lst) khi gọi hàm (mapcar 'add_list xn).
  • 1

#3 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 05 July 2010 - 08:00 PM

Thay dòng
(setq xn (cons x xn))
bằng dòng
(setq xn (append xn (list x)))

T/hợp muốn dùng CONS thì phải kết hợp với (reverse lst) khi gọi hàm (mapcar 'add_list xn).

Chào anh giabach,
Trước tiên cảm ơn anh giabach đã chỉ cho em chỗ chưa hiểu.
Nhưng giờ em lại vướng vào 1 cái hóc búa hơn.
Em viết thành công 2 lsp sử dụng dialog, nhưng khi sử dụng xảy ra hiện tượng như sau:
- Lần lượt load từng lisp và chạy. Load lsp đầu tiên không có chuyện gì xảy ra chạy bình thường.
Load lsp thứ 2 chạy bình thường, nhưng khi gõ lệnh của lsp 1 thì nó hiện lên dialog lsp thứ 2 mặc dù file DCL khác hẳn nhau không bị chồng chéo, vậy em không hiểu sao lại như vậy.
Em xin trích đoạn lsp của 2 lsp đó mong anh chỉ giúp.
Đây là lsp 1:
(defun dialog ()
(Value)
(Trade_value)
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "Kcd.DCL"))
(if (not (new_dialog "Kcd" dcl_id))
(exit))
(Get_value)
(mode_tile "accept" 1)
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(action_tile "tyleD" "(setq tyleD1 $value)")
(action_tile "tyleN" "(setq tyleN1 $value)")
(action_tile "Mss" "(setq Mss1 $value)")
(action_tile "diem1" "(done_dialog 2)")
(action_tile "diem2" "(done_dialog 3)")
(if (and (/= diem1 nil) (/= diem2 nil)) (mode_tile "accept" 0))
(setq hanh (start_dialog))
(if (= hanh 2) (setq diem1 (getpoint)) )
(if (= hanh 3) (setq diem2 (getpoint)) )
(Trade_value)
);while
(setq dcl_id (unload_dialog dcl_id))
)

Đây là đoạn lsp thứ 2
(defun dialog ()
(Value)
(Trade_value)
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "Kbv.DCL"))
(if (not (new_dialog "Kbv" dcl_id))
(exit))
(Get_value)
(mode_tile "accept" 1)
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(action_tile "khbv" "(savesvar)")
(action_tile "bd" "(setq bd1 $value)")
(action_tile "cd" "(setq cd1 $value)")
(action_tile "PT1" "(done_dialog 2)")
(action_tile "PT2" "(done_dialog 3)")
(if (and (/= PT1 nil) (/= PT2 nil)) (mode_tile "accept" 0))
(setq hanh (start_dialog))
(if (= hanh 2) (setq PT1 (getpoint)) )
(if (= hanh 3) (setq PT2 (getpoint)) )
(Trade_value)
);while
(setq dcl_id (unload_dialog dcl_id))
)

Rất mong nhận được sự giúp đỡ của anh và mọi người.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#4 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 06 July 2010 - 08:08 AM

Chào anh giabach,
Trước tiên cảm ơn anh giabach đã chỉ cho em chỗ chưa hiểu.
Nhưng giờ em lại vướng vào 1 cái hóc búa hơn.
Em viết thành công 2 lsp sử dụng dialog, nhưng khi sử dụng xảy ra hiện tượng như sau:
- Lần lượt load từng lisp và chạy. Load lsp đầu tiên không có chuyện gì xảy ra chạy bình thường.
Load lsp thứ 2 chạy bình thường, nhưng khi gõ lệnh của lsp 1 thì nó hiện lên dialog lsp thứ 2 mặc dù file DCL khác hẳn nhau không bị chồng chéo, vậy em không hiểu sao lại như vậy.
Em xin trích đoạn lsp của 2 lsp đó mong anh chỉ giúp.
Đây là lsp 1:

(defun dialog ()
.............................
)

Đây là đoạn lsp thứ 2
(defun dialog ()
..............................
)

Rất mong nhận được sự giúp đỡ của anh và mọi người.

Do bạn đặt tên hàm trùng nhau, nên khi load lsp thứ 2 thì hàm dialog sẽ đè lên hàm dialog của lsp thứ 1. kết quả thì như bạn đã thấy.
T/hợp tuơng tự cũng xảy ra khi đặt các tên biến trùng nhau nhưng không giải phóng khi kết thúc lệnh.

Cách giải quyết đơn giản là đặt tên hàm (tên biến) khác nhau, tuy nhiên nó không giải quyết triệt để.

Cách giải quyết triệt để là giải phóng các hàm (biến) khi kết thúc lệnh bằng cách khai báo các hàm (biến) này là cục bộ (local variables).
VD :
(defun C:lst1 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.
(defun dialog ()
; load file DCL của lst 1
)
(setq a 1)
(dialog)
)

(defun C:lst2 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.
(defun dialog ()
; load file DCL của lst 2
)
(setq a 1)
(dialog)
)
  • 1

#5 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 02 August 2010 - 08:24 AM

Do bạn đặt tên hàm trùng nhau, nên khi load lsp thứ 2 thì hàm dialog sẽ đè lên hàm dialog của lsp thứ 1. kết quả thì như bạn đã thấy.
T/hợp tuơng tự cũng xảy ra khi đặt các tên biến trùng nhau nhưng không giải phóng khi kết thúc lệnh.

Cách giải quyết đơn giản là đặt tên hàm (tên biến) khác nhau, tuy nhiên nó không giải quyết triệt để.

Cách giải quyết triệt để là giải phóng các hàm (biến) khi kết thúc lệnh bằng cách khai báo các hàm (biến) này là cục bộ (local variables).
VD :
(defun C:lst1 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.
(defun dialog ()
; load file DCL của lst 1
)
(setq a 1)
(dialog)
)

(defun C:lst2 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.
(defun dialog ()
; load file DCL của lst 2
)
(setq a 1)
(dialog)
)

Chào anh gia bạch,
Anh cho em hỏi luôn về vấn đề loại bỏ biến khi kết thúc lsp. Mặc dù đã loại bỏ biến rồi, nhưng rất có thể còn xót lại 1 vài biến em chưa cho vào phần loại bỏ, vậy có các nào biết biến nào vẫn tồn tại sau câu lệnh của mình trong Cad để mình loại bỏ không? Mong anh chỉ giúp.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#6 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 02 August 2010 - 10:03 AM

Chào anh gia bạch,
Anh cho em hỏi luôn về vấn đề loại bỏ biến khi kết thúc lsp. Mặc dù đã loại bỏ biến rồi, nhưng rất có thể còn xót lại 1 vài biến em chưa cho vào phần loại bỏ, vậy có các nào biết biến nào vẫn tồn tại sau câu lệnh của mình trong Cad để mình loại bỏ không? Mong anh chỉ giúp.

Cách 1. Phuơng pháp thủ công : Bạn dò từ trên xuống dưới, ở những chỗ có (setq ...), bạn copy tên biến vào phần khai báo tên hàm (đưa vào trong dấu ngoặc, phía sau dấu ngã truớc)
Dùng cách này đôi khi có thể còn xót lại 1 vài biến.

Cách 2. cho t/hợp dùng Visual Lisp Editor
- vào Tools - Environment Options - General Options - Diagnostic, chọn "Report statistics during syntax checking".
Hình đã gửi
Khi check code: Tools - Check text in editor :
Hình đã gửi
trong cửa sổ Built Output sẽ có thống kê đầy đủ Global Variables của tất cả các functions trong file lsp.

Đây là kết quả khi Check với hàm :
(defun test1 ()
(setq x (car dc) y (cadr dc))
(setq x (rtos x 2 2))
(setq y (rtos y 2 2))
(setq xn (cons x xn))
(setq yn (cons y yn))
(setq ii 1)
(setq ik (length xn))
)

Hình đã gửi
Tại dòng Global variables: (DC II IK X XN Y YN)
Bạn muốn giữ cái nào là global tuỳ ý, còn lại chuyển chúng thành local (copy vào trong dấu ngoặc, phía sau dấu ngã truớc)

VD : (defun test1 (/ dc ii ik x xn y yn) .... )

PS : tui là Gia Bách (không có dấu nặng nhé)!
  • 1

#7 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 01 November 2010 - 04:00 PM

Mình có 1 thắc mắc chưa tìm được câu trả lời. Có cách nào để list_box có thể nhận biết được 1 cú double-click không? Với 1 danh sách như list_box thì người dùng có thói quen chọn 1 phần tử bằng cách nhấp đúp chuột vào fần tử đó thay vị chọn phần tử rồi nhấn OK. thực tế rất nhiều phần mềm được viết để tương tác với người dùng theo cách này
  • 0

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


#8 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 01 November 2010 - 04:30 PM

Mình có 1 thắc mắc chưa tìm được câu trả lời. Có cách nào để list_box có thể nhận biết được 1 cú double-click không? Với 1 danh sách như list_box thì người dùng có thói quen chọn 1 phần tử bằng cách nhấp đúp chuột vào fần tử đó thay vị chọn phần tử rồi nhấn OK. thực tế rất nhiều phần mềm được viết để tương tác với người dùng theo cách này

Bạn đặt thuộc tính allow_accept=true
vd : list_box { key = "dwgs"; allow_accept=true; height = 10;}
  • 2

#9 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 01 November 2010 - 04:37 PM

Bạn đặt thuộc tính allow_accept=true
vd : list_box { key = "dwgs"; allow_accept=true; height = 10;}

Như vậy là bản thân hệ thống đã coi 1 cú double-click = Enter rồi phải không ạ. em hỏi thêm điều này vì nếu đúng như thế thì ta có thể áp dụng nó trong một số truờng hợp khác
  • 0

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


#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 November 2010 - 07:47 PM

Như vậy là bản thân hệ thống đã coi 1 cú double-click = Enter rồi phải không ạ. em hỏi thêm điều này vì nếu đúng như thế thì ta có thể áp dụng nó trong một số truờng hợp khác

Theo Tue_NV hiểu thì thuộc tính allow_accept=true thì 1 double Click tương đương như khi nhấn phím Enter

allow_accept = flag;

Activate the default button.
This attribute accepts the input when the user presses [Enter] or double-clicks a given tile.
flag: true or false (default).
  • 1