2008-12-18 2 views
5

Tôi nhân bản một TClientDataSet và tôi muốn sao chép tất cả các trường vào bản sao (đó là một Số liệu mới), tôi biết tôi có thể lặp qua các Trường và sao chép thông tin, hoặc tạo 2 trường hợp của lớp và chỉ sao chép con trỏ, nhưng có cách nào tốt hơn không? Một cái gì đó như tạo một DataSet mới và gán các thông tin lĩnh vực?Có cách nào tốt hơn để sao chép tất cả các Trường Số liệu và thuộc tính của chúng sang một Số liệu khác không?

EDIT:

Phương thức lớp helper sau làm việc cho tôi:

procedure TDataSetHelper.CopyFieldDefs(Source: TDataSet); 
var 
    Field, NewField: TField; 
    FieldDef: TFieldDef; 
begin 
    for Field in Source.Fields do 
    begin 
    FieldDef := FieldDefs.AddFieldDef; 
    FieldDef.DataType := Field.DataType; 
    FieldDef.Size := Field.Size; 
    FieldDef.Name := Field.FieldName; 

    NewField := FieldDef.CreateField(Self); 
    NewField.Visible := Field.Visible; 
    NewField.DisplayLabel := Field.DisplayLabel; 
    NewField.DisplayWidth := Field.DisplayWidth; 
    NewField.EditMask := Field.EditMask; 

    if IsPublishedProp(Field, 'currency') then 
    SetPropValue(NewField, 'currency', GetPropValue(Field, 'currency')); 

    end; 
end; 

Bất cứ ai cũng có một cách tốt hơn để làm điều này?

Trả lời

4

Bạn đang tìm kiếm một cách thẩm mỹ hơn để làm điều đó hay cách làm nhanh hơn?

Nếu trước đây, hãy tạo các lớp của riêng bạn ẩn vòng lặp.

Nếu sau này, đừng lo lắng về điều đó. Một coder rất khôn ngoan đã từng nói với tôi: chi phí truy cập đĩa; chi phí truy cập mạng; có thể chi phí truy cập màn hình; mọi thứ khác đều miễn phí.

Đừng nhầm lẫn kích thước của mã nguồn với thời gian thực thi. Lặp lại hàng nghìn lần thông qua bộ nhớ và bit sao chép là không thể phát hiện được so với cái bắt tay ban đầu của một kết nối cơ sở dữ liệu.

Cheers

1

CloneCursor sẽ làm việc cho bạn?

7

Nếu bạn chỉ muốn sao chép các định nghĩa lĩnh vực bạn có thể làm như sau:

ds2.FieldDefs.Assign(ds1.FieldDefs); 
ds2.CreateDataSet; 
ds2.Open; 

Tất nhiên điều này giả định bạn đã tạo FieldDefs cho DS1.

+0

Nó không hoạt động như tôi mong đợi, một số thuộc tính như "tiền tệ" không được sao chép vào tập dữ liệu mới, tôi muốn giữ tất cả các thiết lập của Field trong DataSet nhân bản. –

2

Nếu bạn đang đi để lặp qua các số liệu để tạo một bản sao, hãy nhớ gọi DisableControls vào nó trước, và EnableControl sau đó.

Nếu không có điều đó, mọi thứ có thể rất chậm nếu bạn có các điều khiển trực quan hiển thị dữ liệu của tập dữ liệu trên biểu mẫu của bạn.

-2

KHÔNG THỂ LẬP TRÌNH PHƯƠNG PHÁP

  • TClientDataSet đầu tiên: mở lĩnh vực biên tập. thêm tất cả các trường nếu chưa được hiển thị. chọn tất cả các trường. sao chép vào clipboard.

  • tclientdataset thứ hai: trình chỉnh sửa trường mở. dán clipboard trong trình chỉnh sửa trường. được thực hiện

bây giờ bạn sẽ thấy trường giống hệtMặc định cho cả hai bộ nhớ tclientdatasets bây giờ.