Delphi на c # вопрос - PullRequest
       5

Delphi на c # вопрос

4 голосов
/ 17 декабря 2010

У меня есть программа Delphi, которую я должен конвертировать в c #. Я выполнил большую часть преобразования, но столкнулся с парой проблем с VarArrayCreate.

что у меня есть это: Строка: = VarArrayCreate ([0, 1], varVariant);

Кажется, я не могу понять преобразование или замену VarArrayCreate. Я знаю, что объект в c # может быть использован для замены Variant, но вышесказанное застряло.

любая помощь будет отличной.

Я добавил код Delphi ниже, меня интересует процедура "TForm1.Button3Click (Отправитель: TObject); процедура:

unit Unit1;

(*------------------------------------------------------------------------------
DX Atlas Automation demo #2 (early binding)

Make sure that DX Atlas is installed.

Requires DxAtlas_TLB. You can either generate this file in Delphi
(Project -> Import Type Library -> DxAtlas) or use the one included
with this demo.

http://www.dxatlas.com
------------------------------------------------------------------------------*)

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OleServer, StdCtrls, DxAtlas_TLB, ActiveX, AxCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    Atlas: IAtlas;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//------------------------------------------------------------------------------
//                             Start DX Atlas
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  //connect to Dx Atlas on program startup
  try
    Atlas := CoAtlas.Create;
  except on E: Exception do
    begin
    ShowMessage('Cannot connect to DX Atlas: ' + E.Message);
    Application.Terminate;
    end;
  end;
end;


procedure TForm1.FormShow(Sender: TObject);
var
  WorkArea: TRect;
begin
  //get Desktop work area dimensions
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);


  //form placement

  Top := WorkArea.Top;
  Left := WorkArea.Left;
  Height := WorkArea.Bottom - WorkArea.Top;


  //atlas placement

  //stop repainting
  Atlas.Map.BeginUpdate;
  //place window
  Atlas.Top := Top;
  Atlas.Left := Left + Width;
  Atlas.Width := WorkArea.Right - Left - Width;
  Atlas.Height := Height;
  //hide prefixes
  Atlas.Map.PrefixesVisible := false;
  //now allow repainting
  Atlas.Map.EndUpdate;
  //show the Atlas window
  Atlas.Visible := true;
end;

//------------------------------------------------------------------------------
//                                  Points
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  Pt, Points: OleVariant;
  i: integer;
  Layer: ICustomLayer;
begin
  Randomize;

  //create Variant array for data
  Points := VarArrayCreate([0, 999], varVariant);

  //fill the array with random points

  for i:=0 to 999 do
    begin
    //each point is a variant array with 2 elements
    Pt := VarArrayCreate([0,1], varVariant);
    //point coordinates are random (decimal degrees)
    Pt[0] := Random(360) - 180; //longitude
    Pt[1] := Random(180) - 90;  //latitude
    //add point to the data array
    Points[i] := Pt;
    end;

  //show data on the map

  Atlas.Map.BeginUpdate;
  with Atlas.Map do
    try

      Projection := PRJ_RECTANGULAR;
      Dimmed := false;
      CustomLayers.Clear;
      //add new custom layer
      Layer := CustomLayers.Add(LK_POINTS);
      with Layer do
        begin
        //set layer attributes
        PenColor := clBlue;
        BrushColor := clLime;
        PointSize := 2;
        //set data
        SetData(Points);
        end;
    finally
      EndUpdate;
    end;
end;

//------------------------------------------------------------------------------
//                                  Labels
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  //Lb: Variant;
  Labels: Variant;
  i: integer;
  Layer: ICustomLayer;
begin
  Randomize;

  Labels := VarArrayCreate([0, 999], varVariant);

  for i:=0 to 999 do
    begin
    //each label is a variant array of 3 Variants
    Labels[i] := VarArrayOf([Random(360) - 180,           //longitude
                            Random(180) - 90,             //latitude
                            Format(' LABEL #%d ', [i])]); //label text

    //alternate way of creating and filling the array
    {
    Lb := VarArrayCreate([0,2], varVariant);
    Lb[0] := Random(360) - 180;
    Lb[1] := Random(180) - 90;
    Lb[2] := Format(' Label #%d ', [i]);
    Labels[i] := Lb;
    }
    end;


  Atlas.Map.BeginUpdate;
  with Atlas.Map do
   try
     Projection := PRJ_RECTANGULAR;
     Dimmed := false;
     CustomLayers.Clear;
     Layer := CustomLayers.Add(LK_LABELS);
     with Layer do
       begin
       LabelsTransparent := CheckBox1.Checked;
       //label BG if not transparent
       BrushColor := clAqua;
       //font attributes

       with (Font as IFont) do
         begin
         Put_Name('Courier New');
         Put_Italic(true);
         Put_Size(9);

         //Put_Name('Small fonts');
         //Put_Size(5);
         end;

       //font color
       PenColor := clBlue;
       //data
       SetData(Labels);
       end;
   finally
     EndUpdate;
   end;
end;


//------------------------------------------------------------------------------
//                                  Lines
//------------------------------------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
var
  Pt, Line, Meridians, Parallels: OleVariant;
  i, j: integer;
begin
  //generate meridians
  Meridians := VarArrayCreate([0, 7], varVariant);
  for i:=0 to 7 do
    begin
    Line := VarArrayCreate([0, 36], varVariant);
    for j:=0 to 36 do
      begin
      Pt := VarArrayCreate([0, 1], varVariant);
      Pt[0] := i*45 - 180;
      Pt[1] := j*5 - 90;
      Line[j] := Pt;
      end;
    Meridians[i] := Line;
    end;

  //generate parallels
  Parallels := VarArrayCreate([0, 2], varVariant);
  for i:=0 to 2 do
    begin
    Line := VarArrayCreate([0, 72], varVariant);
    for j:=0 to 72 do
      begin
      Pt := VarArrayCreate([0, 1], varVariant);
      Pt[0] := j*5 - 180;
      Pt[1] := i*45 - 45;
      Line[j] := Pt;
      end;
    Parallels[i] := Line;
    end;

  //show on the map

  Atlas.Map.BeginUpdate;
  with Atlas.Map do
   try
     Projection := PRJ_AZIMUTHAL;
     Dimmed := false;
     CenterLatitude := 43;
     CenterLongitude := -79;
     CustomLayers.Clear;

     //show meridians
     with CustomLayers.Add(LK_LINES) do
       begin
       PenColor := clBlue;
       SetData(Meridians);
       end;

     //show parallels
     with CustomLayers.Add(LK_LINES) do
       begin
       PenColor := clRed;
       SetData(Parallels);
       end;

   finally
     EndUpdate;
   end;
end;


//------------------------------------------------------------------------------
//                                  Area
//------------------------------------------------------------------------------
procedure TForm1.Button4Click(Sender: TObject);
var
  Pt, Area, Areas: OleVariant;
  i: integer;
begin
  //single area
  Areas := VarArrayCreate([0, 0], varVariant);

  //generate area data
  Area := VarArrayCreate([0, 72], varVariant);
  for i:=0 to 72 do
    begin
    Pt := VarArrayCreate([0, 1], varVariant);
    Pt[0] := -79 + 20 * cos(i*5/180*Pi);
    Pt[1] := 43 + 20 * sin(i*5/180*Pi);
    Area[i] := Pt;
    end;

  Areas[0] := Area;

  //show on the map
  Atlas.Map.BeginUpdate;
  with Atlas.Map do
   try
     Projection := PRJ_RECTANGULAR;
     Dimmed := true;
     CustomLayers.Clear;
     with CustomLayers.Add(LK_AREAS) do
       begin
       AreaBrightness := 12; //0..15, 15=max
       SetData(Areas);
       end;
   finally
     EndUpdate;
   end;
end;



//------------------------------------------------------------------------------
//                                  Glyphs
//------------------------------------------------------------------------------
procedure TForm1.Button5Click(Sender: TObject);
var
  Glyphs: Variant;
  i: integer;
  Layer: ICustomLayer;
begin
  Randomize;

  //create array of Variants
  Glyphs := VarArrayCreate([0,333], varVariant);
  //each element of the array is a variant array with 3 elements
  for i:=0 to 333 do
    Glyphs[i] := VarArrayOf([Random(360)-180, //longitude    -180..180
                             Random(180)-90,  //latitude     -90..90
                             Random(10)]);    //image index   0..9


  Atlas.Map.BeginUpdate;
  with Atlas.Map do
   try
     Projection := PRJ_RECTANGULAR;
     Dimmed := false;
     //delete all layers
     CustomLayers.Clear;
     //add layer
     Layer := CustomLayers.Add(LK_GLYPHS);
     //Glyphs.bmp is a bitmap 160x16 that contains 10 glyphs, 16x16 each
     //the color of lower left pixel (clFuchsia) is considered transparent
     //the hot spot of the glyph is at (1, 15).
     Layer.LoadGlyphsFromFile(ExtractFilePath(ParamStr(0)) + 'Glyphs.bmp', 1, 15);
     //send locations to the layer
     Layer.SetData(Glyphs);
   finally
     //now allow repainting
     EndUpdate;
   end;
end;



//------------------------------------------------------------------------------
//                            Great Circle paths
//------------------------------------------------------------------------------
procedure TForm1.Button6Click(Sender: TObject);
var
  Pt, Line, Lines: Variant;
  i, j: integer;
begin
  //generate an array of Great Circle paths

  Lines := VarArrayCreate([0, 33], varVariant);
  for i:=0 to 33 do
    begin
    //a Great Circle path is defined by its end points
    Line := VarArrayCreate([0, 1], varVariant);
    Line[0] := VarArrayOf([-79, 43 {Toronto}]);
    Line[1] := VarArrayOf([Random(360) - 180, Random(180) - 90]);
    //add path to the array
    Lines[i] := Line;
    end;

  //show paths on the map

  Atlas.Map.BeginUpdate;
  with Atlas.Map do
   try
     Projection := PRJ_RECTANGULAR;
     Dimmed := false;
     CustomLayers.Clear;
     with CustomLayers.Add(LK_LINES) do
       begin
       PenColor := clBlue;
       SetData(Lines);
       end;
   finally
     EndUpdate;
   end;

  //Note that Delphi automatically releases the variant arrays when they go out of scope.
  //In other languages you may have to release them explicitly.
end;


end.

Mike

Ответы [ 4 ]

3 голосов
/ 17 декабря 2010

Вызов VarArrayCreate в вашем примере создает массив из 2 элементов, начиная с индекса ноль и заканчивая индексом 1.

Эквивалент C # будет следующим:

object[] Line;
Line = new object[2];
1 голос
/ 29 февраля 2012
private void _showPoints()
{
  object[] pt = new object[2];
  object[] points = new object[4];

  for (int i = 0; i < 3; i++)
  {
    pt[0] = _dx[i, 0];
    pt[1] = _dx[i, 1];
    points[i] = pt;
  }
  _aquaPoints.SetData(points);
}

Выше приведен пример метода ShowPoints из кода VB Алекса. Это также будет применяться к преобразованию кода Delphi, который вы преобразовываете ...

объект является ближайшей к варианту в C #.

1 голос
/ 17 декабря 2010

Следует, возможно, упомянуть, что varArray создает массив варианта типа данных, который сильно отличается от обычных типов.Он создает структуру в памяти, которую нельзя сравнить с экземпляром объекта (AFAIK).Ожидается, что он будет храниться в виде связанного (по указателю) списка узлов.Тем не менее, структура варианта Delphi идентична собственному формату хранения Microsoft, что означает, что вы можете вызвать winapi для достижения того же результата.

Если вы еще не решили ее, я бы взглянул на библиотеки поддержки COM внутри.СЕТЬ.Возможно, в разделе «System.Runtime.InteropServices» ». Или посмотрите на модуль types.pas в Delphi и посмотрите, какие функции WinAPI они вызывают.

0 голосов
/ 17 декабря 2010

вы можете создать "обычный" массив ....

MyType[] Line = new MyType[2];

или общий список ....

List<MyType> Line = new List<MyType>(); // list is empty, still have to add n elements
Line.Add( new MyType() );
Line.Add( new MyType() );

какой путь вы выберете, зависит от того, что вынеобходимость.Если вам нужен «массив», который динамически растет во время работы вашей программы, используйте общий список.если нет, то перейдите к массиву.

Теперь следует помнить, что любой из них основан на 0, а не произвольно начинаться с N, как может сделать Delphi.

сейчасВы можете смоделировать это с помощью HashTable или Dictionary, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...