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

Вниз

Может ли DBGrid иметь разное значение RowsHeigth для каждой Ячейк   Найти похожие ветки 

 
jeka_t   (2006-03-09 15:10) [0]

Можно ли заставить DBGrid показывать таблицу с разным значением RowsHeigth, взависимости от длины текста в ячейке?


 
Amoeba ©   (2006-03-09 17:32) [1]

Строки в DBGrid могут иметь только одинаковую высоту.


 
sniknik ©   (2006-03-09 17:50) [2]

> Строки в DBGrid могут иметь только одинаковую высоту.
могут разную

для примера

type
 TMyDBGrid = class(TDBGrid);

procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
begin
 i:= 1;
 with TMyDBGrid(DBGrid1) do
   while i <= RowCount - 1 do begin
     RowHeights[i]:= 10+i*8;
     inc(i);
   end;
end;


 
Crash Coredump ©   (2006-03-09 18:10) [3]

sniknik ©   (09.03.06 17:50) [2]


> могут разную


Но недолго. До первой прокрутки.

jeka_t   (09.03.06 15:10)  

Могу порекомендовать EhLib Дмитрия Большакова, там, насколько я помню, этого эффекта добиться можно.

http://www.ehlib.com/RUS/default.htm


 
sniknik ©   (2006-03-09 18:35) [4]

> Но недолго. До первой прокрутки.
"повесь" расчет высоты на отрисовку и будет "навсегда"...


 
Crash Coredump ©   (2006-03-09 18:38) [5]

sniknik ©   (09.03.06 18:35) [4]


> "повесь" расчет высоты на отрисовку и будет "навсегда"..
> .


Зациклиться не боишься ? Изменение свойств (rowHeights) вызовет Invalidate и ты опять попадешь в ту же перерисовку. В общем, овчинка выделки не стоит. Доказано на Королевстве Delphi


 
sniknik ©   (2006-03-09 21:24) [6]

> Зациклиться не боишься ?
боишся не садись программировать!

> В общем, овчинка выделки не стоит.
вот тебя бы в контору, в которой запрещены левые, нелицензионные, сомнительные (в общем все, за исключением пары) сторонние компоненты... вот тогда бы еще услышать про "овчинку".

> Доказано на Королевстве Delphi
все можно решить. доказано мной.

еще пример (!!!)

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 GridCoord: TGridCoord;
begin
 GridCoord:= TMyDBGrid(Sender).MouseCoord(Rect.Left + 2, Rect.Top + 2);
 if (GridCoord.X < 0) then Exit;

 if Odd(GridCoord.Y) then TMyDBGrid(Sender).RowHeights[GridCoord.Y]:= 18
                            else TMyDBGrid(Sender).RowHeights[GridCoord.Y]:= 36;
end;


как видиш не циклится... про недостатки, вводе как при скролировании по одному вверх не надо, знаю (легко исправить). это (как и выше) пример, не надо его бездумно себе в программу вставлять, и ждать законченного решения, он всеголиш показывает возможность.


 
Игорь Шевченко ©   (2006-03-09 21:34) [7]

sniknik ©   (09.03.06 21:24) [6]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=806#01_1

Неправильный это способ - стандартный DBGrid таким образом рисовать.


> в контору, в которой запрещены левые, нелицензионные, сомнительные
> (в общем все, за исключением пары) сторонние компоненты


А самому писать разрешено ?


 
sniknik ©   (2006-03-09 22:40) [8]

> Неправильный это способ - стандартный DBGrid таким образом рисовать.
ну я и не рисовал, не нужно было, это так "экспромт".
а ссылку я знаю.

> А самому писать разрешено ?
да, но не компонентами (наследование, создание в рантайме, пожалуйста), все должно быть в проекте. "идея" в том, что когда код передают на тестирование/проверки и т.д. и должен без дополнительных установок компонент (кроме тех двух утвержденных, и весде стоящих), должен сразу компилится и работать.

впрочем старое требование, сейчас его "подзабыли". (да и код уже не передают)
вообще я даже за такой подход был, после того как мне прислали проверить прогу с другого города, в исходниках... 3 недели согласовывали, что и как и куда нужно установить чтобы только начало компилироваться.
ну тогда целая эпопея была ;о), в цирк можно было не ходить. ;о))
- "компонент rxxxxx (на самом деле не помню какой) отличается от "стандартного" скачанного по ссылке xxxxx, не могли бы вы прислать вашу видимо измененную вами версию..."
- "эээ... а что не работает?"
- "ничего не работает, даже не компилится, ругается на кучу переменных которых в моей версии нет."
- "а так это компоненты rxxxxx! их в инете полно! вы не знаете что такое rxxxxx ?"
- "я знаю что такое rxxxxx (уже знаю...), но версия из инета скачанная из 13 мест ....(ссылки) не сходится с вашей..."
- "эта... мне тут передали, вы говорят не можете найти rxxxxx? можно скачать   в ... (6 из 13 моих же ссылок)"
- "я это знаю, качал. но это не подходит!!! см. раннюю переписку, и ПРОСТО ПРИШЛИТЕ ВАШ ВАРИАНТ!"
- "нуууу, я не программист, сейчас спрошу..."
- "а кто? мне дали ящик программиста. (а отвечает уже третий человек, и тон не программист)"
- "а когда вы закончите тестирование? мы уже неделю как код вам выслали."
- "да мы даже не начали. вы нам не все прислали."
- "я буду жаловаться начальству..."
...
тоже иду к начальству. в тот же день присылают злосчастный компонент. тут же стопоримся на другом, и вроде тоже "стандартный-в инете полно".
и т.д. по новой.

сейчас приятно вспомнить, весело, а тогда злой был... ;)


 
Игорь Шевченко ©   (2006-03-10 00:18) [9]

sniknik ©   (09.03.06 22:40) [8]


> да, но не компонентами (наследование, создание в рантайме,
>  пожалуйста), все должно быть в проекте. "идея" в том, что
> когда код передают на тестирование/проверки и т.д. и должен
> без дополнительных установок компонент (кроме тех двух утвержденных,
>  и весде стоящих), должен сразу компилится и работать.


Правильная идея, очень полезная. Согласен целиком и полностью.

А что до грида, то дальше приводится как раз код с наследником, где проблемы с перерисовкой вроде решены.


 
jeka_t   (2006-03-10 10:06) [10]

Пробывал компонент TDBGridEh - результат тот же...


 
Amoeba ©   (2006-03-10 12:19) [11]


> jeka_t   (10.03.06 10:06) [10]
> Пробывал компонент TDBGridEh - результат тот же...

Естественно. В этот компонент такая функциональность не встроена.


 
Crash Coredump ©   (2006-03-10 13:02) [12]

Amoeba ©   (10.03.06 12:19) [11]


> Естественно. В этот компонент такая функциональность не
> встроена.


dghFitRowHeightToText в OptionsEh не к этому ?


 
jeka_t   (2006-03-10 16:23) [13]

Неа...
я уже пробывал...


 
jeka_t   (2006-03-10 17:13) [14]

Вот решение проблемы:
Вначале:
type
THackGrid = class(TCustomGrid)
public
  property RowHeights;
end;


Ставим на форму TDBGrid
Далее:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var r: TRect;
H: integer;
begin
  DBGrid1.Canvas.FillRect(Rect);
   With Sender as TDBGrid do
    begin
     r:= Rect;
     H := DrawText(Canvas.Handle, PChar(Column.Field.Text),
              Length(Column.Field.Text),r,
              DT_WORDBREAK);
    end;
  THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;
end;


И все!
Далее наводим красоту...


 
jeka_t   (2006-03-10 17:24) [15]

Правильнее надо так:
  if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
   then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;


 
Morgoth_   (2006-03-10 17:34) [16]

решил проверить, не работает, видно, что слова переносит, а высоту строк не увеличивает


 
jeka_t   (2006-03-10 17:39) [17]

покажи мне свой обрабочтик...


 
Morgoth_   (2006-03-10 18:01) [18]

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);

var r: TRect;
H: integer;
begin
 DBGrid1.Canvas.FillRect(Rect);
  With Sender as TDBGrid do
   begin
    r:= Rect;
    H := DrawText(Canvas.Handle, PChar(Column.Field.Text),
             Length(Column.Field.Text),r,
             DT_WORDBREAK);
   end;
 if H > THackGrid(DBGrid1).RowHeights[qry.RecNo]
  then THackGrid(DBGrid1).RowHeights[qry.RecNo] := H + 3;

end;

единственное только, что я использую TQuery


 
jeka_t   (2006-03-10 18:04) [19]

Ок, я проверю...


 
sniknik ©   (2006-03-10 22:37) [20]

> Вот решение проблемы:
боюсь так просто (если делать нормально) тебе не "отделаться".
и "красота" еще дорого дастся...

первое упоминаемый уже скролинг вверх (сдвиг строк, а не перерисовка т.е. алгоритм "сбоит"), второе скролинг вниз (уход курсора за пределы изза неправильного RowCount, естественно, высоту поменяли а пересчитать количество "забыли"), и третье RecNo в рекордсете вовсе не совпадает с Row в гриде ("выходы" за пределы начнутся, убедишся).
и это наверняка не все.


 
Игорь Шевченко ©   (2006-03-11 00:25) [21]

sniknik ©   (10.03.06 22:37) [20]

Хуже скроллинг вправо/влево, насколько я помню.


 
Anatoly Podgoretsky ©   (2006-03-11 09:44) [22]

Хуже когда количество записей большое.


 
jeka_t   (2006-03-11 09:45) [23]

Вы пробуйте, а потом говорите "помню", "не помню". У меня даже с любым скролингом работает очень замечательно...
Красота уже наведена...
Я использую базу MYSQL (Таблица с полями типа "TEXT"), Компоненты TADOQuery, TDBGrid (Определил колонки)...
Пробуйте и проверяйте... Единственное неудобство у меня так это то, что через ДБГрид я не вношу изменение в БАЗУ (Пользователю не удобно. Осуществил программно). Но можно попробывать и дальше...


 
sniknik ©   (2006-03-11 11:31) [24]

> Вы пробуйте, а потом говорите "помню", "не помню".
ты бы сам проверил по указанным узким местам, тщательнее и на большом количестве данных. то что сразу не "вляпался" еще не значит что "ляпов" нет.

> Пробуйте и проверяйте...
тестерам обычно платят...

> Единственное неудобство у меня так это то, что через ДБГрид я не вношу изменение в БАЗУ
если бы прочитал ссылку внимательно, заметил бы примеры внедрения обьектов, только там чекбоксы и датапикеры /..., а тебе нужен мемо.


 
jeka_t   (2006-03-13 10:06) [25]

Да Вы уж не обижайтесь...
Если у Вас не получилось (Формат данных *.db), то не расстраивайтесь, если подумать лучше, то все у Вас получится... А на счет тестов за $, то это Вы поспешили с выводами, что мне это необходимо...
Я проверил для себя и у меня выходит так:
Если база JET или MySQL, то при
if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
 then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;

hаботает привосходно (без фильтрации данных)
Если Вам нужно что-нибудь другое, то прийдётся изменить ADOQuery1.RecNo на кое-что подходящее... Вот и все...
Вот если бы кто-нибудь, помогли и написали продолжение... (статью или компонент...) было бы великолепно, но все ж хотят $... И это правильно с одной стороны, но есть всегда другая... "Поможешь ты, и помогут тебе" - Закон мироздания... Многие этот закон применяют в бизнесе, тогда живут не бедно...


 
ЮЮ ©   (2006-03-13 10:58) [26]


> Если база JET или MySQL, то при
> if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
>  then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] :=
> H + 3;


Если строк в наборе больше, чем может одновременно отобразиться в гриде, то ни JET ни MySQL не спасут ибо THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
см. RowHeights

function TCustomGrid.GetRowHeights(Index: Longint): Integer;
begin
 if (FRowHeights = nil) or (Index >= RowCount) then
   Result := DefaultRowHeight
 else
   Result := PIntArray(FRowHeights)^[Index + 1];
end;

procedure TCustomGrid.SetRowHeights(Index: Longint; Value: Integer);
begin
...
 if Index >= RowCount then InvalidOp(SIndexOutOfRange);
...
end;


 
sniknik ©   (2006-03-13 11:09) [27]

> Если у Вас не получилось ...
под дурачка "косиш"? если посмотриш выше то увидиш что способ/принцип "твоего" решения, я и предложил (не реализацию). причем "сходу экспромтом" то до чего ты сам не додумался, пришлось спрашивать... понять, что я и о недостатках осведомлен(/могу догадаться/вычислить) лучше тебя думаю не надо быть "семи пядей во лбу". если понял то проверяй по пунктам то, о чем сказано, пытайся понять (иначе дальнейший разговор безсмысленен). не понял, то обяснить чтонибудь более менее сложное тебе попросту нереально (а сделал ты пока простейщую часть, да еще и с глюками).

> Если база JET или MySQL, то при
> if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
>  then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;
> hаботает привосходно (без фильтрации данных)
ненадолго, если останется в этом же виде (ADOQuery1.RecNo)

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

> "Поможешь ты, и помогут тебе" - Закон мироздания... Многие этот закон применяют в бизнесе, тогда живут не бедно...
чаще живут не бедно не те кто помогает, а те кто убедил остальных "помочь" ему (желательно забесплатно)

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

=============================================
- как вам удалось так разбогатеть?
- я понял, не в деньгах счастье.
- и как вам это помогло?
- мне? никак. помогло убедить в этом своих работников.

© народная мудрость (анекдот)


 
jeka_t   (2006-03-13 11:46) [28]

Так я ж новичок, поэтому такие решения... :-)
Извените, что задел Вас, это тонкий психологический момент...
Просто необходимо учитывать психологию...
Вот Вы, молодец... Стимулируете решать проблему, а не брать решение у других. И деньги здесь не причём...
Я знаю, что RecNo - это не решение проблемы, но и Ваше тоже : GridCoord:= MouseCoord() - не даёт правильного результата... эти два решения равноправны...
Ещё раз приношу свои извинения за то, что Вас задел...


 
jeka_t   (2006-03-13 11:56) [29]

Вот я изменил на это:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
 var r: TRect;
     H: integer;
     GridCoord: TGridCoord;
     temp: string;
begin
    DBGrid1.Canvas.FillRect(Rect);
    With Sender as TDBGrid do
     begin
      r:= Rect;
      H := DrawText(Canvas.Handle, PChar(Column.Field.Text),
               Length(Column.Field.Text),r,
               DT_WORDBREAK);
GridCoord:= MouseCoord(r.Left, r.Bottom);
   end;
  if H > THackGrid(DBGrid1).RowHeights[GridCoord.Y]
     then THackGrid(DBGrid1).RowHeights[GridCoord.Y] := H + 3;
end;


И получилось Лучше, но это все благодаря sniknik, за что ему Большое Спасибо, от всей души...
Но может быть есть по лучше решение? А?


 
sniknik ©   (2006-03-13 13:59) [30]

зря ты здесь психологию применяеш, хреновый из тебя психолог. [28]/[29] яркое тому подтверждение.


 
Morgoth_   (2006-03-13 14:04) [31]

лучше или нет, фик знает, но взято с Delphi World

type

 TMultiLineDBGrid = class(TDBGrid)
 private
   FLinesPerRow: Integer;
   procedure DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField;
     State: TGridDrawState);
   procedure LayoutChanged; override;
   procedure SetLinesPerRow(ALinesPerRow: Integer);
 public
   property LinesPerRow: Integer read FLinesPerRow write SetLinesPerRow default
     1;
   constructor Create(AOwner: TComponent); override;
 end;

implementation

constructor TMultiLineDBGrid.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);
 FLinesPerRow := 1;
 OnDrawDataCell := DrawDataCell;
end;

procedure TMultiLineDBGrid.LayOutChanged;
begin

 inherited LayOutChanged;
 DefaultRowHeight := DefaultRowHeight * LinesPerRow;
end;

procedure TMultiLineDBGrid.DrawDataCell(Sender: TObject; const Rect: TRect;
 Field: TField; State: TGridDrawState);
var

 Format: Word;
 C: array[0..255] of Char;
begin

 if LinesPerRow = 1 then
   Format := DT_SINGLELINE or DT_LEFT
 else
   Format := DT_LEFT or DT_WORDBREAK;

 Canvas.FillRect(Rect);

 StrPCopy(C, Field.AsString);
 WinProcs.DrawText(Canvas.Handle, C, StrLen(C), Rect, Format);
end;

procedure TMultiLineDBGrid.SetLinesPerRow(ALinesPerRow: Integer);
begin

 if ALinesPerRow <> FLinesPerRow then
 begin
   FLinesPerRow := ALinesPerRow;
   LayoutChanged;
 end;
end;


может чего и найдешь для себя из этого...



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

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

Наверх




Память: 0.57 MB
Время: 0.037 c
15-1141382675
Petr V. Abramov
2006-03-03 13:44
2006.03.26
Покупка/продажа IT-компаний


15-1141635706
DelphiN!
2006-03-06 12:01
2006.03.26
Установка 10ых Инди на Д6


15-1141146376
antonn
2006-02-28 20:06
2006.03.26
С первым днем весны, товарищи!


2-1142088993
dera
2006-03-11 17:56
2006.03.26
Как узнать, находится ли точка внутри многоугольника?


10-1110390853
Nicolas1989
2005-03-09 20:54
2006.03.26
Как вставить строку в Excel через ExcelApplication?