2009-07-15 30 views
5

Bất kỳ ai biết điều gì khác biệt về xử lý "với" của Delphi 2009?Delphi 2009 Xử lý với

Tôi đã khắc phục sự cố ngày hôm qua chỉ bằng cách giải mã "với" thành tham chiếu đầy đủ, như trong "với Datamodule, Dataset, MainForm". Delphi 2006 và trước đó đã áp dụng "Close" cho Dataset. Delphi 2009 áp dụng "Close" cho MainForm và thoát khỏi ứng dụng!

+1

+1 Câu hỏi được tạo thủ công để gợi ra một số câu trả lời thực sự tuyệt vời! – Argalatyr

Trả lời

16

Không có gì thay đổi. Quan sát trước của bạn đã sai. Các đối tượng được đề cập trong câu lệnh with được coi là "từ phải sang trái", vì vậy trong ví dụ của bạn, MainForm sẽ được tìm kiếm trước, sau đó Dataset và sau đó Datamodule. Đó là cách nó luôn luôn được. Giống như khi bạn viết điều này:

with Datamodule do 
    with Dataset do 
    with MainForm do begin 
     Close; 
    end; 

Hãy tiếp tục và kiểm tra tài liệu Delphi 2006; cần có một phần có tên là Tuyên bố và tuyên bố, theo đó bạn sẽ tìm thấy Báo cáo có cấu trúc, bao gồm phần trên Với tuyên bố.

Tự làm ơn và không sử dụng with. Nó gây ra không có kết thúc của sự cố cả trong quá trình gỡ lỗi và trong thời gian bảo trì, nơi bảo trì thậm chí có thể được thực hiện bởi những người đã viết mã chỉ ngày hôm trước.

+0

Hmmm ... Tôi đã kiểm tra phiên bản 2/7/2006 của đơn vị so với phiên bản 6/2/2009 và tôi thực sự đã thêm MainForm. Vì vậy, nó không phải là khác nhau trong D2006 sau khi tất cả. – user122603

+0

Vậy bạn nên làm gì? Nếu người ta đang sử dụng "với DBComponent.DataSource.DataSet làm" nên giới thiệu một biến địa phương để giữ tham chiếu? –

+1

Có, @Larry. Ví dụ: 'var dset: TDataset; dset: = DBComponent.DataSource.Dataset; dset.foo; dset.bar; ' –

3

Sử dụng with A,B,C,D là thực tiễn không tốt do thay đổi đối với các đơn vị khác đột nhiên có thể khiến mã của bạn ngừng hoạt động như mong đợi. Xem here để biết thêm thông tin hoặc here (tìm kiếm "with keyword").

11

With là điều xấu. Tôi không biết bao nhiêu lần tôi cần phải nói điều này, nhưng dường như chúng tôi chưa có.

Chỉ có thể sử dụng "an toàn" với các đối tượng không bao giờ thay đổi. Nếu bạn áp dụng nó cho các đối tượng bạn xác định trong dự án của riêng bạn, tất cả các cược sẽ tắt và tôi muốn thay vì bạn chỉ sử dụng các phần "nếu Random (50) < 25" để thực thi mã của bạn, ít nhất là tài liệu được thực thi một cách kỳ lạ.

Vấn đề là khi bạn bắt đầu lộn xộn với một đối tượng, giới thiệu các phương pháp hoặc thuộc tính mới hoặc đổi tên cũ, tất cả các câu lệnh with hiện có có thể thay đổi ý nghĩa. Và không phải trong "Cảnh báo: Gọi đến phương thức mơ hồ" thay đổi. Mã sẽ chỉ làm một cái gì đó khác với nó trước đây. Mà không nói với bạn về nó.

Ví dụ, chúng ta hãy giả sử bạn có điều này:

with connection, file do 
begin 
    Close; 
end; 

sau đó những gì bạn mong đợi xảy ra? Vâng, nó là tự nhiên để đóng một tập tin, vì vậy tôi mong đợi tập tin sẽ được đóng lại. Giả sử rằng biến tệp này chứa một đối tượng kiểu TSomeOddFile không định nghĩa phương thức Close, mà là một phương thức CloseFile. Câu lệnh With ở trên sẽ đóng kết nối thay thế.

Tất cả tốt, được ghi lại, không ai viết đoạn mã này nghĩ rằng tệp sẽ bị đóng, sau khi tất cả, phương thức được đặt tên là CloseFile cho đối tượng đó, đó chỉ là giả định của tôi là sai và tôi không làm việc dự án. Chưa.

Và sau đó ai đó sửa lỗi đó, đổi tên CloseFile thành Đóng. Đoạn mã trên sẽ âm thầm bắt đầu đóng tập tin thay vì kết nối. Không có cảnh báo, không có lỗi, biên dịch cũng tốt như trước khi bạn thay đổi tên phương thức.Chạy tốt như thế^h^h^h, không đợi, nó sẽ không.

Vì vậy, yeah, with sẽ cắn bạn trong **.

+1

+1, đôi khi nhận ra mức độ xấu với chỉ có thể đến từ trải nghiệm. – skamradt

+2

Vâng, học tập được cho là hoạt động bằng cách được kể về kinh nghiệm, để bạn không phải tự mình trải qua nó. WITH đã đốt cháy rất nhiều giờ cho tôi cho đến khi tôi phát hiện ra một đống hấp của .... nó thực sự là. –

3

Trình biên dịch thường khá chắc chắn, vì vậy tôi sẽ không giả định lỗi hoặc thay đổi trước khi bạn thực sự loại trừ mọi thứ khác. Một số điều tôi có thể nhanh chóng nghĩ đến:

1) Hãy xem liệu bạn có sử dụng các hàm hoặc toán tử quá tải hay không. Vì định nghĩa của STRING (và một số loại khác) đã thay đổi, một biến thể khác có thể được chọn, bởi vì chữ ký có hiệu quả thay đổi.

2) nó cũng có thể là một số đơn vị bao gồm bây giờ xác định một định danh đã được sử dụng, và được ưu tiên hơn một trong những tiếp xúc trong một đơn vị khác nhau.

Nếu không, bắt đầu cách ly mã trong ví dụ tối thiểu, sử dụng càng ít đơn vị càng tốt. Thực hiện từng bước, vì mẹo là thay đổi cuối cùng khi hành vi thay đổi.

Đăng (hoặc URL) ở đây, nó luôn thú vị để xem.

+0

+1 để thực sự trả lời câu hỏi thay vì lặp lại rằng câu lệnh cùng không nên được sử dụng. –

1

Với ..do sẽ được sử dụng cẩn thận. Nếu không, là một nguồn đau đầu vô hạn .... Tôi đồng ý với Rob Kennedy và những người khác.

Như Craig Stuntz (in other post about with..do) và Lasse V. Karlsen trên cho biết, with..do có thể tạo ra rất nhiều bẫy.

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