![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Может ли DBGrid иметь разное значение RowsHeigth для каждой Ячейк
jeka_t © (2006-03-09 15:10:00)Можно ли заставить DBGrid показывать таблицу с разным значением RowsHeigth, взависимости от длины текста в ячейке?
Morgoth_ (2006-03-13 14:04:00) [1]лучше или нет, фик знает, но взято с 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;
может чего и найдешь для себя из этого...
sniknik (2006-03-13 13:59:00) [2]зря ты здесь психологию применяеш, хреновый из тебя психолог. [28]/[29] яркое тому подтверждение.
jeka_t (2006-03-13 11:56:00) [3]Вот я изменил на это:
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, за что ему Большое Спасибо, от всей души...
Но может быть есть по лучше решение? А?
jeka_t (2006-03-13 11:46:00) [4]Так я ж новичок, поэтому такие решения... :-)
Извените, что задел Вас, это тонкий психологический момент...
Просто необходимо учитывать психологию...
Вот Вы, молодец... Стимулируете решать проблему, а не брать решение у других. И деньги здесь не причём...
Я знаю, что RecNo - это не решение проблемы, но и Ваше тоже : GridCoord:= MouseCoord() - не даёт правильного результата... эти два решения равноправны...
Ещё раз приношу свои извинения за то, что Вас задел...
sniknik (2006-03-13 11:09:00) [5]> Если у Вас не получилось ...
под дурачка "косиш"? если посмотриш выше то увидиш что способ/принцип "твоего" решения, я и предложил (не реализацию). причем "сходу экспромтом" то до чего ты сам не додумался, пришлось спрашивать... понять, что я и о недостатках осведомлен(/могу догадаться/вычислить) лучше тебя думаю не надо быть "семи пядей во лбу". если понял то проверяй по пунктам то, о чем сказано, пытайся понять (иначе дальнейший разговор безсмысленен). не понял, то обяснить чтонибудь более менее сложное тебе попросту нереально (а сделал ты пока простейщую часть, да еще и с глюками).
> Если база 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:00) [6]
> Если база 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;
jeka_t (2006-03-13 10:06:00) [7]Да Вы уж не обижайтесь...
Если у Вас не получилось (Формат данных *.db), то не расстраивайтесь, если подумать лучше, то все у Вас получится... А на счет тестов за $, то это Вы поспешили с выводами, что мне это необходимо...
Я проверил для себя и у меня выходит так:
Если база JET или MySQL, то при
if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;
hаботает привосходно (без фильтрации данных)
Если Вам нужно что-нибудь другое, то прийдётся изменить ADOQuery1.RecNo на кое-что подходящее... Вот и все...
Вот если бы кто-нибудь, помогли и написали продолжение... (статью или компонент...) было бы великолепно, но все ж хотят $... И это правильно с одной стороны, но есть всегда другая... "Поможешь ты, и помогут тебе" - Закон мироздания... Многие этот закон применяют в бизнесе, тогда живут не бедно...
sniknik (2006-03-11 11:31:00) [8]> Вы пробуйте, а потом говорите "помню", "не помню".
ты бы сам проверил по указанным узким местам, тщательнее и на большом количестве данных. то что сразу не "вляпался" еще не значит что "ляпов" нет.
> Пробуйте и проверяйте...
тестерам обычно платят...
> Единственное неудобство у меня так это то, что через ДБГрид я не вношу изменение в БАЗУ
если бы прочитал ссылку внимательно, заметил бы примеры внедрения обьектов, только там чекбоксы и датапикеры /..., а тебе нужен мемо.
jeka_t (2006-03-11 09:45:00) [9]Вы пробуйте, а потом говорите "помню", "не помню". У меня даже с любым скролингом работает очень замечательно...
Красота уже наведена...
Я использую базу MYSQL (Таблица с полями типа "TEXT"), Компоненты TADOQuery, TDBGrid (Определил колонки)...
Пробуйте и проверяйте... Единственное неудобство у меня так это то, что через ДБГрид я не вношу изменение в БАЗУ (Пользователю не удобно. Осуществил программно). Но можно попробывать и дальше...
Anatoly Podgoretsky (2006-03-11 09:44:00) [10]Хуже когда количество записей большое.
Игорь Шевченко (2006-03-11 00:25:00) [11]sniknik © (10.03.06 22:37) [20]
Хуже скроллинг вправо/влево, насколько я помню.
sniknik (2006-03-10 22:37:00) [12]> Вот решение проблемы:
боюсь так просто (если делать нормально) тебе не "отделаться".
и "красота" еще дорого дастся...
первое упоминаемый уже скролинг вверх (сдвиг строк, а не перерисовка т.е. алгоритм "сбоит"), второе скролинг вниз (уход курсора за пределы изза неправильного RowCount, естественно, высоту поменяли а пересчитать количество "забыли"), и третье RecNo в рекордсете вовсе не совпадает с Row в гриде ("выходы" за пределы начнутся, убедишся).
и это наверняка не все.
jeka_t (2006-03-10 18:04:00) [13]Ок, я проверю...
Morgoth_ (2006-03-10 18:01:00) [14]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 17:39:00) [15]покажи мне свой обрабочтик...
Morgoth_ (2006-03-10 17:34:00) [16]решил проверить, не работает, видно, что слова переносит, а высоту строк не увеличивает
jeka_t (2006-03-10 17:24:00) [17]Правильнее надо так:
if H > THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo]
then THackGrid(DBGrid1).RowHeights[ADOQuery1.RecNo] := H + 3;
jeka_t (2006-03-10 17:13:00) [18]Вот решение проблемы:
Вначале:
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 16:23:00) [19]Неа...
я уже пробывал...
Crash Coredump (2006-03-10 13:02:00) [20]Amoeba © (10.03.06 12:19) [11]
> Естественно. В этот компонент такая функциональность не
> встроена.
dghFitRowHeightToText в OptionsEh не к этому ?