Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Прорисовка по скроллингу в TStringGrid!   Найти похожие ветки 

 
operator ©   (2007-12-13 10:48) [0]

Всем доброго времени суток!,

можно ли отловить событие скроллинга у TStringGrid?


 
morgoth   (2007-12-13 10:52) [1]

а что требуется то?


 
ЮЮ ©   (2007-12-13 10:54) [2]

А он разве не перерировывается? Тогда добавь goThumbTracking в Options грида


 
Nil   (2007-12-14 01:46) [3]

в TStringGrid нет такого. Есть в TJvStringGrid из пакета JEDI VCL, и вообще там очен много полезных фич


 
Германн ©   (2007-12-14 02:12) [4]


> Прорисовка по скроллингу в TStringGrid!
>
> operator ©   (13.12.07 10:48)
>
> Всем доброго времени суток!,
>
> можно ли отловить событие скроллинга у TStringGrid?
>

!Прорисовку" нужно выполнять не "по скроллингу", а "по необходимости". О чем знает система. И в любом случае для прорисовки есть соответствующий обработчик OnDrawCell.


 
Ezorcist   (2007-12-14 08:28) [5]

У меня таже проблема - поставил перерисовку некотрых ячеек на OnDrawCell, когда   таблица прокручиваетася нажатием на кнопки прокрутки - все ok, а если тащить ползунок - оставются артефакты


 
ЮЮ ©   (2007-12-14 08:59) [6]

> [5] Ezorcist   (14.12.07 08:28)


> поставил перерисовку некотрых ячеек на OnDrawCell,

А почему не всех?


> а если тащить ползунок - оставются артефакты

Естественно, ведь не все перерисовавается или перерисовывается неправмльно.


 
Ezorcist   (2007-12-15 09:15) [7]

А есть событие, возникающее после перерисовки грида?


 
{RASkov} ©   (2007-12-15 11:43) [8]

> [7] Ezorcist   (15.12.07 09:15)
> А есть событие, возникающее после перерисовки грида?

А для чего? Что бы его опять перерисовать? :) И опять.... и опять..... и опять....
:о)
Ответь на вопрос ЮЮ в [6].... или задай нормально конечный вопрос в целом)

Да..
> поставил перерисовку некотрых ячеек на OnDrawCell

...надеюсь за пределы параметра Rect не выходим при рисовании?


 
Ezorcist   (2007-12-16 15:13) [9]


> ...надеюсь за пределы параметра Rect не выходим при рисовании?
>
>


Вот именно, что выходим. Хотелось бы в заголовке нарисовать через несколько ячеек. если бы отловить событие "после перерисовки", то можно было бы и повер нанести.

или каждая ячейка должна рисовать в приделах своего rect и никак от этого не уйти?


 
{RASkov} ©   (2007-12-16 16:07) [10]

> [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;


В данном примере есть один большой минус - не учитывается скролл, т.е. те ячейки, что рисуются в "чужом" событии, так и будут не перерисованы, пока не перерисуются те ячейки в чьих.... блин, ну ты понял :)
Данный минус тоже можно обойти, но это еще ни один десяток строк кода, а может и больше :)
В общем - это пример, наверное, того, как это нуторно релизовать в стандарном контроле, не предназначеном для этого, объединения ячеек.


 
Германн ©   (2007-12-16 17:58) [11]


> В общем - это пример, наверное, того, как это нуторно релизовать
> в стандарном контроле, не предназначеном для этого, объединения
> ячеек.
>

Просто пример плохой. Не надо в OnDrawCell рисовать в других ячейках. А для "объединения" ячеек в заголовке достаточно лишь самостоятельно прорисовывать рамку в ячейке, рисуя в каждом конкретном случае только нужные части этой рамки.


 
{RASkov} ©   (2007-12-16 18:42) [12]

> [11] Германн ©   (16.12.07 17:58)
> Просто пример плохой.

А я и не спорю)

> Не надо в OnDrawCell рисовать в других ячейках. А для "объединения"
> ячеек в заголовке достаточно лишь самостоятельно прорисовывать
> рамку в ячейке, рисуя в каждом конкретном случае только
> нужные части этой рамки.

А как текст выводить в "две спаренные" ячейки, тоже кусками?

Не для этого он(стандартный грид), что бы ячейки в нем спаривать легко и безболезненно
:)


 
Германн ©   (2007-12-16 19:01) [13]


> А как текст выводить в "две спаренные" ячейки, тоже кусками?

А в чем проблема?

> Не для этого он(стандартный грид), что бы ячейки в нем спаривать
> легко и безболезненно

Отнюдь. Для меня это легко и безболезненно.
Вот так я объединял ячейки http://webfile.ru/1643667


 
{RASkov} ©   (2007-12-16 19:30) [14]

> [13] Германн ©   (16.12.07 19:01)

:)

> Отнюдь. Для меня это легко и безболезненно.

Это замечательно) Значит я не совсем прав... а может и совсем не прав(

> Вот так я объединял ячейки

Хоть и не совсем понятно, что же там на рисунке, но....
Грид точно стандартный? или потомок от стандартного(т.е. доработанный)?


> > А как текст выводить в "две спаренные" ячейки, тоже кусками?
> А в чем проблема?

Впрочем я что-то так и не понял про то, как текст вывести каждый кусок только в своей ячейке, например пол слова в одной а оканчание слова в соседней...(
С другой стороны на рисунке не видно что бы текст объеденялся в ячейках..... там просто "гру" в одной ячейке а "ппа" в соседней снизу а  вот "разделительной полосы" у этих ячеек нет и так далее....
--------------
| гру |_____
| ппа |_____
|_____|
|_____|_____


Что-то вырозится не получилось, но..... это не то о чем я...)
А я вот а каком выводе тексата в объеденененных ячейках:
_______________________
|__обедененные ячейки__|
|_______|______|______|


 
Германн ©   (2007-12-16 19:47) [15]


> Грид точно стандартный? или потомок от стандартного(т.е.
>  доработанный)?

Это практически стандартный TDBGrid. Нестандартная там только реакция на колесо мышки, поскольку эту недоработку Борланд устранил только в Д2005.


> Хоть и не совсем понятно, что же там на рисунке,

Ячейки в крайнем левом столбце объединены по некоторому критерию, чтобы разделить записи в наборе на группы.
Точно так же можно было бы объединить ячейки и по горизонтали.


 
{RASkov} ©   (2007-12-16 19:53) [16]

>
> Точно так же можно было бы объединить ячейки и по горизонтали.

Вот и хотелось бы увидеть именно эту реализацию :)
И чтоб было похоже на то как в моем примере, но разумеется без все тех "глюков", что присутствуют в коде [10] или нижний "рисунок" в [14])


 
{RASkov} ©   (2007-12-16 19:55) [17]

И чтоб было похоже на то как в моем примере, но разумеется без все тех "глюков", что присутствуют в коде [10]...
или как на нижнем "рисунке" в [14])


 
Германн ©   (2007-12-16 20:25) [18]


> {RASkov} ©   (16.12.07 19:55) [17]

Нуууу. Много хотите сударь.
Я же обещал лишь точно также, а не как в [14].
:)


 
{RASkov} ©   (2007-12-16 22:01) [19]

> [18] Германн ©   (16.12.07 20:25)
> Нуууу. Много хотите сударь.

Всего лишь безболезненную и легкую реализацию объединения ячеек по горизонтали в стандартном гриде.
т.е. нарисовать 3Dлинии рамки в нужных местах - не проблема, а вот вывод текста в обедененые ячейки вот это да...
:)
Можно конечно извернуться, и подготовить битмап размером с объеденненые ячейки, на который вывести текстовую строку, и потом битмап "порезать" на ячейки и просто выводить - "в свою ячейку - свой кусок битмапа". И так для каждых объедененных ячеек свой битмап....)


 
Германн ©   (2007-12-17 00:58) [20]


> Всего лишь безболезненную и легкую реализацию объединения
> ячеек по горизонтали в стандартном гриде.

Сам же уже не один раз сказал что "безболезненно и легко" такое не проходит. Только специальные потомки стандартных гридов под это заточены. И достаточно посмотреть их исходники, как становится понятно, что легкой жизни не бывает.
P.S. Смотрел когда-то исходники от Д. Большакова.


 
Ezorcist   (2007-12-24 22:30) [21]

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


 
Германн ©   (2007-12-25 01:20) [22]


> Ezorcist   (24.12.07 22:30) [21]

Тебе нужен геморрой? Есть более простые способы его заполучить.


> Так все-таки событие по окончнанию перерисовки можно отловить?

Да можно. Отлавливай WM_ENDSESSION. После него уже не будет перерисовок. :)



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1198725297
Dana
2007-12-27 06:14
2008.01.27
Создание aliases


15-1198268667
I
2007-12-21 23:24
2008.01.27
Моник и процессор


4-1182597299
AbrosimovA
2007-06-23 15:14
2008.01.27
Возможно-ли прервать функцию из dll


15-1198133256
Ega23
2007-12-20 09:47
2008.01.27
Я вернулся.


2-1198764407
Artem
2007-12-27 17:06
2008.01.27
Files and strings