![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прорисовка по скроллингу в TStringGrid!
operator © (2007-12-13 10:48:00)Всем доброго времени суток!,
можно ли отловить событие скроллинга у TStringGrid?
Германн (2007-12-25 01:20:00) [1]
> Ezorcist (24.12.07 22:30) [21]
Тебе нужен геморрой? Есть более простые способы его заполучить.
> Так все-таки событие по окончнанию перерисовки можно отловить?
Да можно. Отлавливай WM_ENDSESSION. После него уже не будет перерисовок. :)
Ezorcist (2007-12-24 22:30:00) [2]Так все-таки событие по окончнанию перерисовки можно отловить? Т.е. во время перерисовки каждой отдельной, заполнить ее номер в массив, потом когда все перерисовалось - нарисовать что-нибудь самому, в зависимости от того, какие ячейки надо перерисовывать и сбросить массив?
Германн (2007-12-17 00:58:00) [3]
> Всего лишь безболезненную и легкую реализацию объединения
> ячеек по горизонтали в стандартном гриде.
Сам же уже не один раз сказал что "безболезненно и легко" такое не проходит. Только специальные потомки стандартных гридов под это заточены. И достаточно посмотреть их исходники, как становится понятно, что легкой жизни не бывает.
P.S. Смотрел когда-то исходники от Д. Большакова.
{RASkov} (2007-12-16 22:01:00) [4]> [18] Германн © (16.12.07 20:25)
> Нуууу. Много хотите сударь.
Всего лишь безболезненную и легкую реализацию объединения ячеек по горизонтали в стандартном гриде.
т.е. нарисовать 3Dлинии рамки в нужных местах - не проблема, а вот вывод текста в обедененые ячейки вот это да...
:)
Можно конечно извернуться, и подготовить битмап размером с объеденненые ячейки, на который вывести текстовую строку, и потом битмап "порезать" на ячейки и просто выводить - "в свою ячейку - свой кусок битмапа". И так для каждых объедененных ячеек свой битмап....)
Германн (2007-12-16 20:25:00) [5]
> {RASkov} © (16.12.07 19:55) [17]
Нуууу. Много хотите сударь.
Я же обещал лишь точно также, а не как в [14].
:)
{RASkov} (2007-12-16 19:55:00) [6]И чтоб было похоже на то как в моем примере, но разумеется без все тех "глюков", что присутствуют в коде [10]...
или как на нижнем "рисунке" в [14])
{RASkov} (2007-12-16 19:53:00) [7]>
> Точно так же можно было бы объединить ячейки и по горизонтали.
Вот и хотелось бы увидеть именно эту реализацию :)
И чтоб было похоже на то как в моем примере, но разумеется без все тех "глюков", что присутствуют в коде [10] или нижний "рисунок" в [14])
Германн (2007-12-16 19:47:00) [8]
> Грид точно стандартный? или потомок от стандартного(т.е.
> доработанный)?
Это практически стандартный TDBGrid. Нестандартная там только реакция на колесо мышки, поскольку эту недоработку Борланд устранил только в Д2005.
> Хоть и не совсем понятно, что же там на рисунке,
Ячейки в крайнем левом столбце объединены по некоторому критерию, чтобы разделить записи в наборе на группы.
Точно так же можно было бы объединить ячейки и по горизонтали.
{RASkov} (2007-12-16 19:30:00) [9]> [13] Германн © (16.12.07 19:01)
:)
> Отнюдь. Для меня это легко и безболезненно.
Это замечательно) Значит я не совсем прав... а может и совсем не прав(
> Вот так я объединял ячейки
Хоть и не совсем понятно, что же там на рисунке, но....
Грид точно стандартный? или потомок от стандартного(т.е. доработанный)?
> > А как текст выводить в "две спаренные" ячейки, тоже кусками?
> А в чем проблема?
Впрочем я что-то так и не понял про то, как текст вывести каждый кусок только в своей ячейке, например пол слова в одной а оканчание слова в соседней...(
С другой стороны на рисунке не видно что бы текст объеденялся в ячейках..... там просто "гру" в одной ячейке а "ппа" в соседней снизу а вот "разделительной полосы" у этих ячеек нет и так далее....
--------------
| гру |_____
| ппа |_____
|_____|
|_____|_____
Что-то вырозится не получилось, но..... это не то о чем я...)
А я вот а каком выводе тексата в объеденененных ячейках:
_______________________
|__ обедененные ячейки__|
|_______|______|______|
Германн (2007-12-16 19:01:00) [10]
> А как текст выводить в "две спаренные" ячейки, тоже кусками?
А в чем проблема?
> Не для этого он(стандартный грид), что бы ячейки в нем спаривать
> легко и безболезненно
Отнюдь. Для меня это легко и безболезненно.
Вот так я объединял ячейки http://webfile.ru/1643667
{RASkov} (2007-12-16 18:42:00) [11]> [11] Германн © (16.12.07 17:58)
> Просто пример плохой.
А я и не спорю)
> Не надо в OnDrawCell рисовать в других ячейках. А для "объединения"
> ячеек в заголовке достаточно лишь самостоятельно прорисовывать
> рамку в ячейке, рисуя в каждом конкретном случае только
> нужные части этой рамки.
А как текст выводить в "две спаренные" ячейки, тоже кусками?
Не для этого он(стандартный грид), что бы ячейки в нем спаривать легко и безболезненно
:)
Германн (2007-12-16 17:58:00) [12]
> В общем - это пример, наверное, того, как это нуторно релизовать
> в стандарном контроле, не предназначеном для этого, объединения
> ячеек.
>
Просто пример плохой. Не надо в OnDrawCell рисовать в других ячейках. А для "объединения" ячеек в заголовке достаточно лишь самостоятельно прорисовывать рамку в ячейке, рисуя в каждом конкретном случае только нужные части этой рамки.
{RASkov} (2007-12-16 16:07:00) [13]> [9] Ezorcist (16.12.07 15:13)
> или каждая ячейка должна рисовать в приделах своего rect
Да, именно так!
> и никак от этого не уйти?
Ну почему.... можно и немного поизвращаться.... только грид тебе придется полностью самому рисовать :( Ну а как ты хотел? :)
Попробуй вот такое:
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.DefaultDrawing:=False;
StringGrid1.GridLineWidth:=0;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
with TStringGrid(Sender) do begin
if (ACol<FixedCols) or (ARow<FixedRows) then begin //Рисуем фиксированные ячейки
if ARow>=FixedRows then DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH)
else if ODD(ACol) then begin
Rect.Right:=Rect.Right+(Rect.Right-Rect.Left);
DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH);
Canvas.Brush.Style:=bsClear;
DrawText(Canvas.Handle, 'Длинный заголовок', -1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
end else begin //Рисуем остальные ячейки
if (ACol=3) and (ARow=2) then Exit; //не рисуем, если эту ячейку нарисовали в "другом событии"....
if (ACol=2) and (ARow=2) then begin
Rect.Right:=Rect.Right+(Rect.Right-Rect.Left);
Canvas.Brush.Style:=bsClear;
DrawText(Canvas.Handle, 'Объедененная ячейка', -1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end else Canvas.Rectangle(Rect);
end;
end;
end;
В данном примере есть один большой минус - не учитывается скролл, т.е. те ячейки, что рисуются в "чужом" событии, так и будут не перерисованы, пока не перерисуются те ячейки в чьих.... блин, ну ты понял :)
Данный минус тоже можно обойти, но это еще ни один десяток строк кода, а может и больше :)
В общем - это пример, наверное, того, как это нуторно релизовать в стандарном контроле, не предназначеном для этого, объединения ячеек.
Ezorcist (2007-12-16 15:13:00) [14]
> ...надеюсь за пределы параметра Rect не выходим при рисовании?
>
>
Вот именно, что выходим. Хотелось бы в заголовке нарисовать через несколько ячеек. если бы отловить событие "после перерисовки", то можно было бы и повер нанести.
или каждая ячейка должна рисовать в приделах своего rect и никак от этого не уйти?
{RASkov} (2007-12-15 11:43:00) [15]> [7] Ezorcist (15.12.07 09:15)
> А есть событие, возникающее после перерисовки грида?
А для чего? Что бы его опять перерисовать? :) И опять.... и опять..... и опять....
:о)
Ответь на вопрос ЮЮ в [6].... или задай нормально конечный вопрос в целом)
Да..
> поставил перерисовку некотрых ячеек на OnDrawCell
...надеюсь за пределы параметра Rect не выходим при рисовании?
Ezorcist (2007-12-15 09:15:00) [16]А есть событие, возникающее после перерисовки грида?
ЮЮ (2007-12-14 08:59:00) [17]> [5] Ezorcist (14.12.07 08:28)
> поставил перерисовку некотрых ячеек на OnDrawCell,
А почему не всех?
> а если тащить ползунок - оставются артефакты
Естественно, ведь не все перерисовавается или перерисовывается неправмльно.
Ezorcist (2007-12-14 08:28:00) [18]У меня таже проблема - поставил перерисовку некотрых ячеек на OnDrawCell, когда таблица прокручиваетася нажатием на кнопки прокрутки - все ok, а если тащить ползунок - оставются артефакты
Германн (2007-12-14 02:12:00) [19]
> Прорисовка по скроллингу в TStringGrid!
>
> operator © (13.12.07 10:48)
>
> Всем доброго времени суток!,
>
> можно ли отловить событие скроллинга у TStringGrid?
>
!Прорисовку" нужно выполнять не "по скроллингу", а "по необходимости". О чем знает система. И в любом случае для прорисовки есть соответствующий обработчик OnDrawCell.
Nil (2007-12-14 01:46:00) [20]в TStringGrid нет такого. Есть в TJvStringGrid из пакета JEDI VCL, и вообще там очен много полезных фич