Валентин Озеров - Советы по 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
if(TableName='') or(LDName='') then raiseException.Create('Unknown TableName or LDName');
Database:=Session.OpenDatabase(DatabaseName);
try
ifDatabase.IsSQLBased then raiseException.Create('Function ChangeLangDriver working only with dBase or Paradox tables');
FillChar(OptDesc, SizeOf(OptDesc), #0);
FillChar(TblDesc, SizeOf(TblDesc), #0);
StrCopy(OptDesc.szName, 'LANGDRIVER');
OptDesc.iLen := Length(LDName) + 1;
withTblDesc do
begin
StrPCopy(szTblName, TableName);
TblExt := UpperCase(ExtractFileExt(TableName));
ifTblExt = 'DBF' thenStrCopy(szTblType, szDbase)
else ifTblExt = '.DB' thenStrCopy(szTblType, szParadox)
else
begin
AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
ifDbiOpenCfgInfoList( nil, dbiREADONLY, cfgPersistent, StrPCopy(OptData, '\DATABASES\' + StrPas(OptData) + '\DB INFO\')Cur) <> DBIERR_NONE then raiseException.Create('Unknown table type');
try
whileDbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil) <> DBIERR_EOF do ifStrComp(Rec.szNodeName, 'DEFAULT DRIVER') = 0 then
begin
StrCopy(szTblType, Rec.szValue);
Break;
end;
finally
Check(DbiCloseCursor(Cur));
end;
end;
iOptParams := 1;
pfldOptParams := @OptDesc;
pOptData := @OptData;
end;
StrPCopy(OptData, LDName);
Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil, nil, nil, False));
finally
Session.CloseDatabase(Database);
end;
end;
Примеры использования:
ChangeLangDriver('DBDEMOS', 'EMPLOYEE', 'ancyrr');
ChangeLangDriver('DBDEMOS', 'EMPLOYEE.DB', 'ancyrr');
ChangeLangDriver('C:\DELPHI\DEMOS\DATA', 'CLIENTS.DBF', 'db866ru0');
LDName:
для D1 – имя .LD файла в каталоге IDAPI\LANGDRV;
для D2 и CB – из BDECFG32.HLP поле Short name в табличке по указателю language drivers, dBASE или поле Internal в табличке по указателю language drivers, Paradox;
для D3 и выше – не знаю так как у меня её нет, но думаю, что также, как и в D2.
Существует ли средство для вывода определения структуры таблицы?
Я создал таблицу и хочу получить её структуру, чтобы сделать изменённый оператор создания таблицы.
Nomadicотвечает:
Для этого существует утилита DB2LOOK. Она находится в SQLLIB\MISC.
Пример использования:
CONNECT TO SAMPLE USER xxx USING yyy
DB2LOOK –d SAMPLE –u xxx –e –t employee
Вывод может быть перенаправлен в файл. Полный синтаксис выдаётся по команде:
DB2LOOK ?
У меня есть текстовые файлы, которые я хочу использовать в запросах к DB2, но не хочу создавать из них постоянные таблицы в базе. Что делать?
Nomadicотвечает:
Можно воспользоваться табличными функциями (Table Functions). Они позволяют использовать файлы как таблицы. Примеры приведены в руководстве «Embedded SQL Programming Guide».
Список структуры полей таблицы
В данном проекте создается список структуры полей соответствующей таблицы, с использованием массивов Fields и IndexDefs, который затем отображается в компоненте ListBox. Демонстрационный проект (dbbrowsr.dpr) решает эту задачу несколько иначе. Вы можете сравнить две версии этого кода.
Примечание: Данный код работает только в 16-битной среде.
procedureTForm1.Button1Click(Sender: TObject);
constMyFielddefs: array[ftUnknown..ftGraphic] of string[8] = ('Unknown', 'String', 'Smallint', 'Integer', 'Word','Boolean', 'Float', 'Currency', 'BCD', 'Date','Time', 'DateTime', 'Bytes', 'VarBytes', 'Blob','Memo', 'Graphic');
var
i, Indx: integer;
Definition: string;
begin
for i := 0 toTable1.FieldCount - 1 do begin
Definition := Table1.Fields[i].DisplayLabel;
Definition := Definition + ' ' +MyFieldDefs[Table1.Fields[i].DataType];
Table1.IndexDefs.Update;
ifTable1.Fields[i].IsIndexField then begin
Indx := Table1.IndexDefs.Indexof(Table1.Fields[i].Name);
ifIndx > -1 then ifixPrimary inTable1.IndexDefs[Indx].Options thenDefinition := Definition + ' (Первичный)';
end;
Listbox1.Items.Add(Definition);
end;
end;
Приведенная выше версия не работает в 32-битной среде, поскольку в ней присутствуют дополнительные типы полей. Вот версия, которая работает в 32-битной среде:
procedureTForm1.Button1Click(Sender: TObject);
const
MyFielddefs: array[ftUnknown..ftTypedBinary] of string[11] =('Unknown', 'String', 'Smallint', 'Integer','Word', 'Boolean', 'Float', 'Currency', 'BCD','Date', 'Time', 'DateTime', 'Bytes', 'VarBytes','AutoInc', 'Blob', 'Memo', 'Graphic', 'FmtMemo','ParadoxOle', 'DBaseOle', 'TypedBinary');
var
i, Indx: integer;
Definition: string;
begin
for i := 0 toTable1.FieldCount - 1 do begin
Definition := Table1.Fields[i].DisplayLabel;
Definition := Definition + ' ' +MyFieldDefs[Table1.Fields[i].DataType];
Table1.IndexDefs.Update;
ifTable1.Fields[i].IsIndexField then begin
Indx := Table1.IndexDefs.Indexof(Table1.Fields[i].Name);
ifIndx > -1 thenifixPrimary inTable1.IndexDefs[Indx].Options thenDefinition := Definition + ' (Первичный)';
end;
Listbox1.Items.Add(Definition);
end;
end;
Создание индексного файла из Delphi
Delphi 1
Если вы используете таблицы dBASE или Paradox, то для создания нового индекса воспользуйтесь методом AddIndex. Для примера:
Table1.AddIndex('Articles','Title', []);
создаст индексный файл с именем ARTICLES с использованием поля TITLE в качестве индексного ключа. При создании вы можете воспользоваться различными индексными опциями (например, уникальность, необслуживаемый и пр.) – для получения дополнительной информации обратитесь к электронной справке по Delphi. ПРИМЕЧАНИЕ: Ваша таблица должна быть открыта исключительно для того, чтобы только воспользоваться методом AddIndex.
Поддержка/обновление индексного файла, если только при создании вы не выставили флаг «необслуживаемый», происходит автоматически.
Контекстное меню на основе базы данных
var
m:TMenuItem;
navidummy:TComponent;
…………………………………………………
procedure TMyForm.CreatePopUpMM(Sender: TObject);
begin
Navidummy.free;
Navidummy:=TComponent.create(self);
While notNaviT.EOF do
begin
m := TMenuItem.create(navidummy);
II:=II+1;
withm do begin
name :='MM'+IntToStr(II);
caption := NaviT.Fieldbyname('MyWHAT').AsString;
tag := NaviT.Fieldbyname('MyTAG').AsInteger;
visible:=True;
OnClick:= NaviExec;
end;
MyMenuItem.add(m);
NaviT.Next;
end;
NaviT.Close;
end;
procedureTMyForm.NaviExec(Sender:TObject);
begin
What.text := (Sender asTMenuItem).Caption;
{ Здесь я получаю то, что хочу ! }
Key:= (Sender asTMenuItem).Tag;
end;
Корректное закрытие базы данных приложением Delphi
Delphi 1
Очень интересный и полезный вопрос!! Я сам так с ним до конца и не разобрался! Но я попробую систематизировать события, происходящие при запросе на завершение работы Windows:
Читать дальшеИнтервал:
Закладка: