2011-10-16 34 views
8

Tôi mới trong bối cảnh lập trình Delphi và tôi gặp sự cố khi gọi thủ tục trong quy trình trong ứng dụng bảng điều khiển của mình.Cách sửa tham chiếu vòng tròn thủ tục?

Ứng dụng đơn giản của tôi là dành cho khoảng không quảng cáo mục chạy qua máy chủ telnet trên cửa sổ. Tôi đang sử dụng một thinkpad cũ như Linux chạy trên máy tính của mình và một máy khách telnet.

Sử dụng Delphi XE Tôi đã gặp phải tình trạng gà hoặc trứng.

Tôi nhận được màn hình cảm ứng không khai báo thêm màn hình ... nó được khai báo nhưng dưới màn hình chính !!! Nếu tôi đặt thủ tục addscreen trên màn hình chính, bất kỳ cuộc gọi đến màn hình chính nào trong quy trình thêm màn hình đều làm cho tôi một lỗi không được khai báo màn hình chính thụt lề!

Trong thuật ngữ đơn giản, làm cách nào để thực hiện quy trình gọi ở mọi nơi trong chương trình?

Tôi đã thử giao diện và triển khai nhưng không hợp lệ trong chương trình ứng dụng bảng điều khiển!

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, windows, messages, Console in 'Console.pas'; 


procedure mainscreen; 
var 
    choice: string; 
begin 
    clrscr; 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(' |          Inventory Management 0.1 ALPHA               |'); 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(' Make a choice: Add(a), Remove(r), Edit(e), Backup Database(bd), Mass Add(ma), Mass Remove(mr)'); 
    writeln('?:'); 
    readln(choice); 

    if choice = 'a' then 
    addscreen 
    else 
    mainscreen; 
end; 

procedure addscreen; 
var 
    choice: string; 
begin 
    clrscr; 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(' |              Add an Item               |'); 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(' Not yet ready!'); 
    writeln(' Press any key to return to the main menu...'); 
    readln(choice); 

    mainscreen; 
end; 

begin 
    mainscreen; 
    textbackground(black); 
    textcolor(lightgray); 
    ExitProcess(0); 
end. 

Cảm ơn bạn rất nhiều!

+0

Bạn nên di chuyển mã 'màn hình chính' vào chương trình 'chính' và di chuyển các câu lệnh khác vào vòng lặp 'lặp lại'. –

Trả lời

13

Trình biên dịch chuyển qua tệp từ trên xuống dưới. Tại thời điểm cần xử lý cuộc gọi đến addscreen, bạn chưa khai báo addscreen.

Vì bạn có tham chiếu vòng tròn (addscreen gọi mainscreen và ngược lại), bạn cần phải phá vỡ điều đó với cái được gọi là tham chiếu chuyển tiếp. Thêm dòng này trước khi mainscreen

procedure addscreen; forward; 

Vì vậy, việc tổ chức các mã sẽ giống như thế này:

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

Nếu bạn không có một tham chiếu vòng tròn sau đó bạn chỉ có thể sắp xếp lại các thủ tục để các addscreen là được khai báo trước mainscreen.

+3

Cảm ơn bạn! Sau nhiều lần tìm kiếm không thành công của Google, tôi cuối cùng cũng có được câu trả lời đúng trên stackoverflow! Cảm ơn nhiều! – ELCouz

+1

Và lần tiếp theo bạn tìm kiếm câu hỏi này, bạn sẽ thấy Google liệt kê câu hỏi của bạn và câu trả lời của David về lưu lượng truy cập. – lkessler

+0

Tham chiếu thông tư có thể không phải là cách tốt nhất để làm điều đó nhưng nó tránh sự cần thiết của một vòng lặp trong mã chính. Trong thực tế, phần chính được sử dụng chỉ để gọi thủ tục đầu tiên sau đó lặp lại xung quanh trong thủ tục khác. Khó đọc, mã hóa spaghetti nhưng nó hoạt động! Cảm ơn một lần nữa! – ELCouz

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