Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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 не к этому ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо