Форум: "Начинающим";
Текущий архив: 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.044 c