Включить полосы прокрутки в отключенном управлении TMemo - PullRequest
2 голосов
/ 23 февраля 2011

Есть ли способ включить полосы прокрутки в отключенном компоненте TMemo? Я хочу позволить пользователям прокручивать содержимое, даже если для свойства элемента управления Enabled установлено значение False.Я знаю о возможном обходном пути с ReadOnly и изменении цвета, например, в отключенном состоянии, но это мне очень поможет.

Заранее спасибо:)

Ответы [ 4 ]

7 голосов
/ 23 февраля 2011

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

Использование ReadOnly - самое простое решение.Но будьте внимательны с изменением цвета, чтобы элемент управления не выглядел отключенным.Это также было бы очень запутанным для пользователя в отношении распознавания включенных / отключенных элементов управления.Было бы лучше, чтобы он выглядел как прокручиваемый многострочный ярлык.Обычно это делается путем установки цвета (фона), равного цвету его родителя.

Не использовал решение, предложенное и связанное @HalloDu, но это выглядит как хорошая альтернатива.

1 голос
/ 23 февраля 2011

Ну, это не совсем то, что вы хотите, но эффект тот же. Посмотрите на эту статью, где реализовано свойство ViewOnly для WinControls, которое я нашел довольно полезным на протяжении многих лет. LINK

0 голосов
/ 24 февраля 2011

Есть способ.

Поместите весь TMemo внутри TScrollBox.

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

0 голосов
/ 23 февраля 2011

Это не идеальный способ, но он работает: используйте компилятор ScrollBar.рядом с памяткой.

procedure TForm9.FormCreate(Sender: TObject);
begin
  Memo1.ScrollBars := ssNone;
  ScrollBar1.Min := 0;
  ScrollBar1.Max := Memo1.Lines.Count div (Memo1.Height div 13);//13 is height of a line in memo
end;

procedure TForm9.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
  if ScrollCode in [scPageDown, scLineDown] then
    SendMessage(Memo1.Handle, WM_VSCROLL,  SB_PAGEDOWN,0)
  else if ScrollCode in [scPageUp, scLineUp] then
    SendMessage(Memo1.Handle, WM_VSCROLL,  SB_PAGEUP,0);
end;
...