Попытка заставить Editbox двигаться вверх и вниз нажатием кнопки - PullRequest
1 голос
/ 21 марта 2012

Привет, я пытаюсь заставить поле редактирования переместиться вниз с 300 на 30 при нажатии кнопки, и после повторного нажатия этой же кнопки, заставить окно редактирования переместиться вверх на 30 в исходное положение.Однако, когда я нажимаю кнопку, которую я сделал, она просто увеличивается на 30 каждый раз, где я ошибаюсь?вот мой код,

procedure TfrmProject.Button3Click(Sender: TObject);
begin    
  if Edit1.Top = 300 then 
    Edit1.Top := Edit1.Top + 30 else 
    Edit1.Top := Edit1.Top - 30;    
end; 

РЕДАКТИРОВАТЬ: я понял, что из-за того, что моя форма длинная и имеет вертикальную полосу прокрутки, свойство Top окна редактирования изменяется в зависимости от того, где я нахожусь на форме, т.е.если я нахожусь в верхней части формы, свойство Top поля редактирования увеличивается (поле редактирования находится в нижней части формы), поэтому мой новый вопрос заключается в том, как можно убедиться, что поле редактирования перемещается только между 2 фиксированными точками, как показано нижеВ последних предложениях поле редактирования перемещается между двумя точками с расстоянием между ними 30, но их положение в форме изменяется.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Это прекрасно работает для меня.

Создайте новое приложение Delphi VCL Forms

Удалите TEdit и TButton в новой форме.Установите Top' property of each to 50 using the Object Inspector`.

Дважды щелкните Button1 и вставьте следующий код, чтобы заменить только что сгенерированное событие TForm1.Button1Click:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Top = 50 then
    Edit1.Top := Edit1.Top + 30
  else
    Edit1.Top := 50;
end;

Запустите приложение.Повторное нажатие Button1 заставляет Edit1 двигаться вверх и вниз от 50 до 80.

Это означает, что ваше сравнение неверно.Установите Button1.Top явно в исходную координату (300 в вашем коде) вместо уменьшения на 30.

2 голосов
/ 21 марта 2012

Тогда исходная настройка свойства Top не была 300. Или перемещение (полностью) не допускается из-за ограничений, выравнивания или привязки настроек элемента управления редактирования или смежных элементов управления.

Возможные решения:

  • Когда Top всегда должен быть 300:

    Установите Edit1.Top на 300. И убедитесь, что движение возможно.

  • Когда 299

    Измените сравнение на:

    if Edit1.Top < 330 then  
    
  • Когда вершина должна остаться незамеченной:

    Используйте свойство Tag элемента управления редактирования (или частную переменную, или ...), чтобы запомнить, в каком направлении он должен двигаться:

    procedure TForm1.Button1Click(Sender: TObject);
    const
      MoveNorth = 0;
      MoveSouth = 1;
    begin
      if Edit1.Tag = MoveNorth then
        Edit1.Top := Edit1.Top + 30 else
        Edit1.Top := Edit1.Top - 30;
      if Edit1.Tag = MoveNorth then
        Edit1.Tag := MoveSouth else
        Edit1.Tag := MoveNorth;
    end;
    
  • Использование раствор Кена .

1 голос
/ 21 марта 2012

Вот маленький трюк для вас.

Поместите метку без заголовка в форму со свойством Top, установленным в 0, и якорями, установленными в [akLeft, akTop]. Используйте этот ярлык в качестве заполнителя, чтобы вы всегда знали, где находится верх формы. Когда он прокручивается за пределами экрана, свойство Top фактически становится отрицательным.

Теперь используйте свойство Top метки в качестве отправной точки, поэтому поместите поле редактирования на 300 пикселей сверху:

Edit1.Top := Label1.Top + 300;

Это простой способ. Я полагаю, что правильно использовать положение вертикальной полосы прокрутки следующим образом:

Edit1.Top := 300 - Self.VertScrollBar.Position;
...