2011-07-27 26 views
6

Tôi có một biểu mẫu chính (MainForm) và một cửa sổ con MDI (TFormChild). Tôi muốn tạo nhiều biểu mẫu TFormChild, nhưng biểu mẫu đầu tiên phải hoạt động theo một cách nhất định vì vậy tôi cần phát hiện xem có cửa sổ TFormChild đã tồn tại chưa.Cách kiểm tra xem cửa sổ con có tồn tại không?

tôi sử dụng mã này, nhưng nó không làm việc:

function FindChildWindowByClass(CONST aParent: HWnd; CONST aClass: string): THandle; 
begin 
    Result:= FindWindowEx(aParent, 0, PChar(aClass), NIL); 
end; 

Tôi gọi nó là như thế này:

Found:= FindChildWindowByClass(MainForm.Handle, 'TFormChild')> 0; 
+0

Tại sao bạn thử nghiệm '> 0'? Chắc chắn logic chính xác là '<> 0'. Không phải đó là vấn đề của bạn, chỉ là một bên. –

+0

@David, như của Delphi 4, với sự ra đời của một loại số nguyên không dấu 32 bit, xử lý trong Delphi được unsigned, do đó, nó về mặt kỹ thuật làm cho không có sự khác biệt. –

+2

@Rob Tôi biết nó không tạo ra sự khác biệt nào về hành vi, nhưng về mặt logic thì nó rất khác. '> 0' ngụ ý rằng thứ tự là quan trọng. '<> 0' chỉ ra rằng' 0' là một giá trị sentinel. –

Trả lời

7

Gọi nó như

Found:= FindChildWindowByClass(MainForm.ClientHandle, 'TFormChild')> 0; 

cửa sổ MDI con là con cái của 'MDICLIENT', ClientHandle tài sản của TCustomFrom nắm cán.

+0

Tôi chấp nhận câu trả lời của bạn bởi vì nó trả lời câu hỏi của tôi một cách cụ thể. Tuy nhiên, tôi cũng muốn đưa tín dụng cho Hasan vì tôi sẽ sử dụng giải pháp giống Delphi hơn. – Ampere

+2

@Altar - Bạn đã đặt câu hỏi rõ ràng cho cả câu trả lời này và câu trả lời của Hasan. Bạn có thể chấp nhận cái nào phù hợp hơn. Tôi không sao nếu bạn bỏ phiếu cho câu trả lời này. :) –

13

Trong một biểu mẫu, bạn có thể tham khảo các thuộc tính MDIChildCount và MDIChildren.

ví dụ:

var 
    i: integer; 
begin 
    for i:= 0 to MainForm.MDIChildCount-1 do 
    begin 
    if MainForm.MDIChildren[i] is TFormChild then 
    ... 
    end; 
    ... 
end; 
+0

+1; nhưng không đủ để kiểm tra 'nếu MainForm.MDIChildCount> 0 rồi' nếu OP muốn đợi cho việc tạo biểu mẫu đầu tiên? –

+0

@daemon_x có thể có các con MDI của một lớp khác nhau –

+0

@David - Tôi nhận được câu 'Tôi muốn tạo nhiều dạng TFormChild, nhưng cái đầu tiên phải hoạt động theo một cách nào đó vì vậy tôi cần phải phát hiện nếu một cửa sổ TFormChild đã tồn tại 'như OP chỉ tạo các cửa sổ TFormChild và anh ấy muốn kiểm tra xem cửa sổ đầu tiên đã được tạo chưa, nhưng ai biết được .. –

3

Cách tốt nhất để thực hiện việc này là có biểu mẫu bạn muốn mở thực sự kiểm tra xem nó có tồn tại không. Để làm như vậy, biểu mẫu của bạn phải khai báo một thủ tục lớp. Khai báo như là một thủ tục lớp, proc có thể được gọi bất kể biểu mẫu tồn tại hay không.

Thêm vào phần nào của hình thức của bạn

class procedure OpenCheck; 

thì thủ tục sẽ như thế này

Class procedure TForm1.OpenCheck; 
var 
f: TForm1; 
N: Integer; 
begin 
    F := Nil; 
    With Application.MainForm do 
    begin 
     For N := 0 to MDIChildCount - 1 do 
     begin 
     If MDIChildren[N] is TForm1 then 
      F := MDIChildren[N] as TForm1; 
     end; 
    end; 
    if F = Nil then //we know the form doesn't exist 
     //open the form as the 1st instance/add a new constructor to open as 1st 
    else 
     //open form as subsequent instance/add new constructor to open as subsqt instance 
end; 

Thêm đơn vị Form1 để khoản sử dụng của mdiframe của bạn.

Để mở biểu mẫu, hãy gọi thủ tục lớp học của bạn, lần lượt sẽ gọi hàm tạo của biểu mẫu.

TForm1.OpenCheck; 

Một cảnh báo sử dụng thủ tục lớp học, không truy cập bất kỳ thành phần/thuộc tính nào của biểu mẫu. Vì biểu mẫu không thực sự phải được khởi tạo, việc truy cập chúng sẽ tạo ra một sự vi phạm truy cập/cho đến khi bạn biết F không phải là không. Sau đó, bạn có thể sử dụng F. để truy cập các thành phần/thuộc tính biểu mẫu.

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