Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Почему при выводе позиции Point X выводится другое число?


Автор: Katerina1993 26.03.22, 11:59
Создала точку Point с координатами (X,Y). Поместила эти координты в массив. При этом использовала функцию ScreenToClient. Позиции у меня X = 124, Y = 149. При выводе X получается -72. Почему так происходит? Я ожидала получить 124. Вот мой код:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      pts:Array of TPoint;
      pt:TPoint;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     
     pt:= Point(124,149);
     SetLength(pts, Length(pts)+1);
    pts[High(pts)] := ScreenToClient(pt);
     
    Label1.Caption := IntToStr(pts[High(pts)].X);
    ShowMessage(IntToStr(pts[High(pts)].X));
     
    end;
     
    end.

Автор: RusSun 26.03.22, 19:06
Вместо
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    pts[High(pts)] := ScreenToClient(pt);

Попробуйте
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     pts[High(pts)] := pt;

Автор: Katerina1993 27.03.22, 06:59
Массив заполнен TPoint, при выводе с помощью Length я получаю 1, если High то 0. Поясните пожалуйста чем Length отличается от High?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    pt:= Point(124,149);
    SetLength(pts, Length(pts)+1);
    pts[High(pts)] := pt;
    //Значение - 0
    ShowMessage(IntToStr(High(pts)));
    //Значение - 1
    ShowMessage(IntToStr(Length(pts)));

Автор: RusSun 27.03.22, 08:00
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     
     pt:= Point(124,149);
     
    showmessage('Длина динамического массива '+intToStr( Length(pts))+#10#13+
    'Индексы в динамическом массиве начинаются с «0» '  );
     
     SetLength(pts, Length(pts)+1);
    // showmessage('длина массива '+intToStr( Length(pts))  );
     pts[High(pts)] := pt;   //ScreenToClient( )
     
     pt:= Point(194,124);
     
     SetLength(pts, Length(pts)+1);
     pts[High(pts)] := pt;
     
     pt:= Point(146,124);
     SetLength(pts, Length(pts)+1);
     pts[High(pts)] := pt;
     
    //showmessage('Длина массива '+intToStr( Length(pts))  );
    Label1.Caption := IntToStr(pts[High(pts)].X);
    ShowMessage(IntToStr(pts[High(pts)].X));
     
     
    showmessage('Длина массива после добавления 3 значений в массив '+intToStr( Length(pts))  );
    Label1.Caption := IntToStr(pts[High(pts)].X);
     
    ShowMessage('Значение по «наименьшему индексу  в массиве» '+#10#13+
                IntToStr(pts[Low(pts)].X)+#10#13+
                'Его индекс в массиве '+#10#13+
                IntToStr(Low(pts))        );
     
     
    ShowMessage('Значение по «наибольшему индексу в массиве» '+#10#13+
                IntToStr(pts[High(pts)].X)+#10#13+
                'Его индекс в массиве '+#10#13+
                IntToStr(High(pts))        );
    end;

Автор: WildBear 10.04.22, 08:40
Индекс массива начинается с 0.
Поэтому длина массива из одного элемента = 1 , а его наибольший индекс = 0.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)