IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Доступ к элементам компонента.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Давно интересно было, как узнать положение курсора в поле ввода? Как им управлять?
Аналогично про полосы прокрутки у списков.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
как узнать положение курсора в поле ввода?
SelStart возвращает позицию курсора. Через него же можно и изменять...
Цитата
Аналогично про полосы прокрутки у списков.
Это доступно через TopIndex (возвращает или изменяет индекс самого верхнего отображаемого в списке элемента). В ListBox точно присутствует.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 3.10.2009 1:57) *

Это доступно через TopIndex (возвращает или изменяет индекс самого верхнего отображаемого в списке элемента). В ListBox точно присутствует.

А если не листбокс, а мемо? Или ещё что-то? Для каждого своё, общего решения нет?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






GetScrollPos или GetScrollInfo, чтобы получить текущую позицию прокручиваемого элемента, только что ты с ней потом делать будешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 3.10.2009 13:35) *

GetScrollPos или GetScrollInfo, чтобы получить текущую позицию прокручиваемого элемента, только что ты с ней потом делать будешь?


Я её буду менять. Пока не получается - позиция меняется, но компонент об этом не знает.

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






После изменения тебе надо будет послать сообщение:
SendMessage({компонент}.Handle, WM_{...}SCROLL, MAKEWPARAM(SB_THUMBPOSITION, NewPos), 0);
компоненту, чтобы он тоже об этом узнал...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 3.10.2009 13:56) *

После изменения тебе надо будет послать сообщение:
SendMessage({компонент}.Handle, WM_{...}SCROLL, MAKEWPARAM(SB_THUMBPOSITION, NewPos), 0);
компоненту, чтобы он тоже об этом узнал...

Я так понял, достаточно просто послать сообщение, без сетскроллпоса?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Да, достаточно только сообщения.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Спасибо, работает.
Однако логику зависимости положения полосы прокрутки и сдвига содержимого окна пока понять не могу, почему там всегда от 0 до 127, что оно делает, когда элементов больше, и так далее.
Если задать 200 элементов, то зачастую положение возвращается одинаковое для двух соседних, в то время как видно, что это не так. Что-то компонент от меня скрывает.

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


SetScrollRange тоже не помогает - ползунок просто стал доходить не до конца полосы, по-прежнему оставаясь на уровне 127.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Откуда цифра 127?
Насколько я помню, в WinAPI по умолчанию устанавливается 100.
Ну а изменение диапазона осуществляется точно так же, как и изменение позиции.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(andriano @ 3.10.2009 17:36) *

Откуда цифра 127?
Насколько я помню, в WinAPI по умолчанию устанавливается 100.

Не знаю, так получается.
Цитата

Ну а изменение диапазона осуществляется точно так же, как и изменение позиции.

А именно? Какое сообщение надо послать компоненту?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
Однако логику зависимости положения полосы прокрутки и сдвига содержимого окна пока понять не могу, почему там всегда от 0 до 127
Пока ты не расскажешь, с каким компонентом работаешь - это все испорченный телефон, потому что TMemo, например, при попытке взять GetScrollPos возвращает позицию скроллбара в строках (и интервал тоже - в строках: если в Memo.Lines есть 17 строк, то Range - от 0 до 17, если 20 - то от 0 до 20). А вот TRichEdit ведет себя совершенно по-другому: для эксперимента положил на форму RichEdit1 с 5-ю строками, получил range 0 .. 78, при 15 строках range изменился на 0 .. 208, и так далее...

Не пытайся сделать универсально, "чтобы работало с любым компонентом", работай с каждым компонентом, используя предназначенные ДЛЯ НЕГО методы.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 4.10.2009 2:11) *

Не пытайся сделать универсально, "чтобы работало с любым компонентом", работай с каждым компонентом, используя предназначенные ДЛЯ НЕГО методы.


Ааа, вот так вот... А как же унификация?
Конкретно сейчас мне нужен стринггрид.
Потом может понадобиться мемо.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Чёрт, я уже пожалел о стринггриде, все перерисовки делаются ТАК медленно, что хоть стреляйся.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






  SendMessage(StringGrid1.Handle, WM_SETREDRAW, 0, 0);
// Здесь собственно обновление содержимого Грида, или его заполнение
SendMessage(StringGrid1.Handle, WM_SETREDRAW, 1, 0);
должно ускорить работу с Гридом... В частности, Грид не будет обновляться после заполнения каждой ячейки, а будет обновлен только после заполнения ВСЕХ ячеек. Или ты о медленной прокрутке?

Цитата
А как же унификация?
А нет унификации... И не предвидится. Каждый компонент используется для определенной задачи, и не надо все валить в одну кучу (я о попытках единообразно работать с разными по сути своей компонентами). Ты ж не будешь список файлов хранить в СтрингГриде, правда? А почему? Равно как и дерево директорий ты хранишь в TreeView, а не в Memo и не в StringGrid-е. Где унификация? StringGrid - так StringGrid везде тогда уже...

Цитата
я уже пожалел о стринггриде
Ты бы задачу озвучил, глядишь и нашли бы более подходящий компонент.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Не знаю, вот такой код тормозит страшно (да, это не Дельфи, а ЦППБилдер, я не думаю, что данном случае это имеет значение):

void __fastcall TCalc::FormResize(TObject *Sender)
{
SendMessage(sgTable->Handle, WM_SETREDRAW, 0, 0);
int CH = ClientHeight;
int CW = ClientWidth;
btAddUnder->Top = CH - 40;
btDelete->Top = CH - 40;
btDelete->Left = (CW >> 1) - 60;
btShow->Top = CH - 40;
btShow->Left = CW - 120;
btAddOver->Top = CH - 20;
btClear->Top = CH - 20;
btClear->Left = (CW >> 1) - 60;
btRun->Top = CH - 20;
btRun->Left = CW - 120;
int OW = sgTable->Width;
sgTable->Width = CW;
sgTable->Height = CH - 40;
sgTable->ColWidths[0] = sgTable->ColWidths[0] * CW / OW;
sgTable->ColWidths[1] = sgTable->ColWidths[1] * CW / OW;
sgTable->ColWidths[2] = sgTable->ColWidths[2] * CW / OW;
SendMessage(sgTable->Handle, WM_SETREDRAW, 1, 0);
}


всё, что на bt - кнопки, что на sg - таблица
Таблица используется в не самом лучшем месте: http://tarasber.narod.ru/calc.PNG, да, просто такая организация мне показалась логичной.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Ты делаешь работу вместо компилятора?

Вообще-то это делается ни разу не так (нет необходимости пересчитывать все вручную каждый раз). Один раз располагаешь StringGrid и кнопки как тебе нужно, и устанавливаешь нужные Anchor-ы (у СтрингГрида и у кнопок) в True, тогда как бы ты не изменил размеры формы, элементы с установленными Якорями будут располагаться на ней точно так же друг относительно друга, как и первоначально (что тебе и надо, не так ли?). Единственное, о чем тебе останется позаботиться - это чтобы изменялась ширина столбцов Грида при изменении ширины самого Грида.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 4.10.2009 20:11) *

Ты делаешь работу вместо компилятора?

Недоверчивый я...
Цитата
Один раз располагаешь StringGrid и кнопки как тебе нужно, и устанавливаешь нужные Anchor-ы (у СтрингГрида и у кнопок) в True, тогда как бы ты не изменил размеры формы, элементы с установленными Якорями будут располагаться на ней точно так же друг относительно друга, как и первоначально (что тебе и надо, не так ли?). Единственное, о чем тебе останется позаботиться - это чтобы изменялась ширина столбцов Грида при изменении ширины самого Грида.

Да, я это сделал, но я всё равно вижу, как, например, при развороте на весь экран, кнопки не спеша, одна за другой, переползают вниз.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.04.2024 13:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name