Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Nomadicотвечает:
Здесь отрывки из исходников VCL —
unitDBGrids;
procedureTCustomDBGrid.UpdateScrollBar;
var
SIOld, SINew: TScrollInfo;
begin
[skipped]
if IsSequenced then begin
SINew.nMin := 1;
SINew.nPage := Self.VisibleRowCount;
SINew.nMax := RecordCount + SINew.nPage -1;
ifState in[dsInactive, dsBrowse, dsEdit] thenSINew.nPos := RecNo; // else keep old pos
end else begin
SINew.nMin := 0;
SINew.nPage := 0;
SINew.nMax := 4;
ifBOF thenSINew.nPos := 0
else ifEOF thenSINew.nPos := 4
elseSINew.nPos := 2;
end;
[skipped]
unitdbtables;
functionTBDEDataSet.IsSequenced: Boolean;
begin
Result := (FRecNoStatus = rnParadox) and( notFiltered);
end;
То есть, к примеру, все будет работать «красиво» на таблицах BDE, если они:
• таблицы Paradox;
• на них не установлен фильтр.
TClientDataSetв режиме single-tier (briefcase) также работает «красиво».
Изменение месторасположение колонок в TDBGrid
Delphi 1
Var
i: Integer;
fName: string;
…………
{ Определение изменения месторасположения колонок }
…………
with dbgrid1.datasource.dataset asttable do
for i := 0 toindexdefs.count – 1 do begin
fName := DBGrid1.Fields[0].FieldName;
ifcopy(indexdefs[i].fields, 1, length(fname)) = fname thenIndexName := IndexDefs[i].Name
end;
Решение проблемы передачи фокуса TDBGrid
В данном документе содержится решение проблемы невозможности получения DBGrid-ом фокуса после щелчка на каком-либо элементе управления родительской формы, в то время, как DBGrid находится на ее дочерней MDI-форме.
Относится ко всем версиям Delphi.
Очевидно, DBGrid имеет некоторые проблемы с управлением фокусом, если он находится на дочерней MDI-форме. Эта проблема решена в приведенном ниже наследнике TDBGrid, в котором обрабатываются мышиные сообщения и выясняется когда фокус должен быть передан сетке. Наследник создан в виде компонента, который легко устанавливается в Палитру Компонентов. Примечание: код адаптирован для всех версий Delphi. Проблемы могут быть в Delphi 2 и 3, если вы забудете заменить устаревшие в этих версиях модули "winprocs" и "wintypes" на "windows."
unitFixedDBGrid;
interface
usesWinprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids;
typeTFixedDBGrid = class(TDBGrid)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedureWMRButtonDown( var Message: TWMRButtonDown); messageWM_RBUTTONDOWN;
procedureWMLButtonDown( var Message: TWMLButtonDown); messageWM_LBUTTONDOWN;
published
{ Published declarations }
end;
procedure Register;
implementation
procedureTFixedDBGrid.WMRButtonDown( var Message: TWMRButtonDown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
procedureTFixedDBGrid.WMLButtonDown( var Message: TWMLButtonDown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
proceduretfixeddbgrid.wmlbuttondown( var Message: twmlbuttondown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
procedure Register;
begin
RegisterComponents('Samples', [TFixedDBGrid]);
end;
end.
Как отучить TDBGrid от автодобавления новой записи?
Добавьте в обработчик события вашего TTable «BeforeInsert» следующую строку:
procedureTForm1.Tbable1BeforeInsert(DataSet: TDataset);
begin
Abort; ← эту строчку
end;
Осуществляем перехват нажатия клавиши и проверку на конец файла (end-of-file):
procedureTForm8.DBGrid1KeyDown(Sender: TObject; varKey: Word; Shift: TShiftState);
begin
if(Key = VK_DOWN) then begin
TTable1.DisableControls;
TTable1Next;
ifTTable1.EOF thenKey := 0
elseTTable1.Prior;
TTable1.EnableControls;
end;
end;
Две таблицы в одном TDBGrid
Delphi 2
Если у вас D2, вы можете воспользоваться свойством Lookup. Для этого выберите в контекстном меню объекта table редактор полей (fields editor). Затем для добавления нового поля нажмите +N. Просто раскройте combobox и выберите lookup-поле. TDBGrid автоматически создаст выпадающий список, в котором пользователь сможет выбрать нужный элемент.
Добавление к TDBGrid события OnClick
Delphi 1
TGroothuisGrid = class() {!}
published
propertyOnClick;
end;
Это все! OnClick уже объявлен в TControl как защищенное свойство. Все, что вы должны сделать, это опубликовать это свойство в компоненте-наследнике, зарегистрировать его (смотри гл. 8 Руководства по созданию компонентов, Component Writer's Guide) и использовать взамен TDBGrid.
Позиция ячейки в TDBGrid
Delphi 1
В TCustomGrid определен метод CellRect, который, к сожалению, защищен. Это означает, что даный метод доступен только для TCustomGrid и его наследников. Но все-таки существует немного мудреное решение вызова данного метода:
typeTMyDBGrid = class(TDBGrid)
public
functionCellRect(ACol, ARow: Longint): TRect;
end;
functionTMyDBGrid.CellRect(ACol, ARow: Longint): TRect;
begin
Result := inheritedCellRect(ACol, ARow);
end;
Вы можете сделать приведение типа вашего DBGrid к TMyDBGrid (это возможно, поскольку CellRect статический метод) и вызвать CellRect:
Rectangle := TMyDBGrid(SomeDBGrid).CellRect(SomeColumn, SomeRow);
procedureTfmLoadIn.DBGrid1DrawColumnCell(Sender: TObject; constRect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
constDisp = 2; //Правильно выравниваем компонент
begin
inherited;
if(gdFocused inState) then begin
if(Column.FieldName = 'TYPEDescription') then begin
dlTYPEDescription.Left := Rect.Left + DBGrid1.Left + Disp;
dlTYPEDescription.Top := Rect.Top + DBGrid1.top + Disp;
dlTYPEDescription.Width := Rect.Right – Rect.Left;
dlTYPEDescription.Height := Rect.Bottom – Rect.Top;
dlTYPEDescription.Visible := True;
end;
end;
end;
Dbgrid с цветными ячейками VI
Delphi 1
Интервал:
Закладка: