Валентин Озеров - Советы по 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Я делаю это все время. У меня есть INI-файл, который сообщает, где можно найти таблицы и каталоги их расположения. Вот как я это делаю:
procedureCheckTable( varTable : TTable; varTName : string);
var
ChangePath: boolean;
Path: string;
ActiveState: Boolean;
begin
if(TName = '') thenTName := Table.TableName
else withTable do begin
ActiveState := Active;
Close;
Path := ExtractFilePath(TName);
ChangePath := HasAttr(DatabaseName, faDirectory) or(CompareText(DatabaseName, Path) <> 0);
if(Length(Path) > 0) andChangePath thenDatabaseName := Path;
if(CompareText(ExtractFileName(Tname), TableName) <> 0) thenTableName := ExtractFileName(Tname);
Active := ActiveState;
end;
end;
Псевдоним на лету
Delphi 2
Попробуйте это:
typeTDataMod = class(TDataModule)
Database: TDatabase;
public
procedureTempAlias(NewAlias, NewDir: String);
end;
procedureTDataMod.TempAlias(NewAlias, NewDir: String);
begin
withSession do if notIsAlias(NewAlias) then begin
ConfigMode := cmSession; (* NewAlias будет ВРЕМЕННЫМ *)
try
AddStandardAlias(NewAlias, NewDir, 'PARADOX');
Database.Close;
Database.AliasName := NewAlias;
Database.Open;
finally
ConfigMode := cmAll;
end;
end;
end;
Комментарии:
a) Поместите компонент Database на форму DataModule;
b) Задайте свойству DatabaseName имя базы данных, например, 'TempDB';
c) Задайте свойству DatabaseName компонента TTable значение = 'TempDB'
d) Для получения дополнительной информации ознакомьтесь с примером MastApp, поставляемым вместе с D2.
Псевдонимы
Delphi 2
Попробуйте следующий код:
var
theStrList : TStringList;
GPath : String;
begin
theStrList := TStringList.Create;
{Используем GetAliasParams для получения псевдонимов и ассоциированных с ними путей}
Session.GetAliasParams( <���Здесь псевдоним из выпадающего списка>,theStrList);
{Удаляем первые шесть символов, которые всегда равны «PATH="}
GPath := copy(theStrList[0],6,length(theStrList[0]))
theStrList.Free;
Ошибки
Ошибка BDE32 $2104
Delphi 2
Пример, приведенный для функции dbiGetDatabaseDesc в файле BDE32.HLP, неверен. Такой же пример содержится в файле TI3100.ASC. Я пробовал это на 3 разных компьютерах. Я использую среду Delphi. Ошибка, которую я получаю при попытке использования функции, выглядит следующим образом:
EDBEngineError с сообщением 'Возникла ошибка при попытке инициализации Borland Database Engine (ошибка $2104).'
При вызове любой из функций BDE, если вы не пользуетесь компонентами для работы с базами данных, вам необходимо инициализировать BDE вызовом dbiInit(nil).
Pat Ritchey
Проблема BDE при использовании "неживого" TQuery
У меня была та же проблема, и я нашел единственное решение как ее обойти. Я подозреваю, что причина кроется в том, что Query1.Refresh ничего не делает, если установлен режим readonly, т.е. не ожидается никаких изменений. Один способ у меня прошел успешно (в предположении, что мы имеем один вход): я использовал 3 TQuerie, две сетки и форму обновления. Это способ, когда я могу установить requestlive в истину. Вы не должны допускать, чтобы пользователь мог сам редактировать табличную сетку (если это то, что вы хотите).
Ошибка ApplyApdates
Делаем ApplyUpdates. Если при insert(update) произошла ошибка (поле null, сработал check, etc.), то BDE всегда говорит "General SQL Error" вместо нормального сообщения об ошибке :-( Без CU все нормально, разумеется. Как бороть этот баг?
Nomadicсоветует:
Использyй нормальнyю трансляцию ошибок в Application.OnException. Вpоде это.
procedure DBExceptionTranslate(E: EDBEngineError);
functionOriginalMessage: String;
var
I: Integer;
DBErr: TDBError;
S: String;
begin
Result := '';
forI := 0 toE.ErrorCount - 1 do begin
DBErr := E.Errors[I];
caseDBErr.NativeError of
-836: { Intebase exception }
begin
S := DBErr.Message;
Result := #13#10 + Copy(S, Pos(#10, S) + 1, Length(S));
Exit;
end;
end;
S := Trim(DBErr.Message);
ifS <> '' thenResult := Result + #13#10 + S;
end;
end;
begin
caseE.Errors[0].ErrorCode of
$2204:
E.Message := LoadStr(SKeyDeleted);
$271E,$2734:
E.Message := LoadStr(SInvalidUserName);
$2815:
E.Message := LoadStr(SDeadlock);
$2601:
E.Message := LoadStr(SKeyViol);
$2604:
E.Message := LoadStr(SFKViolation) + OriginalMessage;
else begin
E.Message := Format(LoadStr(SErrorCodeFmt), [E.Errors[0].ErrorCode]) + OriginalMessage;
end;
end;
end;
Ошибка создания дескриптора курсора
Delphi 1
Вы должны использовать ExecSql вместо Open. К примеру, если имя вашего запроса UpdateStudent, то при необходимости обновления STUDENT.DB вы должны использовать следующий код:
Begin
…
UpdateStudent.ExecSql;
…
End;
Ваш запрос является Passtrough-запросом, который не может возвратить установленный результат, так что это не может быть открыто, а должно быть 'ВЫПОЛНЕНО'.
При разрушении обьектов, порожденных от TDataSet (TTable, TQuery), не отрабатывает событие OnBeforeClose. Что делать?
Nomadicотвечает:
Недоработка в VCL.
Сейчас вышел из ситуации так: в TForm.OnClose, т.е. пока ещё все компоненты формы живы, делаю CloseDatabases(Self).
При обращении к memo-полю из BDE возникает ошибка 'Memo too large'. Как лечить?
Nomadicотвечает:
В BDE есть крутая ошибка, достаточно известная всем, кроме Borland'a. Поскольку они ее еще с 1й Delphi не исправили. Этот баг проявляется как Access Violation в программе при обращении к таблице IB, которая содержит более одного поля типа VARCHAR (или CHAR) размером>255. Причем, первое поле меньшего, а второе большего размера. Если поменять местами поля или сделать их одного размера, то все нормально.
Эффект имеет место только с IB, вроде.
Нарушение уникальности записи
Delphi 1
try
tMyTable.Post;
except
on E : EDBEngineError do ifE.Message = 'Key violation' then begin
MessageDlgC('Дублирование записи не допускается.' mtError, [mbOk], 0);
// Я не уверен в том, что это нужно делать:
tMyTable.Cancel;
end
else Raise;
end;
Хорошим примером может служить проект DBERRORS.DPR, расположенный в каталоге Delphi 2 Demos. Выглядит это примерно так:
Читать дальшеИнтервал:
Закладка: