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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
3-81590
led
2003-07-29 18:35
2003.08.25
Поле Memo вывести на грид


3-81557
OlegNOE
2003-07-30 19:00
2003.08.25
Определение номера записи в фильтрованом наборе


3-81543
stud
2003-07-30 16:29
2003.08.25
sql - запрос


1-81688
Freemax
2003-08-11 14:51
2003.08.25
SaveDialog


1-81632
Buffoon
2003-08-12 18:35
2003.08.25
Рисование на Canve





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский