Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26170
Рейтинг: 2127
#16: 2012-03-01 19:18:18 ЛС | профиль | цитата
Netspirit писал(а):
Вот теперь оно всё правильно высчитывает

Да, правильно. Но вот это



SetWindowPos( CB.Handle, 0, 0, 0, CB.Width, H * (IC + 2) + 2,
SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_NOREDRAW +
SWP_HIDEWINDOW);

{SetWindowPos( CB.Handle, 0, 0, 0, CB.Width, CB.Height * (IC + 1) + 2,
SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_NOREDRAW +
SWP_HIDEWINDOW);}

SetWindowPos( CB.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
+ SWP_NOZORDER + SWP_NOACTIVATE
+ SWP_NOREDRAW + SWP_SHOWWINDOW);

лучше заменить вот на это, будет более правильно



MoveWindow(CB.Handle, CB.Left, CB.Top, CB.Width, H * (IC + 2) + 2, false);
карма: 22

0
Ответов: 4631
Рейтинг: 749
#17: 2012-03-01 19:29:40 ЛС | профиль | цитата
Согласен. Я просто выдрал из KOL-а как есть.
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#18: 2012-03-01 19:54:34 ЛС | профиль | цитата
Добавлено на SVN
карма: 22

0
Ответов: 4631
Рейтинг: 749
#19: 2012-03-01 20:05:44 ЛС | профиль | цитата
Только осторожно, я выкладывал коды из какой-то из сборок, возможно после этого на SVN были обновления.
И не забываем, что не работает с компонентом StyleXP.
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#20: 2012-03-01 20:35:05 ЛС | профиль | цитата
Netspirit писал(а):
я выкладывал коды из какой-то из сборок, возможно после этого на SVN были обновления

Это я учел
Netspirit писал(а):
И не забываем, что не работает с компонентом StyleXP

Оно и до исправления не работало. Надо бы найти как программно переловить включение XP стиля
карма: 22

0
Ответов: 1376
Рейтинг: 197
#21: 2012-03-01 21:04:30 ЛС | профиль | цитата
Может так?
code_27050.txt
карма: 1

0
файлы: 1code_27050.txt [4KB] [397]
Разработчик
Ответов: 26170
Рейтинг: 2127
#22: 2012-03-02 11:53:49 ЛС | профиль | цитата
foksov писал(а):
Может так?

Не, не подходит. Нужно определение не включенных тем, а наличие включенного манифеста у приложения
------------ Дoбавленo в 11.53:
Добавил на SVN совместимость DropDownCount со стилем XP
карма: 22

0
Ответов: 4631
Рейтинг: 749
#23: 2012-03-02 12:24:27 ЛС | профиль | цитата
nesco, по-моему, лишний код. Достаточно было бы этого:


#pas
procedure THIComboBox.Init;
var Flags:TComboOptions;
begin
Flags := [{coNoIntegralHeight}];
if (_prop_ReadOnly = 0) then include(Flags,coReadOnly);
if _prop_Sort then include(Flags,coSort);
if ManFlags and $8 > 0 then include(Flags,coOwnerDrawFixed);
Control := NewCombobox(FParent,Flags);
Control.OnMeasureItem:= _OnMeasureItem;

Control.Perform(CB_SETMINVISIBLE, _prop_DropDownCount, 0); // <<<< ===
Control.OnDropDown := _OnDropDown;


inherited;
SetStrings(_prop_Strings);
with Control{$ifndef F_P}^{$endif} do
begin
if (_prop_ReadOnly <> 0) then OnChange := _OnChange;
Text := _prop_Text;
OnSelChange := _OnClick;
if ManFlags and $8 > 0 then OnDrawItem := _OnDrawItem;
if (Count > 0) and (_prop_ReadOnly = 0) then CurIndex := 0;
end;
end;

procedure THIComboBox._work_doDropDownCount;
begin
_prop_DropDownCount := ToInteger(_Data);
Control.Perform(CB_SETMINVISIBLE, _prop_DropDownCount, 0); // <<<< ===
end;

То-есть, функция GetComCtlVersion лишняя.
Или я не учел каких-то нюансов?
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#24: 2012-03-02 12:41:43 ЛС | профиль | цитата
Netspirit писал(а):
Или я не учел каких-то нюансов?

А ты читал, что я писал раньше по топику
nesco писал(а):
Можно, но только с XP стилем. С обычным стилем это работать не будет, нужен обязательно включенный манифест стилей, который включает comctl32.dll version 6

Те сообщение CB_SETMINVISIBLE работает только c comctl32.dll version 6, которое включается при выставлении манифеста компонентом StyleXP

Первоисточник:
MSDN писал(а):
To use CB_SETMINVISIBLE, the application must specify comctl32.dll version 6 in the manifest

карма: 22

0
Ответов: 4631
Рейтинг: 749
#25: 2012-03-02 14:09:18 ЛС | профиль | цитата
Так я ж предложил объединить. Я выложил код, работающий с/без стиля. Проверь.
То-есть, стиль есть - работает строка
Control.Perform(CB_SETMINVISIBLE, _prop_DropDownCount, 0);

стиля нет - работает фрагмент с установкой высоты в OnDropDown.
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#26: 2012-03-02 14:23:41 ЛС | профиль | цитата
Netspirit писал(а):
Так я ж предложил объединить. Я выложил код, работающий с/без стиля

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



// === DropDownCount === //
procedure THIComboBox._OnDropDown( Sender: PObj );
var
CB: PControl;
IC: Integer;
H: Integer;
begin
CB := PControl( Sender );
IC := CB.Count;
if IC > _prop_DropDownCount then IC := _prop_DropDownCount;
if IC < 1 then IC := 1;

// if (GetComCtlVersion and $FFFF0000) shr 16 >= 6 then
CB.Perform(CB_SETMINVISIBLE, IC, 0);
// begin
H := CB.Perform(CB_GETITEMHEIGHT, 0, 0);
MoveWindow(CB.Handle, CB.Left, CB.Top, CB.Width, H * (IC + 2) + 2, false);
// end
end;
Все остальное не меняем

Но я бы так делать не стал

карма: 22

0
Ответов: 4631
Рейтинг: 749
#27: 2012-03-02 14:30:10 ЛС | профиль | цитата
nesco, сообщение нужно слать не в _OnDropDown, а только тогда, когда меняется свойство DropDownCount, а именно в THIComboBox.Init и THIComboBox._work_doDropDownCount. Это самый оптимальный вариант с минимальными затратами.
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#28: 2012-03-02 14:37:59 ЛС | профиль | цитата
Netspirit писал(а):
Это самый оптимальный вариант с минимальными затратами

А блок развертки _OnDropDown будет молотить при любых стилях, оригинально
карма: 22

0
Ответов: 4631
Рейтинг: 749
#29: 2012-03-02 14:40:31 ЛС | профиль | цитата
А вот это уже другое дело. Решай сам. Но если уж на то пошло, то это свойство можно было бы прямо в KOL вписать, так как там эта обработка OnDropDown продублирована, и то не самым лучшим образом.
карма: 26

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#30: 2012-03-02 14:45:12 ЛС | профиль | цитата
ИМХО. В таком случае лучше сделать вообще вот так



procedure THIComboBox.Init;
var Flags:TComboOptions;
begin
Flags := [{coNoIntegralHeight}];
if (_prop_ReadOnly = 0) then include(Flags,coReadOnly);
if _prop_Sort then include(Flags,coSort);
if ManFlags and $8 > 0 then include(Flags,coOwnerDrawFixed);
Control := NewCombobox(FParent,Flags);
Control.OnMeasureItem:= _OnMeasureItem;

// === DropDownCount === //
if (GetComCtlVersion and $FFFF0000) shr 16 >= 6 then
Control.Perform(CB_SETMINVISIBLE, _prop_DropDownCount, 0)
else
Control.OnDropDown := _OnDropDown;
// === ============ === //

inherited;
SetStrings(_prop_Strings);
with Control{$ifndef F_P}^{$endif} do
begin
if (_prop_ReadOnly <> 0) then OnChange := _OnChange;
Text := _prop_Text;
OnSelChange := _OnClick;
if ManFlags and $8 > 0 then OnDrawItem := _OnDrawItem;
if (Count > 0) and (_prop_ReadOnly = 0) then CurIndex := 0;
end;
end;

// === DropDownCount === //
procedure THIComboBox._OnDropDown( Sender: PObj );
var
CB: PControl;
IC: Integer;
H: Integer;
begin
CB := PControl( Sender );
IC := CB.Count;
if IC > _prop_DropDownCount then IC := _prop_DropDownCount;
if IC < 1 then IC := 1;
H := CB.Perform(CB_GETITEMHEIGHT, 0, 0);
MoveWindow(CB.Handle, CB.Left, CB.Top, CB.Width, H * (IC + 2) + 2, false);
end;

procedure THIComboBox._work_doDropDownCount;
begin
_prop_DropDownCount := ToInteger(_Data);
if (GetComCtlVersion and $FFFF0000) shr 16 >= 6 then
Control.Perform(CB_SETMINVISIBLE, _prop_DropDownCount, 0);
end;
------------ Дoбавленo в 14.45:
Netspirit писал(а):
Но если уж на то пошло, то это свойство можно было бы прямо в KOL вписать

Неее, KOL мы трогать не будем
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)