Đối Tượng Button

Một phần của tài liệu Xây dựng công cụ cho phép thiết kế ứng dụng SCADA vừa và nhỏ trên nền iOS (Trang 65 - 72)

5.5 Màn Hình Runtime

5.5.5 Đối Tượng Button

Button giúp người dùng có thể thực hiện các lệnh đối với các biến thông qua Script. Ngoài ra Button còn có chức năng ON/OFF.

Page 56

Bước 1: Đầu tiên cần tạo Class để đưa vào cho đối tượng các thuộc tính mong muốn mà thư viện chuẩn chưa có. Ví dụ như là TagAssign, Decription ..v..v

Trong đó đối tượng ngoài có các thuộc tính mặc định của xcode hỗ trợ thì nay có thêm thuộc tính tagAssign và decription phục vụ cho nhu cầu viết code.

Các hàm Init trong file .m phục vụ cho việc khởi tạo một đối tượng mới với các thông số khởi tạo mong muốn.

Bước 2: Trong giao diện Runtime ta cũng tạo ra 1 Button sẵn làm một tool khi click vào nó sẽ tạo ra được các đối tượng Button. Cách làm cũng tương tư như trên.

Đậy là hàm ngắt khi người dùng tap vào tool Button:

- (IBAction)CreatButton:(id)sender {

panButtonGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragGesture:)];

[panButtonGestureArray addObject:panButtonGesture];

tapButtonGesture= [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapButton:)];

tapButtonGesture.numberOfTapsRequired=2;

tapButtonGesture1= [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapButton1:)];

[tapButtonGestureArray addObject:tapButtonGesture];

pinchButtonGesture =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchMe:)];

[pinchButtonGestureArray addObject:pinchButtonGesture];

buttonCreated=[[Button alloc] initWithFrame:CGRectMake(205, 445, 100, 50) titleName:@"Button"];

buttonCreated.tag=buttonTagID; buttonTagID++;

//Array Manage Button Object

[buttonArray addObject:buttonCreated]; [self.view addSubview:buttonCreated];

Page 57

Bước 3: Dùng Script viết Code cho Button.

Giới thiệu về expression.

Expression là 1 phần mở rộng của button cho phép ta thực hiện các biểu thức toán phức tạp giữa các tag như cộng, trừ, nhân, chia (+,-,*,/) hoặc AND, OR, XOR, NOT. Điều này thực sự rất có ích khi chương trình của chúng ta muốn thực hiện một biểu thức nào đó phức tạp giữa các tag mà không thể tính bằng tay. Ví dụ: Ta muốn thực hiện các biểu thức sau:

a/ tag1 = tag1 + 3 * (tag2 + 6) / 2;

b/ tag2 = tag2 – 2 * (3+tag1); tag3 = tag3 + 10; c/ tag1 = tag1 AND (NOT tag1);

Nhìn vào các biểu thức trên ta thấy mỗi biểu thức có độ phức tạp khác nhau và bản thân người dùng không thể lúc nào cũng phải ngồi tính toán từng biểu thức một được. Lúc này thì máy tính là một công cụ hỗ trợ đặc lực cho việc tính toán từng biểu thức đó.

Phần expression được đề cập đến trong chương trình của chúng ta là một trong những công cụ đó. Phần expression trong chương trình chúng ta được thiết kế để cho phép tính toán một chuỗi biểu thức có độ dài bất kỳ, độ phức tạp tùy ý và liên quan đến các phép toán (+,- ,*,/) và (AND, OR, XOR, NOT). Và chuỗi biểu thức này phải kết thúc bằng “;” (dấu chấm phẩy). Mỗi chuỗi biểu thức có thể gồm nhiều biểu thức nhỏ khác nhau. Ví dụ: chuỗi biểu thức b ở trên gồm 2 biểu thức nhỏ ngăn cách nhau bởi dấu chấm phẩy.

Đó là tổng quan sơ lược về expression trong chương trình của chúng ta.

Cách thức sử dụng expression

Cách thức sử dụng chức năng expression trong buttion Bước 1: Tạo mới 1 button.

Bước 2: Double tap vào button đó, trên segment chức năng ta chọn chức năng expression. Một view mới hiện ra cho phép ta nhập expression vào.

Bước 3: Nhập expression vào. Chọn OK 2 lần.

Bước 4: Chạy chế độ Runtime để kiểm tra lỗi và xem kết quả.

Cách thức xây dựng expression

Page 58

Hình 5-23 Giải thuật cho Expression

* Đọc expression được nhập vào:

Expression (biểu thức) sẽ được đọc vào dưới dạng kiểu NSString (kiểu chuỗi). Từ đó ta sẽ dựa trên biểu thức này để xử lý các bước tiếp theo.

* Lấy các phần tử trong biểu thức và loại bỏ khoảng trống:

Bước này thực ra là bước lọc bỏ các thành phần không cần thiết trong biểu thức. Bước này sẽ được thực hiện bởi hàm sau:

- (NSMutableArray*) getCalculateUnits: (NSString*) exprString

Đầu vào của hàm là chuỗi exprString (kiểu NSString). Chuỗi này là chuỗi expression gốc ban đầu ta đọc vào. Hàm này ta sẽ thực hiện các chức năng sau:

+ Lấy các toán hạng, các toán tử, các dấu ngoặc và lưu vào một mảng chứa các phần tử tính toán.

+ Loại bỏ các khoảng trống không cần thiết trong chuỗi ban đầu.

Vì hàm có kiểu là NSMutableArray nên khi thực hiện xong hàm sẽ trả về 1 mảng có kiểu là NSMutableArray và mảng này sẽ chứa các phần tử tính toán. Do đó ta sẽ tạo một mảng mới để lưu các giá trị từ mảng này. Mảng mới được tạo sẽ là mảng fullExp và cũng theo kiểu NSMutableArray như sau:

NSMutableArray *fullExpr = [[NSMutableArray alloc] init]; fullExpr = [self getCalculateUnits:fullString];

Page 59

Trong đoạn code trên thì fullString là expression (biểu thức) được đọc vào ban đầu của chúng ta.

* Tách biểu thức lớn ra thành biểu thức nhỏ:

Ở giai đoạn này ta sẽ tách biểu thức gốc ban đầu (fullExpr) thành các biểu thức nhỏ hơn (nếu có). Các biểu thức nhỏ này được phân cách với nhau bởi dấu chấm phẩy. Cách thức ta làm như sau: ta sẽ quét toàn bộ biểu thức fullExpr đến khi nào gặp dấu chấm phẩy thì lấy toàn bộ biểu thức trước đó gán vào chuỗi tạm tempArray. Chuỗi fuillExpr bây giờ sẽ bằng chuỗi fullExpr ban đầu trừ đi chuỗi tạm tempArray. Nếu không tìm thấy dấu chấm phẩy thì chương trình sẽ báo lỗi. Đoạn code tách biểu thức như sau:

* Tìm độ ưu tiên cho các phần tử:

Trong phần này ta sẽ tìm độ ưu tiên cho các phần tử trong biểu thức (hoặc biểu thức nhỏ nếu có) để tiện cho việc thực hiện tính toán. Để thuận tiện cho việc tìm độ ưu tiên, ta tuân theo các quy định như sau:

 Phép gán ‘=’ có độ ưu tiên là 1 (thực hiện sau cùng).

 Phép cộng, phép trừ hoặc các phép AND, OR, XOR có độ ưu tiên là 2.

 Phép nhân, chia và phép NOT có độ ưu tiên là 3.

Khi có 1 dấu mở ngoặc ‘(‘ thì tăng độ ưu tiên lên 2 cho các phép toán bên trong ngoặc đó. Tương tự, 2 dấu mở ngoặc thì độ ưu tiên tăng 4, 3 dấu mở ngoặc thì độ ưu tiên tăng 6.

 Ngược lại khi có 1 dấu đóng ngoặc ‘)‘ thì giảm độ ưu tiên cho các phép toán sau nó đi 2. Tương tự, 2 dấu mở ngoặc thì độ ưu tiên giảm 4, 3 dấu mở ngoặc thì độ ưu tiên giảm 6.

 Các toán hạng còn lại và dấu mở ngoặc ‘(‘ hoặc dấu đóng ngoặc ‘)’ thì độ ưu tiên sẽ là 0.

Page 60

Trong đoạn code trên thì mảng calPriority sẽ được dùng để lưu độ ưu tiên tương ứng với từng phần tử trong mảng calUnit. Và ta cũng tận dụng đoạn code trên để tìm độ ưu tiên lớn nhất của mạng calUnit luôn (thông qua biến maxPri).

* Kiểm tra lỗi cú pháp:

Kiểm tra lỗi cú pháp tức là kiểm tra xem biểu thức nhập vào có đúng cấu trúc lệnh được quy định không. Nếu sai cấu trúc lệnh quy định thì chương trình sẽ báo lỗi “Error Structure” và ta phải sửa lại cho đúng thì expression mới thực hiện được.

Do đó, trong phần này ta cũng tuân theo các quy định về cấu trúc lệnh như sau để tìm lỗi cú pháp:

 Một biểu thức mà không có toán hạng nào (kể cá toán hạng bằng ‘=’) sẽ là biểu thức không đúng cú pháp.

 Vị trí thứ 0 phải là toán hạng.

 Vị trí thứ 1 phải là toán tử bằng ‘=’ (phép gán) (do thứ tự được tính từ 0).

 Bên trái 1 toán tử nào đó phải là dấu đóng ngoặc ‘)‘ hoặc một toán hạng (trừ toán tử NOT vì bên trái toán tử NOT có thể là một toán tử khác).

 Bên phải 1 toán tử nào đó phải là dấu mở ngoặc ‘(‘ hoặc một toán hạng.

 Hai dấu ngoặc liên tiếp phải giống nhau, nếu khác nhau sẽ báo lỗi cú pháp.

 Bên trái 1 toán hạng phải là 1 toán tử hoặc dấu mở ngoặc ‘(‘.

 Bên phải 1 toán hạng phải là 1 toán tử hoặc dấu đóng ngoặc ‘)‘ hoặc dấu chấm phẩy ‘;’.

Page 61  Số lượng dấu đóng ngoặc và dấu mở ngoặc phải bằng nhau.

Do đoạn code xử lý các điều kiện này hơi dài nên ta không nêu ra ở đây.

* Kiểm tra sự tồn tại của tag:

Kiểm tra sự tồn tại của tag là kiểm tra tag đó có nằm trong danh sách tag trong chương trình của chúng ta không. Nếu tag không có trong chương trình thì chương trình sẽ báo lỗi và ta phải sửa lại cho đúng tên tag trong chương trình thì expression mới thực hiện được.

Tag trong chương trình sẽ tham gia trong biểu thức với vai trò toán hạng. Do đó muốn biết đó có phải là một tag hay không ta phải qua các bước loại trừ từ cao tới thấp. Trước tiên ta phải loại trừ các toán tử đi (các toán tử có độ ưu tiên > 0), sau đó loại trừ các ký tự đặc biệt đi (ví dụ: dấu ngoặc, dấu chấm phẩy), sau đó loại trừ các toán hạng là số đi. Cuối cùng ta mới dùng hàm để tag đó trong chương trình. Nếu có thì hàm trả về tag, nếu không thì hàm trả về giá trị ‘nil’. Nếu hàm trả về giá trị ‘nil’ thì ta sẽ thông báo lỗi.

Đoạn code của hàm kiểm tra sự tồn tại của tag như sau:

* Thực hiện biểu thức theo độ ưu tiên của phép toán:

Đây là lúc ta bắt đầu thực hiện tính toán biểu thức nếu qua các bước kiểm tra lỗi ở trên mà biểu thức của ta không xảy ra bất cứ lỗi nào.

Trong phần này ta sẽ tuân theo quy tắc sau để thực hiện biểu thức: thực hiện biểu thức theo độ ưu tiên của các toán tử. Toán tử có độ ưu tiên cao nhất thì thực hiện trước, sau đó đến các toán tử có độ ưu tiên kế tiếp.

Do code khá dài và phức tạp nên ta không nêu ra ở đây nhưng quá trình thực hiện tính toán được tóm tắt như sau:

Page 62

Bước 2: Xóa độ ưu tiên của toán tử đó.

Bước 3: Sau đó thì thực hiện tính toán biểu thức đơn giản nhất liên quan đến toán tử đó. Biểu thức đơn giản nhất tức là biểu thức gồm 3 phần tử đối với các toán tử thông thường (2 toán hạng và 1 toán tử) và 2 phần tử đối với toán tử NOT (toán tử NOT và 1 toán hạng).

Bước 4: Gán kết quả vào mảng cũ, sắp sếp lại mảng và loại bỏ các phần tử dư ra sau khi tính toán.

Bước 5: Quay lại thực hiện từ bước 1 tới bước 4 đến khi không còn toán tử nào nữa. Chú ý: Nếu có nhiều toán tử có độ ưu tiên giống nhau thì phép toán của các toán tử đó được thực hiện lần lượt từ trái qua phải.

Một phần của tài liệu Xây dựng công cụ cho phép thiết kế ứng dụng SCADA vừa và nhỏ trên nền iOS (Trang 65 - 72)

Tải bản đầy đủ (PDF)

(145 trang)