2010-09-01 24 views
17

Tôi có hai chương trình Delphi7: máy chủ tự động hóa COM (EXE) và chương trình khác đang sử dụng máy chủ tự động hóa.Cách sử dụng mảng biến thể trong Delphi

Tôi cần chuyển một mảng byte từ chương trình này sang chương trình khác.

Sau một số tìm kiếm tôi đã thấy rằng việc sử dụng mảng biến thể là cách để đi (chính xác, xin vui lòng nếu bạn biết bất kỳ phương pháp nào tốt hơn).

Câu hỏi của tôi là: Làm cách nào để tạo mảng biến thể trong một chương trình, sau đó làm cách nào để đọc giá trị của biến thể trong một chương trình khác?

Tôi biết về VarArrayCreate và VarArrayLowBound/VarArrayHighBound, nhưng tôi không chắc chắn về cách thực hiện điều này đúng cách.

Cảm ơn!

Trả lời

25

Bạn tạo ra nó như thế:

khai báo đầu tiên

var 
    VarArray: Variant; 
    Value: Variant; 

Sau đó, việc tạo ra:

VarArray := VarArrayCreate([0, Length - 1], varVariant); 

hoặc bạn cũng có thể có

VarArray := VarArrayCreate([0, Length - 1], varInteger); 

Phụ thuộc vào t anh ấy nhập dữ liệu. Sau đó, bạn lặp lại như sau:

i := VarArrayLowBound(VarArray, 1); 
HighBound := VarArrayHighBound(VarArray, 1); 

while i <= HighBound do 
begin 
    Value := VarArray[i]; 
    ... do something ... 
    Inc(i); 
end; 

Cuối cùng, bạn xóa mảng khi không cần nữa. CHỈNH SỬA: (Tùy chọn này, hãy xem In Delphi 2009 do I need to free variant arrays?)

VarClear(VarArray); 

Đó là tất cả. Ví dụ khác nhìn vào chính thức Embracadero Help

EDIT:

Mảng nên được tạo ra chỉ một lần. Sau đó, chỉ cần sử dụng nó như được hiển thị trong ví dụ trên.

+0

Cảm ơn! Bạn cũng có thể cung cấp cho một số mã ví dụ về cách đọc mảng trở lại phía khách hàng? Hãy nói rằng một vararray được truyền cho khách hàng trong một biến thể, làm thế nào để bạn đọc nó? Bạn có gọi VarArrayCreate hoặc chỉ sử dụng VarArrayLowBound vv? – Steve

+0

Chỉ cần sử dụng mảng ở phía bên kia. Chỉ tạo một lần. Nhưng xem ai chịu trách nhiệm thanh toán bù trừ nó. – Runner

7

Đối với phía bên kia:

(giả sử giá trị gia tăng là tham số biến thể và các loại nguyên tố là WideString)

var 
    Source: PWideStringArray; 

if VarIsArray(Value) then begin 
    Source:= VarArrayLock(Value); 
    try 
    for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do 
     DoWhatEverYouWantWith(Source^[i]); 
    end; 
    finally 
    VarArrayUnlock(Value); 
    end; 
end; 
+0

VarArrayLock là gì? Tôi đang sử dụng một mảng byte btw. PWideStringArray được định nghĩa ở đâu? Có một PByteArray là tốt? Cảm ơn! – Steve

+2

PWideStringArray là một kiểu tự định nghĩa, như tên của nó, một con trỏ trỏ đến một mảng của WideStrings. Bạn có thể tìm thấy PByteArray trong SysUtils. VarArrayLock khóa mảng và trả về một con trỏ tới bộ nhớ chứa mảng để truy cập nhanh hơn. Khi bạn có các quy trình khác nhau xung quanh với mảng này, tôi khuyên bạn nên sử dụng chức năng này. Bạn có thể tra cứu thêm thông tin trong trợ giúp D7. –

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