2008-11-07 28 views

Trả lời

6

Có. Nó là không thể trừ khi bạn loại bỏ các thuộc tính không được xuất bản trong Delphi 2007 từ DFM.

+0

Bạn đã thử trả lời của tôi? Nó dường như làm việc cho tôi, với caveat như đã đề cập - D2009-cụ thể tài sản không được lưu lại .dfm trong D2007 - nhưng miễn là bạn không sửa đổi và tái lưu các hình thức trong D2007 họ ít nhất sẽ được giữ. –

+0

Tôi đoán nó là có thể, chỉ cần không phải là rất thực tế –

2

Mỗi biểu mẫu có tệp dfm chứa các cài đặt thuộc tính của biểu mẫu và các thành phần của nó. Một số giá trị thuộc tính có mặc định để chúng không được lưu trữ nếu giá trị mặc định được giữ. là chỉ cần làm một thử nghiệm nhỏ:

  • Tạo một hình thức trong năm 2009
  • Thêm một vài điều khiển tiêu chuẩn
  • Lưu nó
  • mở nó vào năm 2006 (xin lỗi không năm 2007 về pc này)

Và nó hoạt động mà không có thư. Nhưng có lẽ bạn không may mắn như vậy.

Với Delphi, thường hơi rắc rối khi chia sẻ dữ liệu giữa các phiên bản. Nâng cao vị thế là tuyệt vời, nhưng hạ cấp là phiền hà. Vì vậy, tôi khuyên bạn không nên chia sẻ các tệp biểu mẫu giữa các phiên bản khác nhau.

Theo như tôi biết, không thể thêm định nghĩa có điều kiện vào tệp dfm. Nhưng sau đó một lần nữa, chúng ta thực sự muốn điều đó ... Tôi thích một cơ chế bỏ qua những đặc tính không rõ.

4

Dự án Delphi luôn vô cùng dễ dàng để chuyển tiếp các phiên bản mới. Bạn phải cẩn thận hơn, nhưng việc sử dụng mã hiện tại với các trình biên dịch cũ hơn là khá thẳng về phía trước. Tôi đã duy trì mã trong Delphi 2005/2006/2007 rằng những người khác vẫn cần sử dụng trong Delphi 6 và 7.

Nếu bạn loại bỏ các thuộc tính không tương thích khỏi DFM, chúng sẽ hoạt động bình thường trong các phiên bản cũ hơn mà không làm rối chúng lên cho Delphi 2009. Ví dụ lớn nhất là các thuộc tính * rõ ràng được giới thiệu trong Delphi 2006. Tôi có một nhà sản xuất bia "DFM scrubber" để loại bỏ chúng. Hãy nhớ rằng, các thuộc tính này tồn tại vì một lý do, vì vậy bạn chỉ nên chà những thuộc tính mà bạn có ý định tương thích ngược.

Bạn cũng có thể xem xét đầu tư vào các công cụ phân tích mã tĩnh như CodeHealer hoặc Pascal Analyzer. Trên đầu trang chỉ ra các vấn đề (đặc biệt là CodeHealer) và giúp bạn dọn sạch mã của mình, bạn có thể chọn phiên bản Delphi nào để phân tích, làm cho việc tìm kiếm không tương thích ngoài DFM trở nên dễ dàng hơn. Và chúng có thể được tự động hóa như là một phần của quá trình xây dựng của bạn.

Chỉ cần lưu ý. Chia sẻ mã nguồn, nhưng giữ các dự án riêng biệt cho từng phiên bản. Điều này đặc biệt quan trọng giữa Delphi 2007 và Delphi 2009. Tệp .dproj gần đây hơn sử dụng cùng một phần mở rộng, nhưng không tương thích với Delphi 2007. Bạn có thể chạy vào một số problame với các tài nguyên không tương thích.

+0

Tôi không đồng ý rằng các dự án Delphi cổng dễ dàng. Tôi đã thực hiện di chuyển trong quá khứ và có vẻ như hầu hết các thành phần/điều khiển cần ít nhất là nhỏ, thường là những thay đổi lớn. Điều này so với nói rằng một dự án trong C# thực hiện trong Visual Studio là tồi tệ hơn nhiều. –

+0

Kinh nghiệm của bạn đã khác với tôi, sau đó. Kể từ Delphi 1, tôi không nghĩ rằng tôi đã làm việc trên một dự án duy nhất mà đã không được di chuyển ít nhất một lần. Điều này gần như luôn luôn rất thẳng về phía trước. Tôi thậm chí có thể biên dịch lại một vài trong số chúng trong các phiên bản trước. –

+0

Các vấn đề tôi đã có được giới hạn trong mã của tôi để giải quyết các lỗi VCL. Sau đó, khi một phiên bản mới xuất hiện, đôi khi tôi phải hoàn tác các giải pháp và sau đó tìm và triển khai các bản sửa lỗi cho tất cả các lỗi VCL mới. Nhưng khả năng tương thích cơ bản từ phiên bản này sang phiên bản khác là tuyệt vời ở Delphi. –

2

Bạn có thể thêm một cách an toàn các thuộc tính trong mã trong phương thức OnCreate của bạn cho biểu mẫu và quấn {$ IFDEF VER200} // ĐẶC TÍNH MỚI {$ ENDIF} xung quanh chúng. Bạn có thể để DoubleBuffered bên ngoài ifdefs, vì nó đã có mặt trong Delphi 2007, không có sẵn cho thanh tra thuộc tính.

Bạn sẽ CHỈ phải lo lắng về các thuộc tính bạn đặt khác với mặc định. Đối với doublebuffered, bạn chỉ cần lo lắng về điều này nếu nó được thiết lập là true.

Khi tải biểu mẫu Delphi 2009 trong Delphi 2007, bạn sẽ nhận được cảnh báo rằng thuộc tính sẽ bị hủy, chỉ cần lưu ý các thuộc tính đó, vì đó là những thuộc tính bạn cần xử lý.

Tôi đang sử dụng một phương pháp như vậy để chuyển mã của tôi sang Delphi 2009 từ Delphi 2006. Hầu hết các dự án của tôi chứa một số đơn vị dùng chung và phải biên dịch trong Delphi 2006 cho phiên bản vận chuyển và Delphi 2009 cho bản phát hành tiếp theo. Tôi cũng sử dụng rất nhiều {$ IFDEF UNICODE} xác định nơi tôi cần đảm bảo một chuỗi là widestring, hoặc ansistring tùy thuộc vào thói quen.

14

DoubleBuffered đã có trong TWinControl một thời gian. Sự khác biệt trong Delphi 2009 là nó được xuất bản ngay bây giờ. Nếu bạn có thể sống với chỉ bỏ qua các lỗi (và không thực hiện các tính chất làm việc thay vì), đây là một giải pháp khả thi:

unit Delphi2009Form; 

interface 

uses 
    Windows, Classes, SysUtils, Controls, Forms; 

type 
{$IFDEF VER200} 
    TDelphi2009Form = class(TForm); 
{$ELSE} 
    TDelphi2009Form = class(TForm) 
    private 
    procedure ReaderError(Reader: TReader; const Message: string; var Handled: Boolean); 
    protected 
    procedure ReadState(Reader: TReader); override; 
    end; 

    TReaderErrorProc = procedure(const Message: string); 

var 
    ReaderErrorProc: TReaderErrorProc = nil; 
{$ENDIF} 

implementation 

{$IFNDEF VER200} 
type 
    THackReader = class(TReader); 

procedure TDelphi2009Form.ReaderError(Reader: TReader; const Message: string; var Handled: Boolean); 
begin 
    with THackReader(Reader) do 
    Handled := AnsiSameText(PropName, 'DoubleBuffered') or AnsiSameText(PropName, 'ParentDoubleBuffered'); 
    if Handled and Assigned(ReaderErrorProc) then 
    ReaderErrorProc(Message); 
end; 

procedure TDelphi2009Form.ReadState(Reader: TReader); 
begin 
    Reader.OnError := ReaderError; 
    inherited ReadState(Reader); 
end; 
{$ENDIF} 

end. 

Sau đó thay đổi tờ khai trong các hình thức trong dự án của bạn để kế thừa từ TDelphi2009Form, ví dụ như:

type 
    TFormMain = class(TDelphi2009Form) 
    ... 

Điều này sẽ hoạt động khi chạy - lỗi tài sản sẽ bị bỏ qua. Để làm cho nó làm việc lúc thiết kế cũng vậy, tạo ra một gói phần mềm thiết kế chỉ, thêm designide.dcp để đòi hỏi của nó khoản, và thêm các đơn vị sau đây với nó:

unit Delphi2009FormReg; 

interface 

uses 
    Delphi2009Form; 

procedure Register; 

implementation 

uses 
    DesignIntf, DesignEditors, ToolsAPI; 

procedure ShowReaderError(const Message: string); 
begin 
    with BorlandIDEServices as IOTAMessageServices do 
    AddTitleMessage(Message); 
end; 

procedure Register; 
begin 
    RegisterCustomModule(TDelphi2009Form, TCustomModule); 
    ReaderErrorProc := ShowReaderError; 
end; 

initialization 

finalization 
    ReaderErrorProc := nil; 

end. 

Cài đặt gói trong Delphi 2007 IDE và tài sản lỗi cho các thuộc tính DoubleBuffered và ParentDoubleBuffered sẽ bị bỏ qua tự động khi mở các biểu mẫu của bạn trong IDE. Các giá trị của các thuộc tính sẽ bị mất khi bạn lưu biểu mẫu trong Delphi 2007, do đó bạn nên khởi tạo chúng trong mã thay thế.

EDIT: Tôi đã thêm mã để đầu ra các thông báo lỗi độc giả vào cửa sổ tin nhắn IDE:

IDE error messages

+0

+1 cho quan sát đơn giản rằng tài sản tồn tại trước D2009. Tôi không biết điều đó. Bây giờ tôi có thể sửa một số vấn đề với việc chỉ bật nó vào lúc tải, trong FormCreate. Rất hữu ích! –

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