Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Может ли 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.047 c
15-1141210404
Knight
2006-03-01 13:53
2006.03.26
Property как массив по default


3-1138877901
Alex_1234
2006-02-02 13:58
2006.03.26
Группировка по временным интервалам...


2-1142174343
@gent
2006-03-12 17:39
2006.03.26
как распечатать memo ?


2-1141997749
Mozgan
2006-03-10 16:35
2006.03.26
Атрибут файла


1-1140544275
Volf_555
2006-02-21 20:51
2006.03.26
Как в InputBox отображать текст звёздочками?!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский