Основы COM-технологий. Артемов М.А. и др. - 15 стр.

UptoLike

Составители: 

29
function VarArrayLowBound(const A:
Variant; Dim: Integer): Integer;
ȼɨɡɜɪɚɳɚɟɬ ɧɢɠɧɸɸ ɝɪɚ-
ɧɢɰɭ ɢɡɦɟɪɟɧɢɹ Dim ɞɥɹ
ɦɚɫɫɢɜɚ
function VarArrayHighBound(const A:
Variant; Dim: Integer): Integer;
ȼɨɡɜɪɚɳɚɟɬ ɜɟɪɯɧɸɸ ɝɪɚ-
ɧɢɰɭ ɢɡɦɟɪɟɧɢɹ Dim ɞɥɹ
ɦɚɫɫɢɜɚ
function VarArrayLock(const A: Variant):
Pointer;
Ȼɥɨɤɢɪɭɟɬ ɜɚɪɢɚɧɬɧɵɣ ɦɚɫ-
ɫɢɜ ɢ ɜɨɡɜɪɚɳɚɟɬ ɫɫɵɥɤɭ ɧɚ
ɧɟɝɨ
procedure VarArrayUnlock(var A: Vari-
ant);
ɋɧɢɦɚɟɬ ɛɥɨɤɢɪɨɜɤɭ ɫ ɜɚ-
ɪɢɚɧɬɧɨɝɨ ɦɚɫɫɢɜɚ, ɡɚɞɚɧ-
ɧɭɸ ɩɪɟɞɵɞɭɳɟɣ ɮɭɧɤɰɢɟɣ
function VarIsNull(const V: Variant): Boo-
lean;
ȼɨɡɜɪɚɳɚɟɬ ɢɫɬɢɧɭ, ɟɫɥɢ
ɜɚɪɢɚɧɬ ɫɨɞɟɪɠɢɬ ɩɭɫɬɨɟ
ɡɧɚɱɟɧɢɟ
procedure VarArrayRedim(A: Variant;
HighBound: Integer);
ɂɡɦɟɧɹɟɬ ɪɚɡɦɟɪ ɜɚɪɢɚɧɬ-
ɧɨɝɨ ɦɚɫɫɢɜɚ
ȼ ɫɥɟɞɭɸɳɟɦ ɩɭɧɤɬɟ ɩɪɢɜɟɞɟɧ ɩɪɢɦɟɪ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ ɜɚɪɢ-
ɚɧɬɧɵɯ ɦɚɫɫɢɜɨɜ.
2.10. Ɉɛɪɚɛɨɬɤɚ ɦɚɫɫɢɜɨɜ ɞɚɧɧɵɯ
Ɋɚɫɫɦɨɬɪɢɦ ɮɭɧɤɰɢɨɧɚɥɶɧɵɟ ɜɨɡɦɨɠɧɨɫɬɢ ɛɟɡɨɩɚɫɧɵɯ ɦɚɫɫɢɜɨɜ ɧɚ
ɩɪɢɦɟɪɟ.
2.10.1. ɋɨɡɞɚɧɢɟ ɫɟɪɜɟɪɚ
Ʉɚɤ ɢ ɜ ɩɪɟɞɵɞɭɳɟɦ ɩɪɢɦɟɪɟ, ɫɨɡɞɚɞɢɦ ɜɧɟɲɧɢɣ ɫɟɪɜɟɪ ɚɜɬɨɦɚɬɢɡɚ-
ɰɢɢ. ȼ ɪɟɞɚɤɬɨɪɟ ɛɢɛɥɢɨɬɟɤɢ ɬɢɩɨɜ ɨɩɪɟɞɟɥɢɦ ɞɜɚ ɢɧɬɟɪɮɟɣɫɚ – IvectSrv
ɢ IMatrixSrv
. ȼ ɩɟɪɜɨɦ ɢɧɬɟɪɮɟɣɫɟ ɫɨɡɞɚɞɢɦ ɦɟɬɨɞ ChangeVect, ɜɵɩɨɥ-
ɧɹɸɳɢɣ ɩɟɪɟɫɬɚɧɨɜɤɭ ɷɥɟɦɟɧɬɨɜ ɦɚɫɫɢɜɚ. Ɍɢɩ ɩɟɪɜɨɝɨ ɩɚɪɚɦɟɬɪɚ (ɢɫ-
ɯɨɞɧɵɣ ɦɚɫɫɢɜ) ɨɩɪɟɞɟɥɢɦ ɤɚɤ Variant
ɫ ɦɨɞɢɮɢɤɚɬɨɪɨɦ in
, ɬɢɩ ɜɬɨɪɨɝɨ
(ɪɟɡɭɥɶɬɚɬ ɜɵɱɢɫɥɟɧɢɣ)
Variant ɫ ɦɨɞɢɮɢɤɚɬɨɪɨɦ out.
ȼɨ ɜɬɨɪɨɦ ɢɧɬɟɪɮɟɣɫɟ IMatrixSrv ɞɥɹ ɬɪɚɧɫɩɨɧɢɪɨɜɚɧɢɹ ɦɚɬɪɢɰɵ
ɫɨɡɞɚɞɢɦ ɦɟɬɨɞ Trans ɫ ɚɧɚɥɨɝɢɱɧɵɦɢ ɩɚɪɚɦɟɬɪɚɦɢ. ɋɝɟɧɟɪɢɪɭɟɦ ɦɨɞɭɥɶ
ɫ ɨɩɪɟɞɟɥɟɧɢɟɦ ɤɨɦɩɨɧɟɧɬɧɨɝɨ ɤɥɚɫɫɚ ɢ ɡɚɩɢɲɟɦ ɜ ɧɟɝɨ ɪɟɚɥɢɡɚɰɢɸ
ɭɩɨɦɹɧɭɬɵɯ ɦɟɬɨɞɨɜ:
type
TVectSrv = class(TAutoObject, IVectSrv, IMatrixSrv)
protected
procedure ChangeVect(v:OleVariant; out z:OleVariant); safecall;
30
procedure Trans(a: OleVariant; out b: OleVariant); safecall;
end;
implementation
uses ComServ, variants;
procedure TVectSrv.ChangeVect(v: OleVariant; out z: OleVariant);
var dim, i,j: integer;
begin
dim := VarArrayDimCount(v); // ɱɢɫɥɨ ɢɡɦɟɪɟɧɢɣ
if dim = 1 then
begin
z := v;
// Ɉɩɪɟɞɟɥɹɟɦ ɪɚɡɦɟɪɧɨɫɬɢ ɩɨ X ɩɟɪɟɞɚɧɧɨɝɨ ɦɚɫɫɢɜɚ
i := VarArrayLowBound(v,1);
j := VarArrayHighBound(v,1);
// Ɇɟɧɹɟɦ ɦɟɫɬɚɦɢ ɩɟɪɜɵɣ ɢ ɩɨɫɥɟɞɧɢɣ ɷɥɟɦɟɧɬ
z[i]:=v[j];
z[j]:=v[i];
end;
end;
procedure TVectSrv.Trans(a: OleVariant; out b: OleVariant);
var dim, n, m, i0,j0,i, j: integer;
begin
b := a;
dim := VarArrayDimCount(a); // ɱɢɫɥɨ ɢɡɦɟɪɟɧɢɣ
if dim = 2 then
begin
// Ɉɩɪɟɞɟɥɹɟɦ ɪɚɡɦɟɪɧɨɫɬɢ ɩɨ X ɩɟɪɟɞɚɧɧɨɝɨ ɦɚɫɫɢɜɚ
i0 := VarArrayLowBound(a,1);
n := VarArrayHighBound(a,1);
// .. ɢ ɪɚɡɦɟɪɧɨɫɬɢ ɩɨ Y
j0 := VarArrayLowBound(a,2);
m := VarArrayHighBound(a,2);
// Ɍɪɚɧɫɩɨɧɢɪɭɟɦ
for i := i0 to n do
for j := j0 to m do
b[i,j] := a[j,i];
end;
end;
function VarArrayLowBound(const A:         ���������� ������ ���-          procedure Trans(a: OleVariant; out b: OleVariant); safecall;
Variant; Dim: Integer): Integer;           ���� ��������� Dim ���         end;
                                           �������
                                           ����������  ������� ���-     implementation
function VarArrayHighBound(const A:
Variant; Dim: Integer): Integer;           ���� ���������  Dim ���
                                           �������                      uses ComServ, variants;
function VarArrayLock(const A: Variant): ��������� ���������� ���-      procedure TVectSrv.ChangeVect(v: OleVariant; out z: OleVariant);
Pointer;                                   ��� � ���������� ������ ��
                                           ����                         var dim, i,j: integer;
                                           �������  ���������� � ��-    begin
procedure VarArrayUnlock(var A: Vari-                                     dim := VarArrayDimCount(v); // ����� ���������
ant);                                      ���������  �������, �����-
                                           ��� ���������� ��������        if dim = 1 then
                                                                          begin
function VarIsNull(const V: Variant): Boo- ���������� ������, ����           z := v;
lean;                                      ������� �������� ������
                                           ��������                             // ���������� ����������� �� X ����������� �������
                                           �������� ������ �������-          i := VarArrayLowBound(v,1);
procedure VarArrayRedim(A: Variant;                                          j := VarArrayHighBound(v,1);
HighBound: Integer);                       ���� �������
                                                                             // ������ ������� ������ � ��������� �������
                                                                             z[i]:=v[j];
      � ��������� ������ �������� ������ ���������������� ����-
                                                                             z[j]:=v[i];
  ������ ��������.
                                                                          end;
                                                                        end;
                2.10. ��������� �������� ������
                                                                        procedure TVectSrv.Trans(a: OleVariant; out b: OleVariant);
    ���������� �������������� ����������� ���������� �������� ��        var dim, n, m, i0,j0,i, j: integer;
�������.                                                                begin
                        2.10.1. �������� �������                         b := a;
                                                                         dim := VarArrayDimCount(a); // ����� ���������
     ��� � � ���������� �������, �������� ������� ������ ����������-     if dim = 2 then
���. � ��������� ���������� ����� ��������� ��� ���������� – IvectSrv    begin
� IMatrixSrv. � ������ ���������� �������� ����� ChangeVect, �����-         // ���������� ����������� �� X ����������� �������
������ ������������ ��������� �������. ��� ������� ��������� (��-           i0 := VarArrayLowBound(a,1);
������ ������) ��������� ��� Variant � ������������� in, ��� �������        n := VarArrayHighBound(a,1);
(��������� ����������) – Variant � ������������� out.                          // .. � ����������� �� Y
     �� ������ ���������� IMatrixSrv ��� ���������������� �������           j0 := VarArrayLowBound(a,2);
�������� ����� Trans � ������������ �����������. ����������� ������         m := VarArrayHighBound(a,2);
� ������������ ������������� ������ � ������� � ���� ����������
���������� �������:                                                         // �������������
                                                                            for i := i0 to n do
type                                                                          for j := j0 to m do
  TVectSrv = class(TAutoObject, IVectSrv, IMatrixSrv)                           b[i,j] := a[j,i];
  protected                                                               end;
   procedure ChangeVect(v:OleVariant; out z:OleVariant); safecall;      end;

                                    29                                                                       30