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

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

многострочность dbgrid (не в заголовках) [D7, Paradox]


Страницы:   1 2

Настенька!!! ©   (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 спасибо за помощь, но где она?
ну мне нужен код с использованием стандартного грида. помогите!!!


Страницы:   1 2

Наверх

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