www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Работа с DataBase. Разное

Нехочу во время разработки приложения  все время вводить пароль на доступ к БД.
Список ошибок BDE
Ответы на вопросы по InterBase
FIBC
Как заставить клавишу "Enter" вести себя как "Tab" в DBGrid?
Как узнать, какая ячейка при просмотре TDBGrid текущая?
Как изменить цвет фона и шрифта в TDBGrid в зависимости от содержимого?
Как с помощью TDBGrid.RowSelected получить доступ к записям TTable, соответствующим  строкам, помеченным в TDBGrid?
Можно ли задать формат/маску вывода числа в столбце DBGrid?
Обработка исключительных ситуаций (exceptions) EDBEngineError.
 
 
 
 
 
 
 
 
 
 
 
 
 



1.Во время разработки приложения надоедает все время вводить пароль на доступ к БД.

Пароль можно добавить в реестр, после этого он станет доступным в настойках BDE.
Пример для ORACLE:

file: bde_add.reg==
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\DRIVERS\ORACLE\DB OPEN]
"PASSWORD"="mypassword"

Аналогично и для других драйверов.
Перед изменения реестра нужно выгрузить все программы использующие BDE. BDE administrator не сможет использовать этот параметр , а вот все другие программы (sqlexplorer, ...) - ДА.

Наверх к содержанию



Как заставить клавишу "Enter" вести себя как "Tab" в DBGrid? Следующий пример включает также обработку "Enter" для всей формы, включая поля и т.д. Часть, относящаяся к DBGrid обрабатывается в секции Else. Приведенный код не полностью копирует поведение "Tab" в DBGrid, с последней колонки фокус переходит на первую без перехода на следующую запись.

procedure TForm1.FormKeyPress(Sender: TObject; i Key: Char);
{ Это обработчик события OnKeyPress для ФОРМЫ! }
{ Требуется так же установить св-во KeyPreview в True }
begin
if Key=#13then{ клавиша }
if not (ActiveControl is TDBGrid) then
begin{ если не в TDBGrid }
Key :=#0;{ убрать }
Perform(WM_NEXTDLGCTL, 0, 0); { перейти дальше }
end
else
if (ActiveControl is TDBGrid) then{ если в TDBGrid }
with TDBGrid(ActiveControl) do
if SelectedIndex < (FieldCount - 1) then{ следующее поле }
SelectedIndex :=SelectedIndex + 1
else
SelectedIndex :=0;

end;

Наверх к содержанию



        Как узнать, какая ячейка при просмотре TDBGrid текущая?
Здесь процедура для сохранения текущего номера строки и колонки. Следующий код в методе MyDBGridDrawDataCell обновляет переменные Col и Row (которые не должны быть локальными для этого метода) каждый раз, когда таблица перерисовывается. Используя этот код, Вы можете считать, что Col и Row указывают на текущую колонку и строку соответственно.
var
Col, Row : Integer;
procedure TForm1.MyDBGridDrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
var
RowHeight : Integer;
begin
if gdFocused in State then
begin
RowHeight :=Rect.Bottom - Rect.Top;
Row :=(Rect.Top div RowHeight) - 1;
Col :=Field.Index;
end;

end;



Как изменить цвет фона и шрифта в TDBGrid в зависимости от содержимого?
Kuznetsov Anatoly 5 января 1999 г
triton@cs.sibgarw.nsk.su
Для изменения в TDBGrid цвета фона и шрифта в зависимости от содержимого определенного поля (ячейки) необходимо воспользоваться обработчиком события onDrawColumnCell. Представим что мы хотим чтобы все записи где сумма=0 высвечивались на красном фоне синим курсивом. Для этого в обработчик onDrawColumnCell добавляем следующий код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with DBGrid1.Canvas do
begin
if (Table1.FieldByName('summa').asString='0') and not (gdFocused in State) then
begin
Brush.Color :=clRed;
Font.Color :=clBlue;
Font.Style :=[fsBold,fsItalic];
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Column.Field.Text);
end
else
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
А вот для закраски только определенной ячейки введите следующий код в обработчике события OnDrawDataCell:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if gdFocused in State then
with (Sender as TDBGrid).Canvas do
begin
Brush.Color :=clRed;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Field.AsString);
end;
end;

Установите свойство DefaultDrawing в True. Если установить DefaultDrawing в False, то Вы должны самостоятельно перерисовать все ячейки аналогично примеру.



Как с помощью TDBGrid.RowSelected получить доступ к записям TTable, соответствующим строкам, помеченным в TDBGrid?
Michail Alyavdin 17 декабря 1998 г
boss@vast.spb.su

Предлагаю часть из своей работающей процедуры:

Пользователь отмечает (или нет) на DBGrid некоторое число записей, а эта процедура перегоняет их в структуру SData.

with CData.SpTable, SData do
begin
nSpData :=DBGrid1.SelectedRows.Count;
if nSpData > MaxnSpData then nSpData :=MaxnSpData;
if nSpData=0 then
begin
nSpData :=1;
GetSpectr(1, SData);
end
else
begin
DisableControls;
try
for I :=nSpData downto 1 do
begin
Bookmark :=DBGrid1.SelectedRows.Items[I - 1];
GetSpectr(I, SData);
end;
finally
EnableControls;
end;
end;

end;



Можно ли задать формат/маску вывода числа в столбце DBGrid?
Ivanuts Vasiliy 6 декабря 1998 г
ivanuts@altavista.net

По скольку речь идет о компоненте TDBGrid, то нельзя забывать что, ячейки этого компонента заполняются данными из полей таблицы базы данных через компонент TDataSource. А именно составляющими являются автоматически созданные по "подобию и количеству" полей таблицы - компоненты TField. В свою очередь, компонент TField имеет унаследованое от класса TCustomMaskEdit свойство DisplayFormat, которое и отвечает за форматное представление данных в других визуальных компонентах, в том числе и в TDBGrid. Важно знать что, для настройки этого свойства средствами визуальной разработки - необходимо явно создать в классе Вашей формы поля типа TField. Это можно сделать при помощи Редактора полей компонентов TTable или TQuery. Форматная строка в этом свойстве может быть выбрана по правилам форматирования данных, на пример:
'#,##0.00' выдаст результат=94 256,00



Обработка исключительных ситуаций (exceptions) EDBEngineError.
Информация об ошибке BDE может быть получена для использования в приложении из EDBEngineError. Исключительная ситуация EDBEngineError обрабатывается в программе с помощью конструкции try ... except. Когда возникает исключительная ситуация BDE, то может быть создан объект EDBEngineError и различные поля этого объекта могут быть использованы для программного определения, что не в порядке и что требуется для исправления ситуации. Далее, для данной исключительной ситуации может быть сгенерировано несколько сообщений об ошибках. Это требует организации перебора сообщений об ошибках для получения нужной информации. Поле, наиболее важное для данного контекста - ErrorCount : Integer; показывает количество ошибок в свойстве Errors; счет начинается с нуля. Errors : TDBError; набор записей, которые содержат информацию о каждой полученной ошибке; доступ к записям происходит по индексу типа Integer. Errors.ErrorCode : DBIResult; показывает номер ошибки BDE для текущей записи об ошибках в свойстве Errors.
Errors.Category : Byte;//категория ошибки, относящаяся к полю ErrorCode.
Errors.SubCode : Byte;//подкод (subcode) для значения в ErrorCode.
Errors.NativeError : LongInt;//код удаленной ошибки, возвращаемый сервером; если ноль, то это ошибка не сервера; возвращаемое SQL запросом значение появляется в данном поле.
Errors.Message : TMessageStr; //сообщение об ошибке, сервера или BDE

В конструкции try..exceptобъект создается напрямую в разделе except. После создания можно работать поля обычным образом или передавать объект в другую роцедуру для исследования ошибки. Кроме того, можно создать свой собственный компонент для использования в данных целях; его набор функциональных возможностей можно легко переносить между приложениями. В примере ниже во время возникновения исключительной ситуации BDE создается объект DBEngineError, передается в процедуру и анализируется для выделения информации об ошибке. В конструкции try..except, объект DBEngineError можно создать с помощью синтаксиса, приведенного ниже:

procedure TForm1.Button1Click(Sender : TObject);
var
I : Integer;
begin
if Edit1.Text > ' ' then
begin
Table1.FieldByName('Number').AsInteger :=StrToInt(Edit1.Text);
try
Table1.Post;
except
on E: EDBEngineError do
ShowError(E);
end;
end;
end;

В этой процедуре делается попытка изменить значение поля в таблице и затем вызывается метод Post соответствующей таблицы. В конструкцию try..except заключается только попытка Post. Если при этом возникает ошибка BDE, то выполняеся секция except, в которой создается объект E типа EDBEngineError и затем E передается в процедуру ShowError. Заметьте, что только EDBEngineError учитывается в данной конструкции. В реальной ситуации нужно, скорее всего, проверять и другие виды исключительных ситуаций. Процедура ShowError принимает объект EDBEngineError, передаваемый в качестве параметра и исследует содержащиеся сообщения об ошибках. В данном примере информация об ошибках показывается в компоненте TMemo. Первый шаг состоит в определении количества действительно возникших ошибок. Для этого служит свойство ErrorCount. После того, как стало известно количество ошибок, можно использовать цикл для доступа к каждой записи об ошибке в свойстве Error и помещению информацию о них в TMemo.

procedure TForm1.ShowError(AExc : EDBEngineError);
var
I : Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('Number of errors: ' + IntToStr(AExc.ErrorCount));
Memo1.Lines.Add('');
{Iterate through the Errors records}
for i :=0 toAExc.ErrorCount - 1 do
begin
Memo1.Lines.Add('Message: ' + AExc.Errors[i].Message);
Memo1.Lines.Add(' Category: ' + IntToStr(AExc.Errors[i].Category));
Memo1.Lines.Add(' Error Code: ' + IntToStr(AExc.Errors[i].ErrorCode));
Memo1.Lines.Add(' SubCode: ' + IntToStr(AExc.Errors[i].SubCode));
Memo1.Lines.Add(' Native Error: ' + IntToStr(AExc.Errors[i].NativeError));
Memo1.Lines.Add('');
end;

end;



57

Используются технологии uCoz
Используются технологии uCoz

Rambler's Top100 Rambler's Top100
Используются технологии uCoz

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz