2011-09-14 16 views
5

Tôi đang xây dựng một ứng dụng bằng Delphi 7. Tôi đã thêm một nút vào biểu mẫu chính. Trên nút đó, tôi muốn hiển thị một biểu mẫu khác. Tôi đang cố tạo biểu mẫu thứ hai chỉ khi người dùng đã nhấp vào nút đó lần đầu tiên. Nếu người dùng nhấp vào nút đó lần thứ hai thì biểu mẫu đã tạo sẽ được hiển thị. Một đối tượng Form có bất kỳ thuộc tính nào qua đó chúng ta có thể trực tiếp kiểm tra xem nó đã được tạo hay chưa?kiểm tra xem đối tượng được tạo hay không trong delphi

Trả lời

10
if Assigned(Form1) then 
begin 
    //form is created 
end; 

Nhưng nếu mẫu của bạn được khai báo tại địa phương toàn cầu bạn phải chắc chắn rằng nó được khởi tạo nil.

4

Bạn cần một trường thành viên để giữ tham chiếu đến biểu mẫu. Sau đó kiểm tra xem tham chiếu đó có được gán hay không. Như thế này:

function TMainForm.GetOtherForm: TMyForm; 
begin 
    if not Assigned(FOtherForm) then 
    FOtherForm := TMyForm.Create(Self); 
    Result := FOtherForm; 
end; 
+2

(. Tôi chỉ xóa câu trả lời tương tự của tôi) Nhưng cần phải nói thêm rằng hãy chắc chắn để thiết lập lại biến trở về con số không khi phá hủy TOtherForm, giống như đặt TOtherForm: = nil trên OnDestroy của TOtherForm. –

+0

@Hasan Nếu biểu mẫu khác bị xóa. Ấn tượng của tôi là nó có nghĩa là một hình thức sống mãi mãi, một khi nó đã được tạo ra. –

+0

chính xác, nhưng chỉ để yên tâm, để dự đoán kịch bản mà hình thức được xử lý (rõ ràng hoặc vì lý do gì) trong tương lai - vì vậy nó sẽ không giới thiệu 'lỗi mới'. –

2

Đã gán (Obj) vẫn có thể trả về True ngay cả sau khi bạn giải phóng, sử dụng "Obj.free". Cách tốt nhất để đảm bảo obj của bạn là miễn phí, CHO SỬ DỤNG Đã giao (obj) đang sử dụng "FreeAndNil (Obj)"

0

Đôi khi biểu mẫu đã được miễn phí nhưng không phải là không. Trong trường hợp này, việc kiểm tra được giao không phải là quá tốt. Vì vậy, một tùy chọn là để giải phóng biểu mẫu và đặt MyForm: = nil trên biểu mẫu OnClose. tùy chọn khác là sử dụng các proc sau:

function TMyForm.IsFormCreated: bool; 
var i: Integer; 
begin 
    Result := False; 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    if Screen.Forms[i] is TMyForm then 
    begin 
     Result := True; 
     Break; 
    end; 
    end; 
end; 
Các vấn đề liên quan