2011-07-27 13 views
5

Tôi đang làm việc để hiện đại hóa và sửa lỗi trong codebase của một chương trình 4 thời đại Delphi được viết bởi người khác. Rất nhiều mã là đáng sợ theo tiêu chuẩn hiện đại, và tôi không thể không tự hỏi nếu một số điều tôi thấy là có bởi vì tác giả ban đầu không biết về các tính năng thư viện chuẩn nào đó, hoặc nếu họ bị ' t có sẵn.Các phương pháp Tìm và Định vị của TDataset có ở đâu?

Một trong những "mô hình" đáng ghét càng thấy trên tất cả các ứng dụng trông như thế này:

table := TClientDataset.Create; 
with table do 
begin 
    CloneCursor(dmDatabase.OriginalTable, false, true); 
    filtered := true; 
    active := true; 
    first; 
    while not EOF do 
    begin 
    if fieldByName('whatever').AsString = 'some criteria' then break; 
    next; 
    end; 
    if EOF then exit; 
    //do something based on the current row of the dataset 
    table.free; 
end; 

Hầu như mỗi người trong các nhóm này có thể được thay thế bằng một cuộc gọi một dòng hoặc là Lookup hoặc Locate trên tập dữ liệu gốc, không cần CDS trung gian. Điều đó khiến tôi tự hỏi, liệu những phương pháp này có sẵn trong những ngày D4 không? Lần đầu tiên được thêm LookupLocate?

+0

Nếu không tìm thấy 'một số tiêu chí' thì 'bảng' không được giải phóng? – JRL

+0

@ Jrl: Giống như tôi đã nói, một số mã này rất đáng sợ theo tiêu chuẩn hiện đại. : P Nhưng về cơ bản nó đã được tái tạo thành một mẫu chung từ bộ nhớ. các khối thử cuối cùng có thể hoặc không thực sự có mặt. Có một số, nhưng không gần như nhiều như có nên. –

+1

Điều này trông giống như mã được viết bởi một người đã học đủ delphi để hoàn thành công việc và biết chính xác một (cách thức vũ phu) để làm việc. Ngay cả trong Delphi 1, ông có thể đã viết một hàm trợ giúp, và tránh sao chép-dán-bệnh. –

Trả lời

6

Tra cứu và định vị được giới thiệu ở Delphi 2. Có vẻ như tác giả gốc đã không tận dụng lợi thế của chúng.

+3

+1; File D2-CS-2.0 \ SOURCE \ VCL \ DB.PAS: 810 function Định vị (const KeyFields: string; const KeyValues: Biến thể; –

+5

@Jeroen: * TẠI SAO * bạn có nguồn VCL cho Delphi 2 đủ tiện dụng để tìm kiếm không theo cách như vậy? 'D-:' – afrazier

+7

@afrazier: không phải tất cả mọi người? :) –

6

Dường như lập trình viên ban đầu muốn đảm bảo rằng con trỏ hàng không bị thay đổi . Làm Locate (hoặc Lookup) sẽ thay đổi con trỏ hàng, kích động tất cả các loại của sự kiện dữ liệu (Datasource.OnDataChange, Dataset.AfterScroll và vv).

Thực hiện tìm kiếm với TClientDataset.CloneCursor, không có sự kiện nào trong số những sự kiện này được kích hoạt trên dmDatabase.OriginalTable và không cần phải tải lại dữ liệu từ cơ sở dữ liệu.

Dường như với tôi đó là ý định. TClientDataset đã được trình bày trên D3. Và các con trỏ được nhân bản là một loại tính năng nâng cao - và cần dmDatabase.OriginalTable cũng là một CDS.

+1

Tôi có thể sử dụng DisableControls/EnableControls và đánh dấu thay vì nhân bản con trỏ cho mỗi thao tác như thế này. –

+0

'Lookup' không thay đổi con trỏ hàng. 'Locate', nhưng trong một vài trường hợp, điều này xảy ra trên tập dữ liệu gốc, không có CDS /' CloneCursor', và về cơ bản nó là một reimplementation của 'Locate'. –

+1

Nhưng tại sao họ không sử dụng 'Locate' hoặc' LookUp' trên bản sao? –

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