2012-03-20 2 views
1

hi Я пытаюсь сделать блок editbox перемещаться вниз с 300 на 30 при нажатии кнопки, а после нажатия одной и той же кнопки снова сделать переход с помощью блока редактирования на 30 в исходное положение. Однако, когда я нажимаю кнопку «ive», она просто поднимается на 30 каждый раз, где я ошибаюсь? Вот мой код,Попытка сделать Editbox перемещаться вверх и вниз нажатием кнопки

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

EDIT: я понял, что из-за мою формой является длинной и имеющей вертикальной полосой прокрутки, свойство Top изменений EditBox в ответ на, где я нахожусь на форме, то есть, если я 'm в верхней части моей формы свойство Top из поля редактирования увеличивается (поле редактирования находится в нижней части формы), поэтому мой новый вопрос заключается в том, как я могу обеспечить, чтобы поле редактирования только перемещалось между двумя фиксированными точками, как показано в недавнем предложения поле редактирования перемещается между двумя точками с расстоянием 30 между ними, но их позиции в форме меняются.

+0

жаль, что я отправил код странно, новый на сайт – Alexjjsmith

+1

Strange, она прекрасно работает для меня ... –

+0

Моих предположим, что он никогда не был позиционирован в позиции 300 в первую очередь. Вероятно, это на 301 или 302, или что-то подобное. Это сделало бы поле редактирования перемещаться вверх каждый раз, когда вы нажимаете кнопку. – Elling

ответ

3

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

Создать новый Delphi VCL Forms вку

Опускаем TEdit и TButton на новой форме. Установите 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.

+0

спасибо большое, это работает для меня – Alexjjsmith

+0

Я разработал проблему, которая делает этот ответ не тем, что мне нужно, однако я все еще не знаю, как его решить. свойство Top изменяется из-за того, что моя форма длинна и имеет полосу прокрутки, поэтому прокрутка вверх и вниз меняет расстояние от блока редактирования вверх, но мне нужен код, который позволит перемещать поле редактирования между двумя фиксированными точками которые не меняются. – Alexjjsmith

+0

@ user1277240 - Извините; то, что вы сейчас задаете, непонятно, и, похоже, это совершенно другой вопрос, чем тот, о котором говорили выше. (Я не знаю, что нового, но ваш комментарий запутан.) Мой ответ здесь основан на вопросе, который вы задали здесь. –

2

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

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

  • Когда верхняя часть всегда должна быть 300:

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

  • Когда 299 < Топ < 330:

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

    if Edit1.Top < 330 then 
    
  • Когда Top должен оставаться undesided:

    Используйте 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; 
    
  • Использование Ken's solution.

+0

Исходная настройка для Top - это, безусловно, 300, на самом деле код работал, когда я сначала тестировал его, но теперь даже не вижу, что могло измениться. – Alexjjsmith

1

Вот вам небольшой трюк.

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

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

Edit1.Top := Label1.Top + 300; 

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

Edit1.Top := 300 - Self.VertScrollBar.Position; 
Смежные вопросы