[Ngôn ngữ Avenue #8] File và lưu trữ, phân phối ứng dụng

0
99

ArcView cung cấp một phương thức khác cho phép tuỳ biến gọi là extension. Extension cung cấp một cách thức tiện lợi cho phép  phân phối tập các công cụ cùng với các thành phần cần thiết khác. Lợi ích của extension là có thể load khi cần các công cụ mở rộng. Trong ArcView có một số extension có sẵn như CAD Reader, Digitizer, Network Analyst, Spatial Analyst. Các extension này thêm mới các button và menu vào giao diện ArcView hay cho phép ArcView hiển thị thêm các dạng format dữ liệu như là CAD.

A.FILE

1. MÔ HÌNH LƯỢC ĐỒ ĐỐI TƯỢNG FILE

Lớp File có hai lớp con thuộc về nó, đó là LineFile và TextFile. Mỗi đối tượng File có một tên File tương ứng với nó. FileDialog chứa các FileName.
ODB không phải là một đối tượng của lớp File nó là một dạng File đặc biệt.

2. THAO TÁC TRÊN FILE

Lớp File

Lớp File là một lớp trừu tượng (lớp trừu tượng là lớp không có thực thể thuộc về nó). Lớp File cho phép ta mở, đóng, xoá, hay copy một file từ vị trí này đến vị trí khác trên ổ đĩa.
Lớp File quản lý đọc và ghi các file ASCII, lớp File có 2 lớp con là lớp LineFile và lớp TextFile.

Các yêu cầu của lớp File

LineFile

Lớp LineFile xem mỗi hàng trong file là một phần tử. Dó đó, mỗi lần đọc hay ghi vào file này ta phải thao tác với từng hàng.
f=FileDialog.Show(“*.txt”,”Text file”,”Doc text field”)
if (f=nil) then
return nil
end
str=””
afile=TextFile.Make(f,#FILE_PERM_READ)
if (afile=nil) then
return nil
end
while (afile.IsAtEnd.Not)
str=str + afile.ReadElt
end
msgbox.info(str,”Noi dung File”)
Câu lệnh afile=TextFile.Make(f,#FILE_PERM_READ) cho phép ta tạo ra một TextFile có thông số truyền vào là đường dẫn của file và tác vụ tương ứng sẽ thực hiện trên file này.
Vòng lặp while (afile.IsAtEnd.not)
Str=str + afile.ReadElt 
End
sẽ đọc các ký tự trong file cho tới khi gặp ký tự kết thúc file.

Một số yêu cầu trên lớp TextFile

Khi tạo một TextFile ta phải cho biết file đó để đọc, ghi hay vừa đọc vừa ghi. Thông số aFilePerm trong yêu cầu Make nói lên điều này
Giá trị của aFilePerm như sau:
  • #FILE_PERM_READ Mở một file có sẵn để đọc
  • #FILE_PERM_WRITE Tạo mới một file và ghi vào file này
  • #FILE_PERM_MODIFY Mở một file có sẵn và đọc hay ghi trên file này, ghi chỉ cho phép ghi đè lên một ký tự có sẵn, hay ghi tiếp vào cuối file, không cho phép chèn ký tự vào giữa file.
  • #FILE_PERM_APPEND Cho phép ghi tiếp vào file có sẵn hay tạo mới

TextFile

Lớp TextFile xem mỗi ký tự trong file là một phần tử. Do đó, mỗi lần đọc hay ghi vào file này ta phải thao tác với từng ký tự một.
Ví dụ sau cho phép ghi tiếp vào một text file có sẵn trên đĩa, nếu file này chưa có trên đĩa thì tạo mới và ghi vào nó.
theLabels={“City”,”State”, “Quanlity”, “Population”}
theInput={“Redlands”,”California”,”Good”,”7000”}
theFN=FindDialog.Show(“*.txt”,”Text File”,”Specify File”)
if (File.Exists(theFN)) then ‘ nếu file đã tồn tại trên ỗ đĩa
‘ mở file và cho phép ghi tiếp vào file
theWriteFile=FileLine.Make(theFN,#FILE_PERM_APPEND)
if (theWriteFile=nil) then
msgbox.info(“Khong the mo file nay”,”Thong bao”)
exit
end
else ‘ trường hợp chưa có file này trên đĩa
‘ tạo mới file này
theWriteFile=LineFile.Make(theFN,#FILE_PERM_WRITE)
if (theWrite=nil) then
msgbox.info(“Khong the tao file nay”,”Thong bao”)
exit
end
‘ tiến hành ghi vào file
theWriteFile.WritElt(theLabels.Get(0) + “,” ++ theLabels.Get(1) + “,” ++ theLabels.Get(2) + “,” ++ theLabels.Get(3))
theWriteFile.WritElt(theInput.Get(0)+ “,” “++ theInput.Get(1)+” ,” ++ theInput.Get(2) + “,”++ theInput.Get(3))
while (msgbox.YesNo(“Ban ghi tiep khong”,true))
theInput=Msgbox.MultiInput(“Customer name”, “Data”,theLabels,theInput)
if (theInput.count=0) then
break
end
theWriteFile.writElt(theInput.Get(0) +”,” ++ theInput.Get(1)+ “,” ++ theInput.Get(2) + “,” “++ theInput.Get(3))
end
theWriteFile.close

Một số yêu cầu của lớp LineFile

ODB
ODB (Object Database File) không phải lớp con của lớp File, nó là một loại file đặc biệt. Thông qua ODB file ta có thể ghi các thuộc tính của bất kỳ đối tượng nào trong ArcView xuống file này. File project .apr là một loại của file này.
Ví dụ sau dùng file ODB lưu project hiện tại xuống file có tên là project.apr
myODB=ODB.Make(“project.apr”.AsFileName)
myODB.Add(av.GetProject)
myODB.Commit ‘ ghi toàn bộ tất cả các đối tượng trong project hiện tại xuống file

Bài tập

Bài tập 1:Đọc một file, thay tất cả các ký tự dấu ! trong file bằng ký tự dấu ?.
Bài tập 2:Đếm số dòng trong một File
Bài tập 3:Đọc dữ liệu từ một file có sẵn toạ độ x, y lưu vào một bảng
Ví dụ file a.txt có nội dung như sau
123.45 674.45
4535.54 675.67
9785.22 564.33
Cột đầu được đặt vào trường x, cột 2 được đặt vào trường y.
Bài tập 3:
Lưu tất cả các script được chọn trong project hiện hành vào một thư mục trên ổ đĩa
Bài tập 4:
Lấy tất cả các script trong một thư mục vào project hiện hành

B.LƯU TRỮ VÀ PHÂN PHỐI ỨNG DỤNG

1. LƯU TRỮ ỨNG DỰNG TUỲ BIẾN TRONG EXTENSION

ArcView cung cấp một phương thức khác cho phép tuỳ biến gọi là extension. Extension cung cấp một cách thức tiện lợi cho phép phân phối tập các công cụ cùng với các thành phần cần thiết khác. Lợi ích của extension là có thể load khi cần các công cụ mở rộng. Trong ArcView có một số extension có sẵn như CAD Reader, Digitizer, Network Analyst, Spatial Analyst. Các extension này thêm mới các button và menu vào giao diện ArcView hay cho phép ArcView hiển thị thêm các dạng format dữ liệu như là CAD.

Tạo mới một extension

Viết các Script để tạo extension
Để đơn giản ta xem như extension là một vật chứa các đối tượng (lớp Extension là lớp con của lớp ODB). Để tạo một extension, lấy các đối tượng mà ta muốn từ project như các menu, các button, các script, hay các view đem chúng vào extension. Dưới đây là một script chỉ cách tạo một extension chứa một view, một button mới trên thanh Menubar của view.
theProject=av.getProject
‘ tìm script cài đặt và bỏ cài đặt extension
theInstallScript=theProject.FindDoc(“SampleInstallScript”).GetScript
theUninstallScript=theProject.FindDoc(“SampleUninstallScript”).GetScript
‘ kiểm tra xem có script cài đặt và bỏ cài đặt chưa
if ((theInstallScript=nil) or (theUninstall=nil)) then
Msgbox.info(“chưa có script cài đặt và bỏ cài đặt”,”Thông báo”)
Return nil
End
‘ tạo file extension, file extension thường có đuôi .avx
myExtension=Extension.Make(“$HOME/myext.avx”.asFileName”, “Sample extension”, theInstallscript, theUninstallscript,{})
‘ lấy menu mới tạo và bỏ vào extension
theViewMenubar=theProject.FindGui(“View”).GetMenuBar
theMenuItem=theViewMenuBar.FindByLabel(“New Menu”)
myExtension.Add(theMenuItem)
‘ lấy view có tên là ban do tinh Dong Thap và bỏ vào extension
myExtension.Add(theProject.FindDoc(“Ban do tinh Dong Thap”))
‘ bỏ các script cần thiết vào extension này, giả sử tất cả các Script trong project này đều cần thiết để bỏ vào extension
for each d in av.GetProject.GetDocs
if (d.Is(SEd)) then
myExtension.add(d.GetScript)
end
end
‘ thêm vào một câu mô tả về extension này, câu này xuất hiện trong dialog xuất hiện extension
myExtension.SetAbout(“Đây là một extension”)
‘ chắc rằng ghi tất cả các đối tượng xuống file extension
myExtension.Commit

Viết các Script để cài đặt và bỏ cài đặt extension

Extension khi được load vào một project sẽ thêm các đối tượng (menu, button, view…) trong project hiện tại. Để làm được điều này, ta tạo một script cài đặt (install script) chạy khi load script này vào project. Script cài đặt chứa các lệnh Avenue để lấy ra các đối tượng từ extension và đặt chúng vào vị trí tượng ứng trên project hiện thời. Chẳng hạn, đặt menu mới vào thanh Menubar của View và thêm view vào project.
Khi viết script cài đặt, nên nhớ vị trí các đối tượng đã đưa vào extension trước đó để có thể đặt chúng đúng vị trí trong project.
if (av.GetProject=nil) then
return nil
end
‘ thêm menu vào menu file trong project
theMenuBar=av.GetProject.FindGui(“View”).GêtMnuBar
theMenu=theMenuBar.FindByLabel(“File”)
if (theMenu<>nil) then
theMenubar.add(self.Get(0), theMenuBar.GetControls.Find(theMenu))
else
theMenuBar.Add(self.Get(0),999)
end
‘ thêm menu vào project
av.GetProject.AddDoc(self.get(1))
Script cài đặt thêm các đối tượng lưu trong extension vào project hiện tại. Như vậy, điều đầu tiên script cài đặt làm là kiểm tra có project không. Nếu có, script cài đặt tiếp tục thực hiện, trong trường hợp này nó sẽ lấy thanh MenuBar của View và gán vào đó menu mới trong menu File. Nếu menu File không tồn tại (bị xoá hay đổi tên), menu mới sẽ được đặt vào cuối của thanh MenuBar. Điều cuối cùng script cài đặt làm là thêm vào một view mới. Chú ý là script cài đặt không cài đặt vào script hiện tại script nào. ArcView sẽ tự động tìm kiếm tất cả các extension khi tìm một script cần thực thi. Như vậy, các script kết hợp với một extension chỉ cần thêm vào extension khi ta tạo ra nó.
Khi bỏ một extension ra khỏi project, không còn sử dụng nó trong project thì cũng cần bỏ tất cả các đối tượng kèm theo nó. Script sau bỏ menu mới và view khỏi project.
if (av.GetProject=nil) then
return nil
end
if (av.GetProject.IsClosing) then
return nil
end
‘ bỏ menu
theMenuBar =av.GetProject.FindGui(“View”).GetMenuBar
theMenuBar.Remove(self.Get(0))
‘ bỏ view
av.GetProject.RemoveDoc(self.Get(1))
 Giống như script install, có thể sử dụng extension để tham khảo trực tiếp các đối tượng để bỏ nó khỏi project hiện hiện tại. Theo cách này, không phải lo nếu các đối tượng bị thay đổi bởi người sử dụng (ví dụ như nhãn của menu).
Các script cài đặt và bỏ cài đặt ta phải được dịch trước, dịch các script này sẽ giúp ta loại bỏ các lỗi nếu có trước khi xây dựng extension.

Chạy thử extension

Bây giờ đã có tất cả các script cần thiết để tạo một extension. Chạy script tạo extension để tạo file extension .avx, copy file này vào một trong hai vị trí sau: thư mục ext32 nằm trong thư mục cài đặt của ArcView hay vào thư mục xác định bởi biến môi trường $USEREXT ( vị trí mặc định cho $USEREXT là $HOME). Extension vừa tạo bây giờ xuất hiện trong hộp thoại Extension Dialog.

Tích hợp một extension với các extension khác

Trong ArcView, nhiều extension được load vào cùng một lúc. Điều này có nghĩa có thể phụ thuộc vào các extension khác để cung cấp các chức năng phụ cho extension của ta. Chẳng hạn, xây dựng một extension chứa vài công cụ chuyên biệt hỗ trợ cho extension Network Analyst. Khi sử dụng extension này, muốn ArcView load extension của đồng thời load luôn extension Network Analyst.
Script sau là ví dụ cho phép tạo ra một extension mà nó phụ thuộc vào extension Network Analyst và extension Spatial Analyst
theProject =av.GetProject
‘ lấy script cài đặt và bỏ cài đặt
theInstallScript=theProject.FindDoc(“SampleInstallScript”).GetScript
theUninstallScript=theProject.FindDoc(“SampleUninstallScript”).GetScript
‘ chỉ ra vị trí của các extension mà extension của mình phụ thuộc vào
aExt=”$HOME/ext32/network.avx”.AsFileName
bExt=”$HOME/ext32/spatial.avx”.AsFileName
‘ tao danh sách các extension phụ thuộc
theDepend={aExt,bExt}
‘ Tạo file extension
myExtension=Extension.Make(“$HOME/myext.avx”.AsFileName, “Sample extension”, theInstallScript,theUninstallScrip,theDepend}
 Một số yêu cầu của lớp Extension

2. MÃ HOÁ SCRIPT

Khi xây dựng hoàn chỉnh ứng dụng, muốn phân phối ứng dụng của mình cho khách hàng nhưng lại không muốn khách hàng truy cập vào các Script đã viết. Vậy thì phải làm bằng cách nào? ArcView cung cấp cho một lớp để mã hoá các Script đã viết gọi là EncryptedScript. Các Script sau khi được mã hoá sẽ thực thi nhiệm vụ giống như các Script chưa mã hoá, tuy nhiên không thể xem được mã nguồn của chúng. Và khi một Script đã được mã hoá thì không thể giải mã lại được, vì vậy trước khi mã hoá cần phải sao lưu các Script trước.
Đoạn mã sau sẽ tìm và duyệt qua danh sách các Script, sau đó hỏi có muốn mã hoá các Script không ?
theDocs=av.GetProject.GetDocs
theSEds = {}
‘ lấy danh sách các Script
for each theDoc in theDocs
if (theDOC.GetGUI = "Script") then
theSEds.Add(theDoc)
end
end
‘ thực hiện lặp để mã hoá các Script
for each i in theSEds
‘ xác nhận mã hoá Script
sure = MsgBox.YesNo(" có muốn mã hoá Script "++i.GetName+"?","Mã hoá", False)
if ( Not sure) then
Continue
end
‘ Tạo Script được mã hoá
theScript = EncryptedScript.MakeFromScript(i.GetScript)
‘ gán tên cho Script mã hoá trùng với tên Script chưa mã hoá
theScript.SetName(i.GetName)
‘ thêm Script mã hoá vào đề án
av.GetProject.AddScript(theScript)
‘ xoá Script chưa mã hoá
av.GetProject.RemoveDoc(i)
end
 Các yêu cầu được sử dụng với EncryptedScript
 Yêu cầu Kết quả Ý nghĩa
  • EncryptedScript.Make (someAvenueSourceCode) EncryptedScript Tạo một Script mới được mã hoá với đoạn mã Avenue.
  • EncryptedScript.MakeFromScript (aScript) EncryptedScript Tạo một Script được mã hoá từ một Script có sẵn.

Nguồn:”Bài giảng Lập trình Avenue-Nguyễn Thủy Đoan Trang,Trường đại học Nha Trang”

LEAVE A REPLY

Please enter your comment!
Please enter your name here