2012-01-02 28 views
5

Tôi có một hoạt động nhất định trong một lớp học rất tốn kém. (trên thứ tự khoảng 8 giây để chạy hoàn toàn) Vì vậy, bây giờ tôi đã quyết định nó có lẽ nên chạy ở đầu chương trình trong một màn hình "khởi tạo". Tôi không thể tìm thấy bất cứ nơi nào trong Delphi chỉ ra rằng có một điều như một lĩnh vực tĩnh tuy nhiên.Làm thế nào để có được tương đương với một trường tĩnh (lớp) trong Delphi?

Những gì tôi về cơ bản cần làm là tải một danh sách các bản ghi và giữ chúng sống trong suốt vòng đời của chương trình. Cách tốt nhất để làm điều này trong Delphi là gì?

tôi sẽ làm điều này trong C# khá đơn giản:

class Foo{ 
    static List<...> Bar; 
} 

Tuy nhiên trong Delphi, Tôi không nhìn thấy bất cứ điều gì để tạo ra một trường tĩnh. Tất cả những gì tôi thấy là từ khóa class để tạo phương thức tĩnh

+0

Trong Delphi hiện đại, bạn có thể sử dụng 'lớp var' để có tương đương với các trường thành viên tĩnh, nhưng trong Delphi 7 bạn cần sử dụng một biến toàn cầu. –

+0

Phương thức 'lớp' và phương thức' tĩnh' tương tự nhau, nhưng hơi khác nhau.Các phương thức 'class' nhận lớp mà chúng được gọi là tham số ngầm, tương tự như cách các cá thể của phương thức nhận được cá thể. Các phương thức 'static' không nhận được tham số như vậy. Các phiên bản cũ của Delphi chỉ có các phương thức 'class', nhưng tôi nghĩ các phiên bản mới hơn cũng có các phương thức' static' để tăng khả năng tương thích .net. – CodesInChaos

+0

@CodeInChaos Tôi không biết rằng [phân biệt] (http://docwiki.embarcadero.com/RADStudio/en/Methods#Class_Methods). Nó khá là bí truyền vì tương đương với tham số 'Self' của một phương thức lớp là khá dễ dàng trong phương thức' static'. Nhưng việc sử dụng 'Self' không tránh lặp lại bản thân bạn. P.S. Bạn đúng là D7 không có 'class var' và tôi định bình luận về hiệu ứng đó trong câu trả lời ban đầu của bạn nhưng chỉnh sửa thời gian gia hạn của bạn đã xóa nó! –

Trả lời

5

Bạn chỉ có thể sử dụng biến toàn cục. Thêm nó vào phần implementation của một đơn vị để đặt địa phương vào đơn vị đó.

Turbo Delphi của tôi hỗ trợ class var x:integer;, nhưng tôi khá chắc chắn Delphi 7 không.

3

Bạn sẽ cần phiên bản Delphi mới hơn nếu bạn muốn thực tế.

Tuy nhiên, pascal luôn có phạm vi tương tự, nhưng bạn nên (với một chút tưởng tượng) xem đơn vị là lớp cuối cùng tĩnh.

Các hàm và biến được công khai được xác định trong phần giao diện và các công cụ riêng được xác định trong phần triển khai. Tất cả những thứ này ít nhiều tương đương với các biến lớp và các phương thức lớp.

Nếu bạn đặt tên bộ nạp đơn vị.pas và bạn xác định hàm "init" trong phần giao diện, bạn thậm chí có thể gọi nó như thể đó là hàm lớp: loader.init().

Phần khởi tạo và hoàn tất tương đương với hàm tạo lớp và lớp hủy.

Những gì tôi mô tả ở trên có ý nghĩa từ turbo plascal cho đến khi delphi 2007 (tôi nghĩ rằng biến lớp đã được giới thiệu trong d2009). Tất cả trong tất cả các lời khuyên tôi chỉ để có được một delphi mới hơn.

+1

Turbo Delphi có các lọai lớp, và nó dựa trên delphi 2006. – CodesInChaos

4

Tôi nghĩ đây là thời điểm tốt để sử dụng initializationfinalization ở Delphi. Điều này đi vào cuối của một đơn vị, ngay trước end. Bạn có thể sử dụng nó để tạo/trường toàn cầu miễn phí như thế này, hoặc chỉ cần đặt biến mặc định ...

unit Unit1; 

interface 

uses 
    Classes; 

function MyList: TStringList;  

implementation 

var 
    GMyList: TStringList; 

function MyList: TStringList; 
begin 
    Result:= GMyList; 
end; 

initialization 
    GMyList:= TStringList.Create; 
    MyList.Append('Value 1'); 
    MyList.Append('Value 2'); 
    MyList.Append('Value 3'); 

finalization 
    GMyList.Free; 

end. 

chỉ này kêu gọi các tình huống đặc biệt như thế này. MyList sẽ vẫn hoạt động trong suốt thời gian đăng ký của bạn.

Lưu ý cách GMyList được khai báo bên dưới implementationMyList thực sự là chức năng toàn cầu để truy cập GMyList. Điều này là để tránh các bài tập tình cờ và như vậy. Từ bất kỳ đơn vị nào khác, bạn có thể truy cập GMyList bằng cách sử dụng chức năng MyList, nhưng sẽ không thể truy cập trực tiếp GMyList (đó là những gì bạn muốn tránh lỗi).

+1

Gợi ý: di chuyển MyList để triển khai và hiển thị nó thông qua một hàm để bảo vệ nó khỏi truy cập ghi ngẫu nhiên. (Thêm/thay đổi các mục vẫn có thể, nhưng mã độc/mã lỗi không thể chỉ định lại nó) – mjn

+0

@mjn ý tưởng hay và hoàn thành. –

+1

Tiền tố F là dành cho thành viên, G sẽ phù hợp hơn –

Các vấn đề liên quan