![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
многострочность dbgrid (не в заголовках) [D7, Paradox]
Настенька!!! © (2004-10-24 19:12:00)У меня таблица с 2 столбцами. Во втором столбце (не в заголовке, а в записи) текст очень длинный и он весь не вмещается. Как сделать так, что если текст не вмещается, перенести его на 2 строчку, т.е. сделать многострочным. Код для stringgrid не подходит, выдает ошибку. Может, есть еще какой-то способ.
Настенька!!! (2004-11-01 09:11:00) [1]спасибо, буду смотреть.
sniknik (2004-10-31 20:44:00) [2]http://delphi.vitpc.com/asp/viewitem.asp?UrlItem=/helloworld/nogrid.htm
тут все есть.
(сорри за повтор, уверен тебе это уже давали)
Настенька!!! (2004-10-31 19:38:00) [3]спасибо, хоть кто-то ответил. вы дали пример для 2 строки, а как для всей таблицы. свойства arow, как у стринггрида нет. как быть?
sniknik (2004-10-31 09:51:00) [4]вопрос элементарный, но ждеш ты не помоши а кода, это отвращает. ;)
а помогли тебе уже не раз, и ссылки и где искать...
> Как автоматически выровнять высоту записей. в стринггриде есть свойство rowheights
и это в статье должно быть, которую тебе дали но ты не читал
в виде исключения
type
TMyDBGrid = class(TDBGrid);
...
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
TMyDBGrid(DBGrid1).RowHeights[2]:= 40;
end;
Настенька!!! (2004-10-31 08:51:00) [5]ничего не понимаю, вопрос элементарный, но опять никто не хочет помочь с ответом.
Как автоматически выровнять высоту записей. в стринггриде есть свойство rowheights, а в дбгриде нет. как быть?
sniknik (2004-10-30 15:10:00) [6]может проще, скажеш задание, и за тебя напишут?
главное в цене сойтись.
Val © (27.10.04 17:03) [4]
> обожаю помогать настеньке :)
кажется я тебя понимаю... ;о))
Настенька!!! (2004-10-30 13:45:00) [7]ну так подскажите что писать вместо query1.fields[1]. и еще, как автоматически выровнять высоту записей.
ЮЮ (2004-10-29 11:05:00) [8]>этот код не рабочий, все время ошибка насчет rect.
в той ошибке по-русски сказано, что Rect надо передовать как var параметр, а в процедуре Rect опимана как const
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
s: string;
flag: Cardinal;
h: integer;
r: TRect;
begin
DbGrid1.Canvas.FillRect(Rect);
s := query1.fields[1].asstring;
flag := DT_left or DT_WORDBREAK;
r := Rect;
h := DrawText(DbGrid1.Canvas.Handle, PChar(s),length(s), r, flag);
end;
остальной код, конечно, чушь - почему во всех столбцах пишется содержимое query1.fields[1], но это уже другая история
Sergey13 (2004-10-29 10:44:00) [9]2Настенька!!! © (24.10.04 19:12)
Есть EhLib, там есть грид с реализованным сабжем. Там есть исходники. Можно или юзать его (бесплатно) или посмотреть реализацию.
http://www.ehlib.com/RUS/default.htm
msguns (2004-10-29 09:58:00) [10]Настя, ужель так прям и надо показывать текст в несколько строк именно в гриде ? Чисто по опыту знаю, как режут глаз пустоты в таких гридах-как правило на одну запись с длинным текстом имеется энное кол-во с коротким или вообще с пустым. Не проще ли пересмотреть само решение ? Не сделать, к примеру, формочку (панельку) с мемо и эту формочку показывать по спец.кнопульке. Или сделать ее StayOnTop и по событию AfterScroll датасета всовывать туда содержимое пресловутого поля текущей записи.
Почему мы так упрямо пытаемся преодолеть канаву, не посмотрев по сторонам - а вдруг там есть объезд ?
Настенька!!! (2004-10-29 09:08:00) [11]хорошо показываю код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var s:string; Flag: Cardinal; H:integer;
begin
DbGrid1.Canvas.FillRect(Rect);
s := query1.fields[1].asstring;
Flag := DT_left or DT_WORDBREAK;
H := DrawText(DbGrid1.Canvas.Handle,PChar(s),length(s),Rect,Flag);
этот код не рабочий, все время ошибка насчет rect.
Наталия (2004-10-29 08:58:00) [12]Самый простой вариант - положи ниже DBGrid компонент DBMemo и отображай в нем свой длинный текст.
ЮЮ (2004-10-29 08:28:00) [13]>странно, мне казалось, это так просто, НО НИКТО НЕ ХОЧЕТ ПОМОЧЬ!!!
Помочь и сделать за тебя - разные вещи. Ты начни (покажи код), а мы поможем!
Настенька!!! (2004-10-29 08:21:00) [14]люди. а кто-нибудт пожет подсказать код на событие drawdatacell без создания наследника, а просто, в обычном гриде.
странно, мне казалось, это так просто, НО НИКТО НЕ ХОЧЕТ ПОМОЧЬ!!!
BoxTer (2004-10-28 09:00:00) [15]Ниже код наследника TDBGrid.
Добавлено дополнительное свойство LinesPerRow. Установка значений данного свойства соответственно изменяет высоту строки, в зависимости от текущего шрифта. Текст в ячейках будет переноситься, если значение LinesPerRow больше чем единица. Все это произведение искусств оказалось чрезвычайно полезным и удивительно простым.
unit Dbmygrid;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, DB, DBTables, StdCtrls, ExtCtrls, Grids, DBGrids;
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;
end.
Наталия (2004-10-28 08:57:00) [16]А сама ты это как пыталась сделать? Код покажи.
Настенька!!! (2004-10-28 08:48:00) [17]Люди, почему на такой легкий вопрос никто не может дать ответа?
Как в дбгриде, если текст не помещается, перенести его на 2, если надо, на 3 строку.
Наталия (2004-10-28 07:07:00) [18]Настенька, ты не проси, ты требуй - настойчиво, безапелляционно, предоставляя минимум информации, а лучше вообще ее не раскрывая.
А то "прошу,прошу"... Фи.
Настенька!!! (2004-10-27 17:21:00) [19]Кто мне поможет с кодом? очень вас прошу, очень надо...
Настенька!!! (2004-10-27 17:13:00) [20]> Val спасибо за помощь, но где она?
ну мне нужен код с использованием стандартного грида. помогите!!!