powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
24 сообщений из 49, страница 2 из 2
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595714
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

автор...Напомню - сей код был позаимствован вот от сюда: http://forum.vingrad.ru/topic-33922.html...
А зачем Вам весь код?
Или Вы хотите
Код: pascal
1.
2.
3.
 Memo1.OnChange:=MemoChange;
 ..
 MemoN.OnChange:=MemoChange;



Или наследника написать
Код: pascal
1.
TmyMemo = class(TMemo)



Никто - ж понять не может, чего Вы на выходе получить хотите.
Решений Вам уже накидали, но Вас они почему-то не устраивают...
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595740
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko, в крайнем своем посте я выложил то, что у меня получилось... вся реализация через Сендер, без перебора всех компонентов на форме и прочего!
Куда еще проще то?
За сам заимствованный код (ссылку первоисточника я указал!) я сказать ничего не могу, кроме удаленных строк, не нужных мне...
...
Имеете свое видение - предложите полный текст процедуры!
Если не понятна Задача - перечитайте все мои посты еще раз...
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595751
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так у тебя действительно хрен поймешь

сначала ты сказал, тебе нужна процедура, которая всем мемкам на форме сраз включит/выключит прокрутку

потом оказалось, не всем, а только одной

потом оказывается, надо то включать, то выключать в процессе набора текста (вот пользователь-то порадуетсЯ, когда у него все слова туда-сюда будут скакать в околограничных значениях)....

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

то, что вы переменную Sender можете привести к типу TComponent, но не можете приветси к типу TMemo, ну извините, до такого догадаться и впрямь никому не удалось
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595761
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, да, пожалуй не сразу все правильно объяснил с первого раза..(((
Каюсь!!!

P.S. Что касается Сэндера - то я о нем сразу и не подумал... не часто применяю это, мало опыта..(
А вот через TAG а потом в CASE сформировать (или просто присвоить) имя компонента, чтоб позже подставить в "with ... do" - не понял таки как?
Ну на примере имен ТМемо (Amemo, BMemo, CMemo, DMemo) - можете расписать полностью?
Буду премного благодарен!,,))
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595766
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicА вот через TAG а потом в CASE сформировать (или просто присвоить) имя компонента, чтоб позже подставить в "with ... do" - не понял таки как?

никак.

не нужно.

просто берешь напрямую.

вместо (Sender as TComponent). КомпонентнаяПропертяТэг - что ты уже сделал - АБСОЛЮТНО ТОЧНО ТАК ЖЕ пишешь (Sender as TMemo). МемнаяПропертяСкроллБарз

никаких дополнительных кейзов тут нафиг не нужно, у тебя уже ВСЕ и так есть
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595767
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicимя компонента

И ещё раз скажу, имя компонента почти никогда никому не нужно, пользуются указателем на компонент.

смотри мои куски кода, там нет никаких имён, просто перебираем указатели на все мемки (в массиве или на форме, источник не принципиален), и с указателями работает.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595770
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё

with - штука мощная, но опасная, по крайней мере в Паскалевском варианте
есть очень многие, кто вообще выступают за то, чтобы из языка это слово убрать навсегда

внутри with-блока должно быть одна, две, много - три, очень простых и очевидных команды.
иначе начинается ералаш и путанится.

и хорошо, если сразу, а не через пару лет.

у тебя под with очень развесистое дерево. Не надо так делать.

заведи переменную например var M: TMemo, присваивай в неё укaзатель M := Sender as TMemo; и дальше с ним работай без всяких with с этой переменной
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595780
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochзаведи переменную например var M: TMemo, присваивай в неё укaзатель M := Sender as TMemo; и дальше с ним работай без всяких with с этой переменной
Если считаете, что в получившемся коде от WITH нужно избавиться - пусть так и будет!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm1.MemoChange(Sender: TObject);
var
NomerStroki: integer; // номер строки
Visota: integer; // высота текста в Memo
Rect: TRect; // пользовательская область Memo
M: TMemo;
begin
     NomerStroki := 0;
     Visota := 0;
     M := Sender as TMemo;
     Rect := M.ClientRect;
     TempLabel.Font := M.Font;
     while (NomerStroki < M.Lines.Count) and (Visota < Rect.Bottom) do
          begin
               TempLabel.Caption := M.Lines[NomerStroki];
               if TempLabel.Caption = '' then TempLabel.Caption := ' ';
               Inc(Visota, TempLabel.Height);
               Inc(NomerStroki);
          end;
          if Visota > Rect.Bottom then M.ScrollBars := ssVertical
          else M.ScrollBars := ssNone;
end;


Меня тоже кстати немного напрягали непонятные отдельные типа "Font", ...)

А по большому счету - СкроллБарс можно было бы вообще оставить навечно включенным!
Не так уж он собственно и мешает!..)))
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595785
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicА по большому счету - СкроллБарс можно было бы вообще оставить навечно включенным!

на мой взгляд, лучше так и сделать

если бы полоска была СНАРУЖИ мемо и не меняла расположения текста - это одно
но она появляется внутри, места для текста становится меньше, он перераспределяется по другому

Ariochнадо то включать, то выключать в процессе набора текста (вот пользователь-то порадуетсЯ, когда у него все слова туда-сюда будут скакать в околограничных значениях)....
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595786
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochнадо то включать, то выключать в процессе набора текста (вот пользователь-то порадуетсЯ, когда у него все слова туда-сюда будут скакать в околограничных значениях)....[/quot]
У меня - Мемо не редактируемые пользователем! - Чисто для вывода результатов на просмотр!
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595787
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic
Код: pascal
1.
NomerStroki < M.Lines.Count



если ты так считаешь, значит у тебя TMemo.WordsWrap выключен

но тогда длинные строки будут уезжать вправо за границу
и нужна будет горизонтальная прокрутка тоже

а если включить заворот слишком длинных строк, то Lines.Count может оказаться меньше ,чем количество реальных строк.

Такая вот фигня...
В какой-то степени может помочь TCanvas.TextExtent

ну а уж про использование TempLabel в цикле - это явно писал альтернативно одарённый программист

впрочем, это не самый .... удивительный, скажем, код из онлайн-учебников, который мне попадался.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595788
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я для вывода обычно включаю вертикальную прокрутку, а если горизонтально места не хватает - то пусть пользователь всю форму растягивает

тоже не идеал, но мне так больше нравится

и еще не выводи в Memo чаще, чем 2-3 раза в секунду
будет только тормозить без всякой пользы
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595789
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, а OnChange при этом вызывается ?

в VCL тут чехарда, если пользователь что-то меняет, то OnChange вызывается у всех
а когда меняется программно - то у одних контролов вызывается, а у других нет

так тчо лучше проверять всегда
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595804
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochBellic
Код: pascal
1.
NomerStroki < M.Lines.Count



если ты так считаешь, значит у тебя TMemo.WordsWrap выключен

но тогда длинные строки будут уезжать вправо за границу
и нужна будет горизонтальная прокрутка тоже

а если включить заворот слишком длинных строк, то Lines.Count может оказаться меньше ,чем количество реальных строк.

Такая вот фигня...
В какой-то степени может помочь TCanvas.TextExtent

ну а уж про использование TempLabel в цикле - это явно писал альтернативно одарённый программист

впрочем, это не самый .... удивительный, скажем, код из онлайн-учебников, который мне попадался.
Про WordsWrap я пока не думал... Он по умолчанию вроде оказался Включенным.
Пока суть да дело - набросал тестовый проект... правда всего с одним ТМемо, но это не важно...
На форме - две кнопки: Короткая фраза(длина выводимого в Мемо стринга меньше его объема и Длинная фраза(стринг длиннее Мемо)...
Ну и увидев, что при выводе Кототкой происходит перенос, тоже подумалось, что формула то вычисления может быть не верная, хотя на взгляд - все устраивает в Примере (ну разве что одна пустая строка в конце Мемо).
Ну а по TempLabel - видимо челу было проще всего вычислять!,,)))
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595816
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В моем Реальном проекте вычисления необходимости Включения-Выключения можно вообще сделать проще, зная заранее
- используемый в Мемо шрифт
- количество видимых в одной строке символов
- количество видимых строк

Но у чела ведь получился практически универсальный код - для разных шрифтов и разного размера Memo!
(Если не брать в расчет WordWrap!)
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595964
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а самый простой вариант, без вычислений - заменить TMemo на TRichEdit...
Задействовать в нем свойства:
Код: pascal
1.
2.
HideScrollBars := True;
ScrollBars := ssVertical; (или ssHorizontal)

И в результате - полосы прокрутки будут автоматически появляться, если текст отсекается границами компонента...)
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595973
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа если включить заворот слишком длинных строк, то Lines.Count может оказаться меньше ,чем количество реальных строк.Если мне не изменяет память, то Lines хранит (вернее обеспечивает доступ) именно к отображаемым строкам. Именно потому оно Lines, а не Items.

Но нужно проверить
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39595986
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего подобного. Иначе бы в свойстве Lines.Text хранились бы только отображаемые строки. А в нем хранятся все строчки.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39596010
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Лазаре и в Memo, и RichEdit есть доп.стили ssAutoVertical, ssAutoHorizontal, ssAutoBoth, позволяющие не думать о таких мелочах. Правда, они отображаются даже тогда, когда текст умещается в окне. Пришлось писать специальную функцию для расчета высоты текста в заданном прямоугольнике.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39596029
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокВ Лазаре и в Memo, и RichEdit есть доп.стили ssAutoVertical, ssAutoHorizontal, ssAutoBoth, позволяющие не думать о таких мелочах...Лазарус ибо для Человека был сделан, а не для галочки.
Док...Правда, они отображаются даже тогда, когда текст умещается в окне...Но ведь идея-то была хорошая, просто кто-то не успел доделать.
Док...Пришлось писать специальную функцию для расчета высоты текста в заданном прямоугольнике.Да, Лазарус не для рукожопых лентяев.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39596904
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicНо у чела ведь получился практически универсальный код - для разных шрифтов

Было бы чему удивляться, ей богу.

AriochВ какой-то степени может помочь TCanvas.TextExtent

.....а вообще, к вопросу о сумрачном гении, сталкивался я с загрузкой дерева из БД в невидимый TVirtualTreeView
Причём он грузился подряд в один уровень, а потом уже начиналась сортировка - восстановление в загруженном VTV древообразной структуры.
И после этого сформированное дерево переносилось в видимый VTV на форме.
Тормоза были непредставимые...
Те же данные, которые сортировались на сервере и грузились в самописное дерево, грущятся вообще глазу не заметно.

Это я к тому, что TLabel предназначен для рисования текста на экране. Если рисловать не надо - то и TLabel не надо. Вычисления через "невидимые" контролы - это дикая кривизна, и для этого должно быть ОЧЕНЬ сильное обоснование.
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39597116
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

TextExtent не нужен. Есть штатная TCanvas.DrawText, которая с нужными флагами возвращает высоту текста в прямоугольнике с заданной шириной
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure TForm1.Button1Click(Sender: TObject);
var
  ARect: TRect;
  AText: string;
  AFlag: UINT;
  h, ScrollBarWidth: Integer;
begin
  ScrollBarWidth:=  GetSystemMetrics(SM_CXVSCROLL);
  ARect:= Rect(-500,0,-500 + Memo2.Width - ScrollBarWidth,0);
  AText:= Memo1.Text;

  with Self.Canvas do
  begin
    Brush.Color:= Self.Color;
    Pen.Color:= clWindowText;
    //uses LCLType
    AFlag:=
      DT_NOCLIP
      or DT_WORDBREAK
      or DT_LEFT
      ;
    //uses LCLIntf
    h:= DrawText(Handle,PChar(AText),-1, ARect, AFlag);
    //h:= DrawText(Handle,PChar(AText),Length(AText), ARect, AFlag);// можно так
  end;

  if h < Memo2.Height
    then
      Memo2.ScrollBars:= ssNone
    else
      Memo2.ScrollBars:= ssVertical;

  Memo2.Lines.Assign(Memo1.Lines);







Но ТС это не интересует, он вообще на подсказки не смотрит - слишком увлечен своими идеями :)
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39597123
Arioch_Really
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,

Штатный в Delphi как раз TCanvas.TextExtent

Что до h:= DrawText(Handle, .....
То само слово Handle первым параметром подсказывает, чот это вовсе не часть TCanvas, а сторонняя процедура, скорее всего из WIndows GDI
У методоа TCanvas такого бы быть не могло
...
Рейтинг: 0 / 0
Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
    #39597465
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док, спасибо, я все читаю, что вы пишите!..))
Ну правда не всегда вовремя могу ответить!
Просто раз в RichEdit оказалась нужная опция - проще заменить Мемо на него и отказаться от вычислений...
Или вообще навечно включить СкроллБарс..))
...
Кстати - при выводе в Мемо, в нем в конце мешалась последняя пустая строка, получаемая ввиду заключительным символам $0A, $0D...
Вопрос легко решился простой командой удаления пробелов и упр.символов RightTrim...
Я конечно же Америку не открыл, но всеж решил дополнить инфу..)
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Автоматическое включение вертикального ScrollBars в нескольких компонентах TMemo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]