четверг, 16 октября 2014 г.
среда, 3 апреля 2013 г.
Умный BDE
Пришлось поменять структуру каталогов базы данных одного из рабочих проектов и вдруг получил ошибку File name is too long for a Paradox version 5.0 table. То есть оказывается что таблицы в формате Paradox 5.0, а не 7.0 как я думал, а формат 5.0 (5 уровень) не поддерживает длинные имена (более 64 символов). Но ведь должна быть версия 7.0, путем изысканий в интернете выяснилось что "умный" BDE при создании таблицы анализирует какие возможности используются и выбирает минимально возможный уровень (версию) БД для поддержания совместимости с ранними версиями.
В итоге имеем в сетевом каталоге БД часть таблиц с уровнем 5 и часть с уровнем 7. Проверяется легко с помощью Database Sesktop (DBD): открываем таблицу, выбираем Table - Info structure... и в заголовке появившегося окна видим либо Structure information Paradox 7... либо Structure information Paradox 5.0 for Windows...
Что же теперь делать?
Либо конвертировать все таблицы 5 уровня в формат 7 уровня и переделывать соответствующий софт чтобы таблицы 5 уровня не появлялись (как это сделать? если кто знает ответ отпишитесь в комментариях), либо подружить программы с короткими путями, используя следующую функцию:
Что же теперь делать?
Либо конвертировать все таблицы 5 уровня в формат 7 уровня и переделывать соответствующий софт чтобы таблицы 5 уровня не появлялись (как это сделать? если кто знает ответ отпишитесь в комментариях), либо подружить программы с короткими путями, используя следующую функцию:
function ExtractShortPathName(const FileName: string): string;
var
Buffer: array[0..MAX_PATH - 1] of Char;
begin
SetString(Result, Buffer,
GetShortPathName(PChar(FileName), Buffer, SizeOf(Buffer)));
end;
Правда возможен случай когда даже сокращенный с помощью функции путь будет длиннее 64 символов, впрочем это не мой вариант, но стоит учитывать.четверг, 19 июля 2012 г.
Бинарный поиск по сортированной таблице VK DBF
Пример
function Poisk(Table1: TVKDBFNTX; PoiskFields, PoiskKey: string; LowNo: Integer
= 1; HighNo: Integer = 1): Boolean;
var
LowNomer, HighNomer, mid, i: Integer;
slist: TStringList;
sKey: string;
function GetFieldSumm: string;
var
i1: Byte;
begin
Result := '';
for i1 := 0 to slist.Count - 1 do
Result := Result + Table1.FieldByName(slist[i1]).AsString;
end;
begin
slist := TStringList.Create;
slist.Text := stringReplace(PoiskFields, ';', #13#10, [rfReplaceAll]);
HighNomer := IfThen(HighNo = 1, Table1.RecordCount, HighNo);
LowNomer := LowNo;
//функция AnsiCompareStr сравнивает 2 строки без учета регистра
// возвращает значение -1 если S1S2
Table1.SetTmpRecord(LowNomer);
sKey := GetFieldSumm;
if AnsiCompareText(sKey, PoiskKey) > 0 then
Result := False
else
begin
Table1.SetTmpRecord(HighNomer);
sKey := GetFieldSumm;
if AnsiCompareText(sKey, PoiskKey) < 0 then
Result := False
else
begin
while (HighNomer - LowNomer) > 1 do
begin
mid := (LowNomer + HighNomer) div 2;
Table1.SetTmpRecord(mid);
sKey := GetFieldSumm;
if AnsiCompareText(sKey, PoiskKey) >= 0 then
HighNomer := mid
else
LowNomer := mid;
end;
Table1.SetTmpRecord(LowNomer);
sKey := GetFieldSumm;
i := LowNomer;
if AnsiCompareText(sKey, PoiskKey) < 0 then
begin
Table1.SetTmpRecord(HighNomer);
sKey := GetFieldSumm;
i := HighNomer;
end;
Table1.CloseTmpRecord;
if AnsiCompareText(sKey, PoiskKey) = 0 then
begin
Result := True;
Table1.RecNo := i;
end
else
Result := False;
end;
end;
FreeAndNil(slist);
end;
воскресенье, 10 июля 2011 г.
Обреченный рейс
Смотрю фильм "Обреченный рейс" 2007 года - про вирус оживляющий мертвяков внутри летящего самолета.
Трешняк полный.
Трешняк полный.
воскресенье, 27 марта 2011 г.
Смотрю "Подъем с глубины"
Смотрю американский трешевый ужастик "Подъем с глубины", суды по размеру бюджета расчитывали явно на лучшее. А так получился обычный трэшак но с более-менее известными голливудскими актерами.
Ярлыки:
Cinema
Подписаться на:
Комментарии (Atom)