Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

Посоветуйте событие для отработки процедуры   Найти похожие ветки 

 
Lt   (2003-07-29 13:08) [0]

Есть TDBGridEh, связанный с TTable и TDataSet, есть процедура автоподбора ширины столбца в зависимости от ширины содержимого ячейки. Нужно - чтоб эта процедура отработала сразу после того, как пользователь ввел значение в грид (ширина введенного текста может быть больше ширины столбца грида). Посоветуйте - на какое событие повесить процедуру (на грид, на таблицу или на датасет)?
Код прилагается:
procedure TfrmMain.btnHClick(Sender: TObject);
var
WidthMax, WidthField, WidthTitle: Integer;
I: Byte;
begin
with DBGridEh1, dmMain.tblMain do
begin
for I := 0 to Columns.Count - 1 do
begin
WidthMax := 0;
DisableControls;
if I = 0 then WidthMax := 20
else
begin
First;
while not EOF do
begin
WidthField := Canvas.TextWidth(Columns[I].Field.DisplayText);
WidthTitle := Canvas.TextWidth(Columns[I].Title.Caption);
if WidthField < WidthTitle then
if Columns[I].Title.SortMarker = smNoneEh then WidthField := WidthTitle
else WidthField := WidthTitle + 16
else
if (Columns[I].ButtonStyle = cbsEllipsis) or
(Columns[I].ButtonStyle = cbsDropDown) or
( Columns[I].ButtonStyle = cbsAuto) Есть TDBGridEh, связанный с TTable и TDataSet, есть процедура автоподбора ширины столбца в зависимости от ширины содержимого ячейки. Нужно - чтоб эта процедура отработала сразу после того, как пользователь ввел значение в грид (ширина введенного текста может быть больше ширины столбца грида). Посоветуйте - на какое событие повесить процедуру (на грид, на таблицу или на датасет)?
Код прилагается:
procedure TfrmMain.btnHClick(Sender: TObject);
var
WidthMax, WidthField, WidthTitle: Integer;
I: Byte;
begin
with DBGridEh1, dmMain.tblMain do
begin
for I := 0 to Columns.Count - 1 do
begin
WidthMax := 0;
DisableControls;
if I = 0 then WidthMax := 20
else
begin
First;
while not EOF do
begin
WidthField := Canvas.TextWidth(Columns[I].Field.DisplayText);
WidthTitle := Canvas.TextWidth(Columns[I].Title.Caption);
if WidthField < WidthTitle then
if Columns[I].Title.SortMarker = smNoneEh then WidthField := WidthTitle
else WidthField := WidthTitle + 16
else
if (Columns[I].ButtonStyle = cbsEllipsis) or
(Columns[I].ButtonStyle = cbsDropDown) or
(Columns[I].ButtonStyle = cbsAuto) then
WidthField := WidthField + 16;
if WidthField > WidthMax then
WidthMax := WidthField;
Next;
end;
end;
Columns[I].Width := WidthMax + 10;
First;
EnableControls;
end;
end;
end;


 
Zergling ©   (2003-07-29 13:11) [1]

Table -> OnAfterPost


 
Lt   (2003-07-30 08:39) [2]

onAfterPost - событие хорошее, но если я не ухожу с редактируемой ячейки, т.е. изменил значение в ячейке и в ней же остался, onAfterPost не отрабатывает, а мне нужно, чтоб как только изменения произошли, ширина сразу изменилась бы. Наверное, стоит использовать onValidate или onChange для Field? Что скажете?


 
Zergling ©   (2003-07-30 09:29) [3]

Ну по аналогии есть еще
Table -> OnAfterEdit


 
Lt   (2003-07-30 09:56) [4]

Не-е, onAfterEdit не работает, я уже пробовал.


 
Zergling ©   (2003-07-30 10:40) [5]

Для стандартного DBGrid -> OnConsumerDrawColumnCell

procedure TFormWarehouse.DBGridConsumerDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if Column.Field.Value <> Null then
if Canvas.TextWidth(Column.Field.Value) > Column.Width then Column.Width := Canvas.TextWidth(Column.Field.Value) + 5;
end;


 
Sergey13 ©   (2003-07-30 11:10) [6]

2Lt (29.07.03 13:08)
А чем тебе не нравится показ текста в несколько строк и/или показ неуместившихся строк хинтом. В TDBGridEh ИМХО более чем достаточно таких штучек. Ты прикинь 1000 строк имеют среднюю длину 20 символов и 1 строка 200. Красивый грид ты получишь? Если к тому же эта запись с длинным значением вне заны видимости.

ИМХО велосипед изобретаешь. Причем конструкция велосипеда мягко говоря не того... не катит.


 
NAlexey ©   (2003-07-30 11:22) [7]

Лучше всего наверное это повесить на события InplaceEdit, скорее всего в Eh гриде он вынесен в published. InplaceEdit - обычный эдит, и обрабатывай его события, хоть после вставки каждого символа. Другой вопрос: умеет ли Eh равномерно изменять ширину остальных колонок при изменении текущей?


 
BizonWar   (2003-07-30 11:22) [8]

У DataSource есть событие OnDataChange. IMHO то, что тебе нужно. Туда еще и поле передается в качестве аргумента, т.е. сразу можно определить, какой столбец проверять.



Страницы: 1 вся ветка

Текущий архив: 2003.08.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
3-81598
Relaxxx
2003-07-31 13:07
2003.08.25
Рисовать в ячейках DBGrid как на канвасе


1-81698
Dimon
2003-08-11 12:22
2003.08.25
PrintDialog


14-81879
_Alex_
2003-08-08 14:22
2003.08.25
пинпонг в стиле матрицы


8-81841
EK
2003-04-26 22:06
2003.08.25
mpeg4


1-81748
Den[NSP]
2003-08-09 19:37
2003.08.25
AccessViolation, из-за чего???