Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Советы по Delphi. Версия 1.4.3 от 1.1.2001"
Описание и краткое содержание "Советы по Delphi. Версия 1.4.3 от 1.1.2001" читать бесплатно онлайн.
…начиная с 1001. Смотрите другие файлы…
DBGrid1.Options := DBGrid1.Options + goRowSelect
else DBGrid1.Options := DBGrid1.Options – goRowSelect;
Дело в том, что если у Grid'а стоит опция goRowSelect, то из Grid'а невозможно добавить запись. Ну а когда програмно вызываешь редактирование или вставку, то курсор принимает обычный вид и все Ok.
Лучше использовать конструкцию «State in dsEditModes».
Обновление TDBGrid после редактирования отдельной записи на отдельной форме
Delphi 1
А вы постите запись, прежде чем закрыть форму? При закрытии, форма самостоятельно данных не постит. Вы должны постить изменения или с помощью компонента dbnavigator, или c помощью кода, который при закрытии формы постит данные в основную таблицу.
На странице 95 Database Application Developers Guide (руководство разработчиков приложений баз данных), поставляемое с Delphi, приведен демонстрационный проект с двумя формами, демонстрирующий хорошую технику при использовании ttable на мастер-форме в качестве набора данных для детали.
Одним из решений вашей проблемы может служить связывание компонента DataSource на Form2 с набором данных DataSet на Form1. Это может быть достигнуто путем добавления следующей строки в обработчик события OnActivate для Form2:
MyDataSource.DataSet := Form1.MyTable;
Данный метод имеет 3 преимущества:
1. сделанные вами изменения немедленно отображаются, поскольку вы используете одну и ту же логическую таблицу;
2. если вам нужно определить установки для ваших полей таблицы, например, DisplayFormat или EditMask, вам нужно сделать это только один раз в таблице на Form1, вам не нужно это делать на каждой форме, которая использует таблицу;
3. это сохраняет ресурсы и повышает производительность, поскольку ваше приложение при работе с таблицей использует только одну сессию. Тем не менее, в проектном времени вам нужно иметь TTable на вашей Form2 для того, чтобы вы могли выбрать поля для БД-контролов, после чего вы можете удалить TTable.
Пересортица в коде полей TDBGrid во время вополнения программы
Одной строкой
используйте <имя поля>.index := <желаемый номер поля>
В Delphi 3 и выше ползунок TDBGrid иногда может находится не только в трех фиксированных позициях. Что для этого нужно?
Nomadic отвечает:
Здесь отрывки из исходников VCL —
unit DBGrids;
procedure TCustomDBGrid.UpdateScrollBar;
var
SIOld, SINew: TScrollInfo;
begin
[skipped]
if IsSequenced then begin
SINew.nMin := 1;
SINew.nPage := Self.VisibleRowCount;
SINew.nMax := RecordCount + SINew.nPage -1;
if State in [dsInactive, dsBrowse, dsEdit] then SINew.nPos := RecNo; // else keep old pos
end else begin
SINew.nMin := 0;
SINew.nPage := 0;
SINew.nMax := 4;
if BOF then SINew.nPos := 0
else if EOF then SINew.nPos := 4
else SINew.nPos := 2;
end;
[skipped]
unit dbtables;
function TBDEDataSet.IsSequenced: Boolean;
begin
Result := (FRecNoStatus = rnParadox) and (not Filtered);
end;
То есть, к примеру, все будет работать «красиво» на таблицах BDE, если они:
• таблицы Paradox;
• на них не установлен фильтр.
TClientDataSet в режиме single-tier (briefcase) также работает «красиво».
Изменение месторасположение колонок в TDBGrid
Delphi 1
Var
i: Integer;
fName: string;
…………
{ Определение изменения месторасположения колонок }
…………
with dbgrid1.datasource.dataset as ttable do
for i := 0 to indexdefs.count – 1 do begin
fName := DBGrid1.Fields[0].FieldName;
if copy(indexdefs[i].fields, 1, length(fname)) = fname then IndexName := IndexDefs[i].Name
end;
Решение проблемы передачи фокуса TDBGrid
В данном документе содержится решение проблемы невозможности получения DBGrid-ом фокуса после щелчка на каком-либо элементе управления родительской формы, в то время, как DBGrid находится на ее дочерней MDI-форме.
Относится ко всем версиям Delphi.
Очевидно, DBGrid имеет некоторые проблемы с управлением фокусом, если он находится на дочерней MDI-форме. Эта проблема решена в приведенном ниже наследнике TDBGrid, в котором обрабатываются мышиные сообщения и выясняется когда фокус должен быть передан сетке. Наследник создан в виде компонента, который легко устанавливается в Палитру Компонентов. Примечание: код адаптирован для всех версий Delphi. Проблемы могут быть в Delphi 2 и 3, если вы забудете заменить устаревшие в этих версиях модули "winprocs" и "wintypes" на "windows."
unit FixedDBGrid;
interface
uses Winprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids;
type TFixedDBGrid = class(TDBGrid)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure TFixedDBGrid.WMRButtonDown(var Message: TWMRButtonDown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
procedure TFixedDBGrid.WMLButtonDown(var Message: TWMLButtonDown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
procedure tfixeddbgrid.wmlbuttondown(var Message: twmlbuttondown);
begin
winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}
inherited;
end;
procedure Register;
begin
RegisterComponents('Samples', [TFixedDBGrid]);
end;
end.
Как отучить TDBGrid от автодобавления новой записи?
Добавьте в обработчик события вашего TTable «BeforeInsert» следующую строку:
procedure TForm1.Tbable1BeforeInsert(DataSet: TDataset);
begin
Abort; ←эту строчку
end;
Осуществляем перехват нажатия клавиши и проверку на конец файла (end-of-file):
procedure TForm8.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_DOWN) then begin
TTable1.DisableControls;
TTable1Next;
if TTable1.EOF then Key := 0
else TTable1.Prior;
TTable1.EnableControls;
end;
end;
Две таблицы в одном TDBGrid
Delphi 2
Если у вас D2, вы можете воспользоваться свойством Lookup. Для этого выберите в контекстном меню объекта table редактор полей (fields editor). Затем для добавления нового поля нажмите <Ctrl>+N. Просто раскройте combobox и выберите lookup-поле. TDBGrid автоматически создаст выпадающий список, в котором пользователь сможет выбрать нужный элемент.
Добавление к TDBGrid события OnClick
Delphi 1
TGroothuisGrid = class() {!}
published
property OnClick;
end;
Это все! OnClick уже объявлен в TControl как защищенное свойство. Все, что вы должны сделать, это опубликовать это свойство в компоненте-наследнике, зарегистрировать его (смотри гл. 8 Руководства по созданию компонентов, Component Writer's Guide) и использовать взамен TDBGrid.
Позиция ячейки в TDBGrid
Delphi 1
В TCustomGrid определен метод CellRect, который, к сожалению, защищен. Это означает, что даный метод доступен только для TCustomGrid и его наследников. Но все-таки существует немного мудреное решение вызова данного метода:
type TMyDBGrid = class(TDBGrid)
public
function CellRect(ACol, ARow: Longint): TRect;
end;
function TMyDBGrid.CellRect(ACol, ARow: Longint): TRect;
begin
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Советы по Delphi. Версия 1.4.3 от 1.1.2001"
Книги похожие на "Советы по Delphi. Версия 1.4.3 от 1.1.2001" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001"
Отзывы читателей о книге "Советы по Delphi. Версия 1.4.3 от 1.1.2001", комментарии и мнения людей о произведении.