Задача: Получить коментарии (описания) полей в MS Access и сделать их хинтами к контролам.
Итак что нужно сделать
private
FFieldsComments: TStrings;
...
Итак что нужно сделать
- Получить комментарии к полям
- Список Таблица.Поле=Коментарий
- Обновить хинты контролов.
В DataModule делаю
FFieldsComments: TStrings;
...
procedure UpdateFieldsComments;
published
property FieldsComments: TStrings read FFieldsComments;
procedure TdmMain.UpdateFieldsComments;
var
ADODataSet: TADODataSet;
begin
if Assigned(FFieldsComments) and ADOConnection1.Connected then
begin
FFieldsComments.Clear;
ADODataSet := TADODataSet.Create(Self);
try
ADOConnection1.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, tblDeviceCharacteristics.TableName]), EmptyParam, ADODataSet);
ADODataSet.Open;
ADODataSet.First;
while not ADODataSet.Eof do
begin
if ADODataSet.FieldByName('DESCRIPTION').AsWideString <> '' then
FFieldsComments.Append(ADODataSet.FieldByName('TABLE_NAME').AsWideString + '.' +ADODataSet.FieldByName('COLUMN_NAME').AsWideString + '=' +ADODataSet.FieldByName('DESCRIPTION').AsWideString);
ADODataSet.Next;
end;
finally
FreeAndNil(ADODataSet)
end;
end;
end;
published
property FieldsComments: TStrings read FFieldsComments;
FFieldsComments создается в DataModuleCreate и разрушается в DataModuleDestroy.
procedure TdmMain.UpdateFieldsComments;
var
ADODataSet: TADODataSet;
begin
if Assigned(FFieldsComments) and ADOConnection1.Connected then
begin
FFieldsComments.Clear;
ADODataSet := TADODataSet.Create(Self);
try
ADOConnection1.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, tblDeviceCharacteristics.TableName]), EmptyParam, ADODataSet);
ADODataSet.Open;
ADODataSet.First;
while not ADODataSet.Eof do
begin
if ADODataSet.FieldByName('DESCRIPTION').AsWideString <> '' then
FFieldsComments.Append(ADODataSet.FieldByName('TABLE_NAME').AsWideString + '.' +ADODataSet.FieldByName('COLUMN_NAME').AsWideString + '=' +ADODataSet.FieldByName('DESCRIPTION').AsWideString);
ADODataSet.Next;
end;
finally
FreeAndNil(ADODataSet)
end;
end;
end;
Всё делается методом OpenSchema.Самый мне непонятный параметр это второй. Туда передаю VarArrayOf(...), но я пока не нашел описания что есть что в этом масиве. Я просто подставил то что нашёл в инете и получил, что хотел. Может, если найду описание дополню статью.
Процедуру UpdateFieldsComments вызываю в ADOConnection.OnAfterConnect.
Теперь в форме нужно обновить хинты.
procedure TfrmMain.UpdateHitnsFromDB;
var
i: integer;
procedure UpdateDBEditHint( AControl: TDBEdit);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
procedure UpdateDBLinkEditHint( AControl: TDBLinkEdit);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
procedure UpdateDBLookupComboBoxHint( AControl: TDBLookupComboBox);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
begin
for I := 0 to ComponentCount-1 do
if Components[I] is TDBEdit then
UpdateDBEditHint(Components[I] as TDBEdit)
else if Components[I] is TDBLinkEdit then
UpdateDBLinkEditHint(Components[I] as TDBLinkEdit)
else if Components[I] is TDBLookupComboBox then
UpdateDBLookupComboBoxHint(Components[I] as TDBLookupComboBox)
end;
UpdateHitnsFromDB вызываю в actConnectExecute
Вот и все.