Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dkkx3a

HỎI VỀ DIALOG

Các bài được khuyến nghị

Đang học cái Dialog, nay có chút bí "quyết" không "giải" được, Post bài hỏi các Bác:

- Thứ 1: Khi mình viết cái Edit_box xong thì khi nhập số liệu vào nó toàn nằm bên trái khung Edit_box, làm sao để cho nó nằm bên phải được.

- Thứ 2: Mình phải làm sao để khi nhập số liệu vào khung Edit_Box rồi nhấn Enter thì nó làm việc ngay, chằng hạn Edit_Box1 mình nhập vào công thức "1+2+3" thì khi nhấn Enter thì tại Edit_Box2 có kết quả là "6" chứ không cần phải viết thêm 1 nút Button nữa.

Còn nhiều cái chưa "giải" đi được. Nhưng mình đang tập tành cái này, mong mọi người giúp đỡ. Em thanks dài dài.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Đang học cái Dialog, nay có chút bí "quyết" không "giải" được, Post bài hỏi các Bác:

- Thứ 1: Khi mình viết cái Edit_box xong thì khi nhập số liệu vào nó toàn nằm bên trái khung Edit_box, làm sao để cho nó nằm bên phải được.

- Thứ 2: Mình phải làm sao để khi nhập số liệu vào khung Edit_Box rồi nhấn Enter thì nó làm việc ngay, chằng hạn Edit_Box1 mình nhập vào công thức "1+2+3" thì khi nhấn Enter thì tại Edit_Box2 có kết quả là "6" chứ không cần phải viết thêm 1 nút Button nữa.

Còn nhiều cái chưa "giải" đi được. Nhưng mình đang tập tành cái này, mong mọi người giúp đỡ. Em thanks dài dài.

- Thứ 1: Bản thân Edit_box nó quy định là label sẽ ở bên trái và value ở bên phải. Nếu bạn muốn chữ ở bên phải thì bạn phải dùng text riêng để thể hiện thôi (thay cho Label của Edit_box)

- Thứ 2: Để biểu thức thực hiện ngay sau khi nhấn Enter thì bạn phải dùng đến hàm Action_tile cho edit_box đó. Bạn tìm hiểu thêm về $Reason

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
- Thứ 1: Bản thân Edit_box nó quy định là label sẽ ở bên trái và value ở bên phải. Nếu bạn muốn chữ ở bên phải thì bạn phải dùng text riêng để thể hiện thôi (thay cho Label của Edit_box)

- Thứ 2: Để biểu thức thực hiện ngay sau khi nhấn Enter thì bạn phải dùng đến hàm Action_tile cho edit_box đó. Bạn tìm hiểu thêm về $Reason

 

Cảm ơn Bác quan tâm, cái thứ 2 em chưa biết và sẽ tìm hiểu, còn cái thứ nhất Bác hơi nhầm ý em hỏi, ý của em là dữ liệu mình nhập vào Edit_box kia, không phải anh nhãn Label đâu, em muốn như cái hình dưới đây nè (nghĩa là khi nhập số liệu thì nó nằm bên phải khung Edit...

th1.jpg

 

@: Cho em hỏi thêm câu nữa là: Làm sao để liên kết mối quan hệ giữa các đối tượng trong hộp thoại, chẳng hạn em có 2 Edit_box:

Edit_box1 là nơi nhập công thức

Edit_box2 là nơi cho kết quả

Em muốn khi nhập vào Edit_box1 thì tại Edit_box2 sẽ lượng giá và cho ra kết quả ngay mà không cần thêm nút Tinh nữa:

Ví dụ: Tại Edit_box1 em nhập vào là 1+2 thì tại Edit_box2 sẽ xuất hiện kết quả 3, mong các Bác trên diễn đàn giải đáp với, cái $Reason của Bác Nataca em tìm trong help mà không thấy.

Các bác có thể liệt kê giúp các lệnh sử dụng trong Dialog được không a?

Mong giúp đỡ!!!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không ai trả lời giúp mình à, Bùn qé qé bùn......................Làm sao cho het bùn đê ??

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Đang học cái Dialog, nay có chút bí "quyết" không "giải" được, Post bài hỏi các Bác:

- Thứ 1: Khi mình viết cái Edit_box xong thì khi nhập số liệu vào nó toàn nằm bên trái khung Edit_box, làm sao để cho nó nằm bên phải được.

- Thứ 2: Mình phải làm sao để khi nhập số liệu vào khung Edit_Box rồi nhấn Enter thì nó làm việc ngay, chằng hạn Edit_Box1 mình nhập vào công thức "1+2+3" thì khi nhấn Enter thì tại Edit_Box2 có kết quả là "6" chứ không cần phải viết thêm 1 nút Button nữa.

Còn nhiều cái chưa "giải" đi được. Nhưng mình đang tập tành cái này, mong mọi người giúp đỡ. Em thanks dài dài.

- Thứ 1: pó tay

- Thứ 2: bạn tham khảo Lisp tính toán cộng trừ nhân chia

(defun c:ex1(/ $value dcl_id kqua num1 num2 phepchon ttu)
(defun TinhKqua()
 (if (and num1 num2 ttu )
   (if (and (= (atof num2) 0) (= ttu "/"))
     (progn
(alert "Khong the thuc hien phep chia cho so 0."  )
(mode_tile "sh2" 2)	)
     (progn
(setq kqua (rtos(apply(read ttu) (list (atof num1) (atof num2)))) )
(set_tile "kqua" kqua) )      )
   (cond
     ((not num1) (Ktra_Num num1 "sh1"))
     ((not num2) (Ktra_Num num1 "sh2"))
     ((not ttu)  (Ktra_Ttu ttu "ttu"))   ) ) )

(defun Ktra_Num(val key)
 (if (member (type (distof val)) '(REAL INT) )
   (TinhKqua)
   (progn
     (alert "So hang nhap khong hop le."  )
     (set_tile "kqua" "nil")
     (mode_tile key 2))  ) )

(defun Ktra_Ttu(val key)
 (if (and (= 1 (strlen val))
   (wcmatch val "+,-,`*,/") )
   (TinhKqua)
   (progn
     (alert "Toan tu nhap khong hop le."  )
     (set_tile "kqua" "nil")
     (mode_tile key 2))  ) )  
 (setq dcl_id (load_dialog "Caculator_Ex.dcl")
phepchon 1)
 (or num1 (setq num1 "10.5"))
 (or num2 (setq num2 "8"))
 (or ttu (setq ttu "*"))
 (or kqua (setq kqua "84"))
 (while (/= 0 phepchon)
   (if (not (new_dialog "Ex1" dcl_id))(exit))
   (set_tile "sh1" num1)
   (set_tile "sh2" num2)
   (set_tile "ttu" ttu)
   (set_tile "kqua" kqua)
   (action_tile "sh1" "(setq num1 $value)(Ktra_Num num1 \"sh1\")")
   (action_tile "sh2" "(setq num2 $value)(Ktra_Num num2 \"sh2\")")
   (action_tile "ttu" "(setq ttu $value)(Ktra_Ttu ttu \"ttu\")")
   (action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
   (setq phepchon (start_dialog))
   (if (= phepchon 1)  (alert (strcat num1 ttu num2 " = " kqua )) )
   );end while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
)

 

file Caculator_Ex.dcl

//Ten file: Caculator_Ex.dcl
//muc dich: su dung ham Action_tile de tinh gia tri cua edit_box
Ex1: dialog {
label = "Vi du Phep toan + - * /";
: edit_box { label = "&So hang 1"; edit_width = 15; key = "sh1"; }
: row {
     : edit_box { label = "&Toan tu (+-*/)"; edit_width = 2; key = "ttu"; }
  : spacer {width = 12;}
  }
: edit_box { label = "&So hang 2"; edit_width = 15; key = "sh2"; }
: edit_box { label = "&Ket Qua"; edit_width = 15; key = "kqua"; }
ok_cancel_err;
}
//Ket thuc file

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
- Thứ 1: pó tay

- Thứ 2: bạn tham khảo Lisp tính toán cộng trừ nhân chia

(defun c:ex1(/ $value dcl_id kqua num1 num2 phepchon ttu)
(defun TinhKqua()
 (if (and num1 num2 ttu )
   (if (and (= (atof num2) 0) (= ttu "/"))
     (progn
(alert "Khong the thuc hien phep chia cho so 0."  )
(mode_tile "sh2" 2)	)
     (progn
(setq kqua (rtos(apply(read ttu) (list (atof num1) (atof num2)))) )
(set_tile "kqua" kqua) )      )
   (cond
     ((not num1) (Ktra_Num num1 "sh1"))
     ((not num2) (Ktra_Num num1 "sh2"))
     ((not ttu)  (Ktra_Ttu ttu "ttu"))   ) ) )

(defun Ktra_Num(val key)
 (if (member (type (distof val)) '(REAL INT) )
   (TinhKqua)
   (progn
     (alert "So hang nhap khong hop le."  )
     (set_tile "kqua" "nil")
     (mode_tile key 2))  ) )

(defun Ktra_Ttu(val key)
 (if (and (= 1 (strlen val))
   (wcmatch val "+,-,`*,/") )
   (TinhKqua)
   (progn
     (alert "Toan tu nhap khong hop le."  )
     (set_tile "kqua" "nil")
     (mode_tile key 2))  ) )  
 (setq dcl_id (load_dialog "Caculator_Ex.dcl")
phepchon 1)
 (or num1 (setq num1 "10.5"))
 (or num2 (setq num2 "8"))
 (or ttu (setq ttu "*"))
 (or kqua (setq kqua "84"))
 (while (/= 0 phepchon)
   (if (not (new_dialog "Ex1" dcl_id))(exit))
   (set_tile "sh1" num1)
   (set_tile "sh2" num2)
   (set_tile "ttu" ttu)
   (set_tile "kqua" kqua)
   (action_tile "sh1" "(setq num1 $value)(Ktra_Num num1 \"sh1\")")
   (action_tile "sh2" "(setq num2 $value)(Ktra_Num num2 \"sh2\")")
   (action_tile "ttu" "(setq ttu $value)(Ktra_Ttu ttu \"ttu\")")
   (action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
   (setq phepchon (start_dialog))
   (if (= phepchon 1)  (alert (strcat num1 ttu num2 " = " kqua )) )
   );end while
 (start_dialog)
 (unload_dialog DCL_ID)
 (princ)
)

 

file Caculator_Ex.dcl

//Ten file: Caculator_Ex.dcl
//muc dich: su dung ham Action_tile de tinh gia tri cua edit_box
Ex1: dialog {
label = "Vi du Phep toan + - * /";
: edit_box { label = "&So hang 1"; edit_width = 15; key = "sh1"; }
: row {
     : edit_box { label = "&Toan tu (+-*/)"; edit_width = 2; key = "ttu"; }
  : spacer {width = 12;}
  }
: edit_box { label = "&So hang 2"; edit_width = 15; key = "sh2"; }
: edit_box { label = "&Ket Qua"; edit_width = 15; key = "kqua"; }
ok_cancel_err;
}
//Ket thuc file

 

Cảm ơn GiaBach đã trả lời, mình ứng dụng được rồi, nhân đây cho hỏi thêm vấn đề này nữa: Mình đang tạo một cái lisp trong đó có sử dụng các Phép tính + - * /, Mình thấy trong LISP của bạn có hàm tính toán và nó đúng với các số nguyên lớn, nhưng phép tính trên đơn thuần là Phép + hoặc trừ nên dùng hàm Apply, còn trường hợp phép tính có nhiều loại toán tử mình dùng hàm (c:cal str) thì khi có các sô nguyên lớn thì nó báo lỗi,

Ví dụ: (c:cal "99999999999999999*999999999999999999999+2365-52")

Error:

Integer numbers must be between 2147483647 and -2147483648

Vậy làm sao để khi áp dụng các phép tính này không báo lỗi và đôi khi lại cho kết quả không chính xác. Mong GiaBach và mọi người trên diễn đàn giúp đỡ. Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn GiaBach đã trả lời, mình ứng dụng được rồi, nhân đây cho hỏi thêm vấn đề này nữa: Mình đang tạo một cái lisp trong đó có sử dụng các Phép tính + - * /, Mình thấy trong LISP của bạn có hàm tính toán và nó đúng với các số nguyên lớn, nhưng phép tính trên đơn thuần là Phép + hoặc trừ nên dùng hàm Apply, còn trường hợp phép tính có nhiều loại toán tử mình dùng hàm (c:cal str) thì khi có các sô nguyên lớn thì nó báo lỗi,

Ví dụ: (c:cal "99999999999999999*999999999999999999999+2365-52")

Error:

Integer numbers must be between 2147483647 and -2147483648

Vậy làm sao để khi áp dụng các phép tính này không báo lỗi và đôi khi lại cho kết quả không chính xác. Mong GiaBach và mọi người trên diễn đàn giúp đỡ. Thanks

Bạn chuyển số nguyên thành số thực là OK ngay

(c:cal "99999999999999999.0*999999999999999999999.0+2365-52")

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn chuyển số nguyên thành số thực là OK ngay

(c:cal "99999999999999999.0*999999999999999999999.0+2365-52")

Hoặc bạn phải dùng thuật toán tính toán cho số vô cùng lớn. Thuật toán đó như bạn làm phép tính tay đơn thuần (cộng, rồi nhớ, rồi cộng...)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn GiaBach đã trả lời, mình ứng dụng được rồi, nhân đây cho hỏi thêm vấn đề này nữa: Mình đang tạo một cái lisp trong đó có sử dụng các Phép tính + - * /, Mình thấy trong LISP của bạn có hàm tính toán và nó đúng với các số nguyên lớn, nhưng phép tính trên đơn thuần là Phép + hoặc trừ nên dùng hàm Apply, còn trường hợp phép tính có nhiều loại toán tử mình dùng hàm (c:cal str) thì khi có các sô nguyên lớn thì nó báo lỗi,

Ví dụ: (c:cal "99999999999999999*999999999999999999999+2365-52")

Error:

Integer numbers must be between 2147483647 and -2147483648

Vậy làm sao để khi áp dụng các phép tính này không báo lỗi và đôi khi lại cho kết quả không chính xác. Mong GiaBach và mọi người trên diễn đàn giúp đỡ. Thanks

Như thông báo của Cad : số nguyên phải trong khoảng từ -2,147,483,648 đến +2,147,483,647 (32 bit), các trường hợp khác Cad sẽ báo lỗi Overflow (tràn bộ nhớ).

Chú ý truờng hợp phép toán với 2 số nguyên (Integer) khi kết quả là 1 giá trị vuợt quá phạm vi biểu diễn của kiểu nguyên (Integer) thì giá trị trả về sẽ không đúng.

vd : (+ 2147483646 3) -> -2147483647 giá trị trả về sai.

nhưng : (+ 2147483646 3.0) -> 2.14748e+009 giá trị trả về đúng. (phép toán giữa số nguyên với số thực -> kết quả trả về là số thực)

 

Bạn có thể chuyển sang kiểu số thực như đề nghị của Tue_NV.

Với kiểu số thực thì phạm vi ứng dụng nằm trong khoảng rất lớn từ 10^-308 đến khoảng 10^+308 , do đó có thể không phải lo lắng về vấn đề Overflow.

 

Trong Lisp Phép tính + - * /, truớc khi thực hiện lệnh Apply tui đã đổi các số thành số thực (atof ...) nên nó đúng với các số nguyên lớn.

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn chuyển số nguyên thành số thực là OK ngay

(c:cal "99999999999999999.0*999999999999999999999.0+2365-52")

 

Cảm ơn mọi người đã nhiệt tình giúp đỡ, Cách của Tue_NV mình đã thử, nhưng vấn đề chuyển các số trong chuỗi phép tính là vấn đề không phải dễ với mình. Mình đã thử làm với cách tìm kiếm các toán tử + - * / ^ và chuyển nó thành .0 + hay .0 - ...

Ví như: 14+2+3 ---> 14.0+2.0+3 nhưng cứ toàn phát sinh lỗi. Với cách phép toán đơn giản như A+B thì còn xử được, còn nhiều toán thử trở lên thì khả năng có hạn nên đành chịu, viết toàn phát sinh lỗi hay lặp vô hạn.

Vậy nhờ các anh em trên diễn đàn viết dùm đoạn LSP chuyển các phép toán có các số nguyên chuyển sang số thực còn các số thực thì bỏ qua, cảm ơn mọi người.

Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn mọi người đã nhiệt tình giúp đỡ, Cách của Tue_NV mình đã thử, nhưng vấn đề chuyển các số trong chuỗi phép tính là vấn đề không phải dễ với mình. Mình đã thử làm với cách tìm kiếm các toán tử + - * / ^ và chuyển nó thành .0 + hay .0 - ...

Ví như: 14+2+3 ---> 14.0+2.0+3 nhưng cứ toàn phát sinh lỗi. Với cách phép toán đơn giản như A+B thì còn xử được, còn nhiều toán thử trở lên thì khả năng có hạn nên đành chịu, viết toàn phát sinh lỗi hay lặp vô hạn.

Vậy nhờ các anh em trên diễn đàn viết dùm đoạn LSP chuyển các phép toán có các số nguyên chuyển sang số thực còn các số thực thì bỏ qua, cảm ơn mọi người.

Thanks

Bạn phức tạp vấn đề lên rồi đấy. Quả thật nó rất đơn giản, đơn giản như nó vốn có.

(c:cal "14.0+2.0+3") -> bạn nói nó phát sinh lỗi. Lỗi chổ mô vậy bạn???

Vấn đề của bạn thực đơn giản

1 -> Hãy chuyển các số nguyên thành số thực

2 -> Dùng hàm strcat nối các số và toán tử thành 1 chuỗi

3-> Tính

 

(setvar "DIMZIN" 0)

Command: (setq a (rtos 14 2 1))

 

Command: (setq b (rtos 3 2 1))

 

Command: (setq c (rtos 2 2 1))

 

(c:cal (strcat a "+" b "+" c))

 

Hãy đơn giản vấn đề cho đầu óc nó thoải mái, bạn ạ :cheers:

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn phức tạp vấn đề lên rồi đấy. Quả thật nó rất đơn giản, đơn giản như nó vốn có.

(c:cal "14.0+2.0+3") -> bạn nói nó phát sinh lỗi. Lỗi chổ mô vậy bạn???

Vấn đề của bạn thực đơn giản

1 -> Hãy chuyển các số nguyên thành số thực

2 -> Dùng hàm strcat nối các số và toán tử thành 1 chuỗi

3-> Tính

 

(setvar "DIMZIN" 0)

Command: (setq a (rtos 14 2 1))

 

Command: (setq b (rtos 3 2 1))

 

Command: (setq c (rtos 2 2 1))

 

(c:cal (strcat a "+" b "+" c))

 

Hãy đơn giản vấn đề cho đầu óc nó thoải mái, bạn ạ :cheers:

 

Bác Tue_NV hiểu nhầm ý em rồi, em có nói (c:cal "14.0+2.0+3") phát sinh lỗi hồi mô, ý em là khi muốn chuyển nhóm 14+2+3 sang 14.0+2.0+3 thì nó không được toàn sinh lỗi vì em dùng cái cách nhận biết toán tử + và thay bằng .0+ nên trong các phép toán nhiều dấu + (ở đây em chỉ ví dụ dấu + thôi chứ thật ra rất nhiều phép tính của +-*/ va ^ nữa). Thì em dung hàm while tìm dấu + thay bằng .0+ nên có lặp vô hạn. Ý em nhờ các bác mách hộ hàm nào có thể thay thế hàng loạt dấu + (- * / ^) một lúc thành .0+ (- * / ^) ấy mà.

Cái nhóm hàm chuyển từ số thực sang chuỗi và ghép lại cũng hiểu nhưng cái quan trọng là ko biết tách các số nguyên các số thực các toán tử theo thứ tự để chuyển nguyên sang thực và ghép lại Bac Tue_NV ạ. Bác nghiên cứu giùm em phát, em mò mẫm mà chẳng xong toàn ra mấy anh như là 10.0.0 ........., mong các bác giúp đỗ. Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác Tue_NV hiểu nhầm ý em rồi, em có nói (c:cal "14.0+2.0+3") phát sinh lỗi hồi mô, ý em là khi muốn chuyển nhóm 14+2+3 sang 14.0+2.0+3 thì nó không được toàn sinh lỗi vì em dùng cái cách nhận biết toán tử + và thay bằng .0+ nên trong các phép toán nhiều dấu + (ở đây em chỉ ví dụ dấu + thôi chứ thật ra rất nhiều phép tính của +-*/ va ^ nữa). Thì em dung hàm while tìm dấu + thay bằng .0+ nên có lặp vô hạn. Ý em nhờ các bác mách hộ hàm nào có thể thay thế hàng loạt dấu + (- * / ^) một lúc thành .0+ (- * / ^) ấy mà.

Cái nhóm hàm chuyển từ số thực sang chuỗi và ghép lại cũng hiểu nhưng cái quan trọng là ko biết tách các số nguyên các số thực các toán tử theo thứ tự để chuyển nguyên sang thực và ghép lại Bac Tue_NV ạ. Bác nghiên cứu giùm em phát, em mò mẫm mà chẳng xong toàn ra mấy anh như là 10.0.0 ........., mong các bác giúp đỗ. Thanks

Bạn vui lòng upload file mà bạn đã viết lên đây để anh em trên diễn đàn góp ý được không?

Nhưng Tue_NV vẫn thấy không ổn

Mình đặt ra trường hợp này nhé:

dấu / -> bạn thay bằng .0/

suy ra )/ -> bạn thay bằng ).0/ -> cái này không đúng rồi

Ví dụ như : (10-1)/3

-> sẽ kết quả là như vậy : (10-1).0/3 -> bạn thấy có đúng không???????

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn vui lòng upload file mà bạn đã viết lên đây để anh em trên diễn đàn góp ý được không?

Nhưng Tue_NV vẫn thấy không ổn

Mình đặt ra trường hợp này nhé:

dấu / -> bạn thay bằng .0/

suy ra )/ -> bạn thay bằng ).0/ -> cái này không đúng rồi

Ví dụ như : (10-1)/3

-> sẽ kết quả là như vậy : (10-1).0/3 -> bạn thấy có đúng không???????

 

Uhm, đúng thật, mình không nghĩ đến cái này. Để mình dọn dẹp cái LSP cho dễ dòm rồi gởi các Bác sửa giùm. Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×