Forum Replies Created
-
AuthorPosts
-
elpikParticipant'duhar' wrote:
Так показывается подсказка только к выбранной строке ComboBox. А я имел ввиду подсказки для длинных строк в раскрывающемся списке. Чтобы при небольшой ширине комбобокса видеть наглядно что именно выбираешь.
возможно вас устроит такое решение? Менять комбобоксы для этого не нужно.
Code://меняет ширину выпадающего списка комбобокса ———————————-
procedure TfrmMainPolis.DropDownWidth(Sender: TObject);
var
CBox: TsComboBox;
Width: Integer;
I, TextLen: Longint;
lf: LOGFONT;
f: HFONT;
begin
CBox := (Sender as TsComboBox);
Width := CBox.Width;
FillChar(lf,SizeOf(lf),0);
StrPCopy(lf.lfFaceName, CBox.Font.Name);
lf.lfHeight := CBox.Font.Height;
lf.lfWeight := FW_NORMAL;
if fsBold in CBox.Font.Style then
lf.lfWeight := lf.lfWeight or FW_BOLD;f := CreateFontIndirect(lf);
if (f <> 0) then
try
CBox.Canvas.Handle := GetDC(CBox.Handle);
SelectObject(CBox.Canvas.Handle,f);
try
for i := 0 to CBox.Items.Count-1 do begin
TextLen := CBox.Canvas.TextWidth(CBox.Items);
if CBox.Items.Count-1 > CBox.DropDownCount then
begin
if TextLen > Width-25 then
Width := TextLen +25;
end
else if CBox.Items.Count-1 <= CBox.DropDownCount then
begin
if TextLen > Width-5 then
Width := TextLen+8;
end;
end;
finally
ReleaseDC(CBox.Handle, CBox.Canvas.Handle);
end;
finally
DeleteObject(f);
end;
SendMessage(CBox.Handle, CB_SETDROPPEDWIDTH, Width, 0);
end;вызывается так:
Code:procedure TfrmMainPolis.cboxGrajdDropDown(Sender: TObject);
begin
DropDownWidth(cboxGrajd);
end;Выглядит так:
elpikParticipant'Support' wrote:Спасибо.
Попробовал потестить под Delphi 7, но сходу нарвался на сообщения :
Code:[Error] acDBGrid.pas(1267): Undeclared identifier: 'DrawCellBackground'
[Error] acDBGrid.pas(1417): Undeclared identifier: 'gdPressed'
[Error] acDBGrid.pas(1417): Incompatible types: 'Enumeration' and 'Integer'
[Error] acDBGrid.pas(1949): Too many actual parametersИзвиняюсь за долгое отсутствие, ошибки исправил. Проверял на 5-рке и XE.
Файл прикладываю.
Если есть пожелания или замечания пишите (впредь буду стараться отвечать быстро). Спасибо вам за вашу поддержку.
elpikParticipantИзвиняюсь за задержку. не было возможности вылезти в инет.
Вот модуль с Англ коментами. (прошу прощения за мой очень плохой английский).
Перевел как смог.
Если будут замечания пишите буду исправлять.
С уважением elpik.
elpikParticipant'VahaC' wrote:Мой тебе совет возьми стандартную процедуру отрисовки айтема у альфовского грида и переделай под свои нужды
Да документации конечно по ф-циях отрисовки не хватает, сам наступал на эти грабли 🙁 теперь обхожу их способ описанным выше.
в том то и проблема… не могу найти
все что понял для стандартной ячейки стоит
Code:inherited DrawCell(ACol, ARow, ARect, AState);– а это уже метот из DBGrid.pas – VCL-Delphi
и так не смог найти где закрашивается ячейка.
elpikParticipantспасибо за ответ, но вопросов только прибавилось 🙂
вот ветка форума: http://www.alphaskins.com/forum/index.php?showtopic=812
в частности описание:
Quote:Posted 31 January 2006
procedure PaintItemBG(SkinIndex : integer; SkinSection : string; ci : TCacheInfo; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap); overload;
procedure PaintItemBG(SkinData : TsCommonData; ci : TCacheInfo; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap); overload;
procedure PaintItemBGFast(SkinIndex, BGIndex, BGHotIndex : integer; SkinSection : string; ci : TCacheInfo; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap);
procedure PaintItem(SkinIndex : integer; SkinSection : string; ci : TCacheInfo; Filling : boolean; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap); overload;
procedure PaintItem(SkinIndex : integer; SkinSection : string; ci : TCacheInfo; Filling : boolean; State : integer; R : TRect; pP : TPoint; DC : HDC); overload;
procedure PaintItem(SkinData : TsCommonData; ci : TCacheInfo; Filling : boolean; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap; UpdateCorners : boolean); overload;
procedure PaintItemFast(SkinIndex, MaskIndex, BGIndex, BGHotIndex : integer; SkinSection : string; ci : TCacheInfo; Filling : boolean; State : integer; R : TRect; pP : TPoint; ItemBmp : TBitmap); overload;
Семейство процедур PaintItem, PaintItemFast, PaintItemBG, PaintItemBGFast по своей сути похожи, отличаються они и в основном в параметрах. Кроме того, процедура PaintItem рисует элемент управления или его часть в соответствии со свойствами, задаваемыми в скине. Т.е. рисуется контрол, но без текста, иконок, и т.д.
PaintItemBG рисует только фон контрола. Итак, рассмотрим параметры:
SkinIndex – индекс скина данного элемента управления, с помощью которого можно найти его свойства в массиве скина, состоящем из TsGeneralData. Этот индекс определен всегда для каждого элемента управления и находится в
Control.SkinData.SkinIndex.
ВАЖНО: процедура с параметром SkinIndex устаревает и желательно использовать другую процедуру, где сразу передается SkinData, а процедуры с SkinIndex используються в основном для рисования элементов, когда SkinData не заданно, например для закладок или пунктов меню.
MaskIndex – индекс маски данного элемента управления. Используйте свойство SkinData.BorderIndex.
BGIndex, BGHotIndex – индексы скина бэграунда данного элемента управления и индекс скина бэкграунда элемента управления в состоянии hot.
Используйте для его проеделения function GetPatternIndex(SkinIndex : integer; SkinSection, pattern : string) : integer; (sStyleCimply.pas)
pattern – строка, определяющая тип шаблона, например, для определения BGIndex она будет 'PATTERN', а для BGHotIndex – 'HOTPATTERN'.
SkinSection – отвечает за то, какой стиль будет применен для отображаемого элемента управления. Например, может быть SkinSection = 'EDIT' или SkinSection = 'PANEL'.
ci : TCacheInfo – структура, хранящая информацию об изображении родительского элемента управления. Чтобы заполнить данную структуру, можно вызвать функцию GetParentCache из модуля sCommonData.
Если ci.Ready = True, то это значит, что можно использовать ci.Bmp для копирования изображения родительского контрола. Иначе – такого изображения нет и контрол нужно рисовать без прозрачности.
ci.X и ci.Y – если необходимо смешение для копирования фона парента.
Filling определяет, заполнять середину прямоугольника куском маски или нет.
На больших контролах (например, на панелях) использование не целесообразно. Т.е. целесообразно если размеры контрола небольшие.
State – состояние контрола. Используйте function ControlIsActive(SkinData : TsCommonData): boolean; для его определения. Если контрол активен, то State больше 0, если 2 – если контрол нажат.
Следующее выражение вернет значение состояния – State := integer(ControlIsActive(SkinData)) + integer(ControlIsPressed);
R – прямоугольник, в котором рисовать;
pP – верхняя левая координата контрола (актуально при рисовании прозрачного фона);
ItemBmp – Bitmap в котором рисовать.
Какую из этих процедур использовать?
SkinSection – какую секцию взять? (в последней версии секции перестали быть выпадающим списком, и не понятно где взять весь список?)
в каком юните есть описание констант всех секций? (например s_Button, s_Edit, s_Panel)
sStyleCimply.pas – например в acDBGrid не используется, откуда брать параметры BGIndex, BGHotIndex
ci : TCacheInfo – вообще непонятная структура…
ItemBmp – “Bitmap в котором рисовать.” – что это означает? если все процедуры рисуют на канве?
Теперь осталось, как-то, все это совместить с отрисовкой обычной ячейки грида.
на данный момент я реализовал следующее:
Code:procedure TfrmPrimeExp.grdChildDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var XOffset: Integer;
begin
inherited;
if Column.FieldName = 'STATUS_FIN' then
begin
if Column.Field.Value = 1 then
begin
//FillDC(grdChild.Canvas.Handle, Rect, sSkinProvider1.SkinData.SkinManager.GetActiveEditColor)
XOffset := Trunc((Rect.Right – Rect.Left – 16)/2);
frmDataModule.imgLstButtons.Draw(grdChild.Canvas, Rect.Left + XOffset, Rect.Top+1, 14);
end;
end;
end;картинка тупо рисуется поверх текста 0 или 1, отрисовкой ячейки занимается сам грид.
elpikParticipantвопрос решился следующим образом:
у TImageList есть свой метод рисования на канве (и он прекрасно рисует картинки с прозрачным фоном):
Code:frmDataModule.imgLstButtons.Draw(grdChild.Canvas, Rect.Left + XOffset, Rect.Top+1, 14);Однако остался вопрос как залить активную ячейку правильным цветом фона?
elpikParticipant'Smolensky' wrote:В моем проекте для некоторых окон нет смысла предусматривать кнопки Minimize и Maximize, для них хватает одной кнопки Close. Соответственно, если использовать для заголовка показанный выше шаблон, на месте двух кнопок возникнет пустое место, не очень эстетичное. Поэтому нужна пара вот таких заголовков:
Когда я использовал компоненты от ThemeEngine, то проблема решалась просто: окнам второго типа присваивалось BorderStyle=bsToolWindow, а в скине для них организовывался свой шаблон. С AlphaControls я этого сделать, к сожалению, не могу. Было бы очень неплохо заиметь такую возможность в следующих версиях. А на данный момент – хотя бы суметь задать заголовки одинаковой толщины.
Была у меня мысль, попробовать нарисовать кнопки размером с заголовок вместе с серыми краями….
Т.е. сам заголовок однородный и заливается полностью фиолетовым а потом поверх рисуются кнопки полностью перекрашивая края заголовка.
Но такой способ вряд-ли прокатит. плюс реакция на нажатие будет сдвигать кнопку вместе с краями… в общем “не эстетично” 🙂
elpikParticipantа если открыть и скомпилировать мой проект он тоже не работает?
и кстати какая у Вас версия IDE и Альфаскинов?
elpikParticipant'Smolensky' wrote:Я в предельно ясной форме написал, что ПРОБОВАЛ воспользоваться этим свойством, но безуспешно. Читайте внимательнее.
Не знаю что там у Вас не получилось но вот результат простенького теста…
Проект тоже прикладываю.
[attachment=4959:111.jpg]
Большая картинка[attachment=4960:TestIco2.png] —- Картинка 18х18
[attachment=4961:TestIco3.jpg] —- Таже картинка 32х32
elpikParticipantУ SkinProvaider есть свойство TitleIcon – попробуйте воспользоваться им. Я както засунул туда картинку размером 256 на 256. она на пол формы вылезла 🙂
И стоит учесть что она рисуется одной их первых, потому если картина большая то она окажется перекрыта контролами формы.
elpikParticipantВечер добрый.
Сегодня снова копался в модуле грида… Мне никак не давала покоя проблема нахлестки объеденных заголовков при перерисовке…
(это видно на верхнем рисунке /правильно нарисована только последняя колонка а все предыдущие получают нахлестку от верхнего уровня в виде линии).
плюс иногда при включенных скинах можно было увидеть размытость текста, т.к. он также рисовался для каждой колонки повторно…
Сегодня эти проблемы я исправил.
Теперь объединенный уровень заголовка рисуется только 1 раз в самом начале, (при включенных скинах) и игнорируется в следующих.
Текст же наоборот. рисуется в самой последней колонке объединенного уровня заголовка… это дало положительный результат в рантайме.
(для отключенных скинов метод отрисовки заголовков остался прежним т.к. в этом случае обновление заголовков происходит по другому и перерисовка колонок может проходить бессвязно от соседних, что заставляет перерисовывать заголовок целиком всегда.)
Теперь этих проблем нет и грид заполняется как положено.
(В дизайн тайме можно наблюдать интересную картину, объеденные заголовки заполняются интересным способом. первая часть объединенного заголовка, заполняется как положено при включенных скинах, а остальные как при отключенных, что приводит к мысли о том что свойства SkinManagera отличаются в рантайме и дизайнтайме. Но это не особо важно, в рантайме грид работает как положено).
Теперь о дополнениях:
Добавлено 2 свойства
MaxColumnWidth и MinColumnWidth – они задают пределы изменения ширины колонок, соответственно макс. ширина и мин. ширина по умолчанию = 0
(эти свойства действуют при изменении ширины колонки, однако игнорируются при включении свойства AutoSizeColums, т.к. в этом случае есть 2 пограничных состояния которые не вписываются в правила
1- число колонок с мин. шириной суммарно дают большую ширину чем ширина грида…
2- число колонок с макс. шириной суммарно дают меньшую ширину чем ширина грида…).
За сим все, модуль грида прилагаю.
Если будут замечания пишите буду исправлять.
ЗЫ: С уважением elpik.
elpikParticipant'Smolensky' wrote:Было бы неплохо.
Нынешние заголовки одинаковы – но, кажется, неодинакова их толщина. Заголовки диалоговых окон тоньше. Нет ли способа сделать их той же толщины, что и у других окон?
Самое простое, не использовать BorderStyle=bsToolWindow. Чем не устраивают стандартные окна?
elpikParticipant'Smolensky' wrote:Если в программе наряду с главным окном открыть еще какое-нибудь, свернуть всё в панель задач, дать там полежать несколько минут, а потом вернуть на экран, то довольно часто отрисовывается лишь одно окно, неглавное. Главное же не удается увидеть никакими ухищрениями. Проблему наблюдаю как сам, так и глазами бета-тестеров. Как под семеркой, так и под XP. Один раз было, что от главного окна нарисовались лишь некоторые элементы, а на месте всего остального – прозрачное место.
Нет ли готовых рецептов борьбы с такой напастью?
v7.34, Delphi 6
а примерчик можете выложить?
elpikParticipantПришлось покопаться в модуле acDBGrid, внес кое какие изменения.
Итоговый вариант модуля:
Корректно рисует объединенные заголовки (с нужным выравниванием), центрирует текст заголовка по вертикали (если высота больше 1 линии), автоматически переносит по словам заголовок если влезает по высоте (если не влезает пишет одной строкой с троеточием), понимает перевод строки в заголовке. Позволяет менять высоту строки(уровня) заголовка через свойство TitleHeight.
Автоматически подгоняет ширину колонок по ширине грида (если включить AutoSizeColums) с нужным видом выравнивания (по свойству AutosizeColumnIndex).
Добавлены свойства:
AutoSizeColums: boolean; – (вкл/выкл автоматического подбора ширины колонок, по умолчанию False)
AutosizeColumnIndex: integer – (Индекс колонки которая будет автоматически подгоняться по ширине. -1 – подгоняет ширину всех колонок пропорционально, -2 – подгоняет ширину последней видимой колонки по умолчанию -1).
LevelAlignment: TAlignment – (Определяет выравнивание объедененных заголовков, по умолчанию taCenter)
TitleHeight: integer – (определяет высоту строки заголовка в пикселях, что позволяет задать произвольный размер строки заголовка полезно при длинных названиях т.к. будет переносить по словам по умолчанию = 17)
Тестируйте, смотрите. Если будут замечания пишите, буду исправлять.
Модуль грида прилагаю.
ЗЫ: С уважением elpik.
[attachment=4948:TestTsDBGrid.png]
elpikParticipantCode:function TaskBarAddIcon(hWindow: THandle; ID: Cardinal;
ICON: hicon; CallbackMessage: Cardinal; Tip: string): Boolean;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon := Icon;
if Length(Tip) > 63 then
SetLength(Tip, 63);
StrPCopy(szTip, Tip);
end;
Result := Shell_NotifyIcon(NIM_ADD, @NID);
end;или вот, если лень разбираться.
elpikParticipant'Smolensky' wrote:Хотелось бы все же дождаться ответа от уважаемого автора. Метод тыка, к сожалению, только отнимает время, а результатов не приносит. Если можно сделать такую пару заголовков, то не поленитесь обьяснить, как именно это следует делать. Если нельзя – то скажите открытым текстом: нельзя.
Какой Вы ленивый… Ладно приду домой попробую нарисовать вам такой заголовоек на основе какого нибудь готового скина (поменяю только заголовок окна). 🙂
elpikParticipantНу, надо экспериментировать.
Скажем есть такое предположение
Выставь грвницы заголовка примерно такими. как я очертил красным. и а середину сделай растягиваемой. и тогда у тебя должно получиться то что ты хочешь но для активного и неактивного рисунка нужно иметь разные макеты. т.е. активный синий а неактивный серый… ну примерно такие мысли у меня.[attachment=4917:form_caption2.gif]
elpikParticipant'Smolensky' wrote:Мануал этот я читал много раз вдоль и поперек, чуть не наизусть выучил. Но все равно не понял, как задать координаты заголовка пассивной формы. Нельзя ли это здесь разъяснить, чтобы всем стало понятно? Думаю, такая проблема не у одного меня.
Почему не желаете использовать цветовую заливку для пассивного заголовка? Редактор вроде как позволяет причем можно прозрачность настраивать.
elpikParticipantДа посмотрел на грид повнимательней. Действительно “неправильная” отрисовка заголовка связана со свойством ReduceFlicker – оно включает метод отрисовки сложных заголовков (который отличается от стандартного). В результате страдает скин. Спасибо за инфу. Получается что такой грид безболезненно можно юзать только при DrawingStyle = gdsClassic – Хотябы в цвет попадает.
Демку прикладываю.
elpikParticipant'Support' wrote:Проблема в заголовках связана с багом в самом гриде. Слетает рисование градиента при DrawingStyle = gdsGradient когда активируется DataSource (не важно – есть AlphaSkins или нет)
Этот стиль рисования используется скинами для рисования заголовков, другого способа их изменить нет.
А комбобоксы у меня в этой демке имеют одинаковое поведение – при первом выпадании списка он выпадает одной строкой, а при последующих уже как надо.
в v7.42 вродебы баг комбобокса побороли. Теперь выпадает как надо. И еще вопрос почему в демке 7.42 при сворачивании и развертке окна в комбобоксе не появляется вертикальная полоса рядом с кнопкой а в проекте появляется?
По поводу грида, посмотрю еще раз позже отпишусь.
-
AuthorPosts