2009-10-22 5 views
11

Tôi thường thực hiện các phương pháp nhỏ để hỗ trợ gỡ lỗi, không được sử dụng trong chương trình thực tế. Thông thường hầu hết các lớp của tôi đều có phương thức AsString mà tôi thêm vào đồng hồ. Tôi biết Delphi 2010 có visualizers, nhưng tôi vẫn còn trên 2007.Làm cách nào để buộc trình liên kết bao gồm một hàm tôi cần trong quá trình gỡ lỗi?

Hãy xem xét ví dụ sau:

program Project1; 

{$APPTYPE CONSOLE} 

uses SysUtils; 

type 
    TMyClass = class 
    F : integer; 
    function AsString : string; 
    end; 

function TMyClass.AsString: string; 
begin 
    Result := 'Test: '+IntToStr(F); 
end; 

function SomeTest(aMC : TMyClass) : boolean; 
begin 
    //I want to be able to watch aMC.AsString while debugging this complex routine! 
    Result := aMC.F > 100; 
end; 

var 
    X : TMyClass; 

begin 
    X := TMyClass.Create; 
    try 
    X.F := 100; 
    if SomeTest(X) 
     then writeln('OK') 
     else writeln('Fail'); 
    finally 
    X.Free; 
    end; 
    readln; 
end. 

Nếu tôi thêm X.AsString như một chiếc đồng hồ, tôi chỉ nhận được "Chức năng được gọi là, TMyClass .AsString, đã bị loại bỏ bởi linker ".

Làm cách nào để buộc trình liên kết đưa vào? Thủ thuật thông thường của tôi là sử dụng sử dụng phương thức ở đâu đó trong chương trình nhưng không có cách nào thanh lịch hơn?

TRẢ LỜI: GJ cung cấp cách tốt nhất để làm điều đó.

initialization 
    exit; 
    TMyClass(nil).AsString; 

end. 

Trả lời

6

sveinbringsli hỏi: "Bạn có mẹo nhỏ cho các chức năng đơn vị không?"

Delphi trình biên dịch là thông minh ... Vì vậy, bạn có thể làm một cái gì đó giống như ...

unit UnitA; 

interface 

{$DEFINE DEBUG} 

function AsString: string; 

implementation 

function AsString: string; 
begin 
    Result := 'Test: '; 
end; 

{$IFDEF DEBUG} 
initialization 
    exit; 
    AsString; 
{$ENDIF} 
end. 
+0

+1. Đó là những gì tôi thường làm. Đặt nó trong một khối khởi tạo để nó sẽ không được liên kết. –

+0

Tôi đã chiến đấu với bản thân mình qua câu trả lời tôi nên chấp nhận - câu trả lời này hoặc câu trả lời khác của bạn với "mẹo được xuất bản". Tôi đã chọn cái này vì nó sẽ không ảnh hưởng đến phiên bản phát hành. –

+0

Có, và nếu chức năng của bạn cần một số tham số như biến, chỉ cần viết trong phần khởi tạo: "nếu @AsString = nil sau đó;" thay vào đó, hãy đặt tham số trong. –

6

Bạn có thể đặt chức năng được xuất bản.

TMyClass = class 
    F : integer; 
    published 
    function AsString : string; 
    end; 

Và bật trong 'Xem Properties' 'Cho phép chức năng cuộc gọi'

+0

Tuyệt vời! Tôi không biết rằng các phương pháp đã xuất bản hoạt động theo cách đó. Bạn có một mẹo cho các chức năng đơn vị không? –

+0

Bạn cũng có thể đặt "đã xuất bản" như: {$ IFDEF DEBUG} đã xuất bản {$ ENDIF} –

0

Có lẽ nó hoạt động để gọi cho họ trong một số phần khởi tạo, bảo vệ bởi {ifdef DEBUG} hoặc {IFOPT D +}.

+0

Có, điều này sẽ hiệu quả nhưng tôi muốn tìm cách _doesn't_ yêu cầu tôi thực sự gọi hàm ở đâu đó. –

+0

Tất nhiên sẽ tốt hơn nếu có. Nhưng ít nhất đó là một cách giải quyết không gây gánh nặng cho phiên bản phát hành. (Thủ thuật xuất bản của GJ nào, BTW. :-)) –