четверг, 16 октября 2014 г.

Газобалонное оборудование в Ростове-на-Дону

На Ростовском Автофоруме рекомендуют 2 конторы:
Автогаз
Экогаз-Ростов

среда, 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 уровня не появлялись (как это сделать? если кто знает ответ отпишитесь в комментариях), либо подружить программы с короткими путями, используя следующую функцию:
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 г.

Смотрю "Подъем с глубины"

   Смотрю американский трешевый ужастик "Подъем с глубины", суды по размеру бюджета расчитывали явно на лучшее. А так получился обычный трэшак но с более-менее известными голливудскими актерами.