Как Открыть Файл Расширением Dat В Delphi?

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем SantilaS, 17 авг 2012.

  1. SantilaS

    SantilaS New Member

    Регистрация:
    17 авг 2012
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте. Столкнулся с проблеммой открытия файла созданного при помощи измерительной лаборатории МПИ СЦБ с расширением adc (осцилограмма, график зависимости напряжения от времени). Разработчики прибора отписали, что данный тип файла является проетарным (авторские права) и с ним нельзя работать. Посоветовали использовать конвертор внутри пакета ПО прибора, который делаем из него файл с расширением dat. Задача состоит в том, чтобы открыть этот файл в Delphi для просмотра, т.к. ПО написано под DOS. Прошу откликнуться знающих людей или дать совет по работе над данным файлом. Отвечать можно на avfelichev@mail.ru. Примеры в приложенном файле.
     

    Вложения:

  2. Hombre

    Hombre Гость

    Даже не знаю. Я бы наверно обрезал мусор в начале и с помощью цикла, работал бы с данными.
    Строки вида:
    Код (Text):
    3.74803e-005 0.156288
    Если Вы понимаете что это, то труда не составит написать обработчик. Мне лично не ясно что эти цифры значат.
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Teechart вполне рулит...
    Конвертируем и грузим...
    В "первом приближении" так...
    Код (Delphi):
    procedure TForm1.LoadDataClick(Sender: TObject);
    var
    b: Byte;
    a: PAnsiChar;
    x,y: Double;
    data: TStringList;
    i: Integer;
    m: TMemoryStream;
    begin
    OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
    if not OpenDialog1.Execute then
    Exit;

    // 1. Грузим файл в память
    m := TMemoryStream.Create;
    m.LoadFromFile(OpenDialog1.FileName);
    Pointer(a) := m.Memory;
    // 2. Удаляем #0 отделяющий заголовок от данных
    i := 1;
    while (i < m.Size) do
    begin
    if a^ = #0 then
    a^ := ' ';
    Inc(a);
    Inc(i);
    end;

    // 3. добавляем в конец завершающий #0 (чтобы получилась корректная строка)
    m.Position := m.Size;
    b := 0;
    m.WriteBuffer(b,1);

    // 4. Конвертируем строку (в памяти) из дос кодировки (OEM) в виндовс кодировку (Ansi)
    Pointer(a) := m.Memory;
    OemToAnsi(a,a);

    // 5. Загружаем данные в стринглист
    m.Position := 0;
    data := TStringList.Create;
    data.LoadFromStream(m);
    m.Free;


    if data.Count < 2 then
    Exit;

    Caption := Application.Title;

    // 6. "Вынимаем" заголовок
    //6.1. Первые две строчки в стринглисте однозначно заголовок
    // Помещаем их в Title Chart-а и удаляем из стринглиста (чтобы дальше не "путались под ногами")
    Chart1.Title.Text.Clear;
    Chart1.Title.Text.Add(data[0]);
    data.Delete(0);
    Chart1.Title.Text.Add(data[0]);
    data.Delete(0);


    //6.2. Следующие две строчки - я не знаю что это такое
    // поэтому тоже пихаю в в Title Chart-а
    // Если Вы знаете что это, можете обработать их как нибудь по другому
    Chart1.Title.Text.Add(data[0]);
    data.Delete(0);
    Chart1.Title.Text.Add(data[0]);
    data.Delete(0);

    Series1.Clear;

    if (data.Count < 1) then
    begin
    ShowMessage('Нет данных для вывода');
    Exit;
    end;

    // 7. Приводим строчки в стринглисте к виду <name>=<value>
    // по умолчанию у стринглиста name|value сепаратором является символ "="
    // поэтому заменяем пробел на "=" во всех строчках
    for i := 0 to data.Count-1 do
    data[i] := StringReplace(data[i],' ','=',[rfReplaceAll, rfIgnoreCase]);

    ///////////////////////////////////////////////////////////////////
    // Теперь наши данные готовы к использованию. Заносим их в Chart //
    ///////////////////////////////////////////////////////////////////



    // Поскольку в региональных настройках на компьютере пользователя
    // разделителем десятичных чисел может оказаться знак ","
    // на всякий случай заменяем на "." (на настройки системы это не повлияет)
    // иначе StrToFloat будет выдавать ошибку
    DecimalSeparator := '.';

    // Заносим данные в серию Chart-а
    for i := 0 to data.Count-1 do
    begin
    x := StrToFloat(data.Names[i]);
    y := StrToFloat(data.ValueFromIndex[i]);
    Series1.AddXY(x,y,data.Names[i]);
    end;

    // Запоминаем начальную и конечную точку данных
    // Они нам потребуются для масштабирования и скроллинга
    if (data.Count > 1) then
    begin
    StartPos := StrToFloat(data.Names[0]);
    StopPos := StrToFloat(data.Names[data.Count-1]);
    end
    else
    begin
    StartPos := StrToFloat(data.Names[0]);
    StopPos := StrToFloat(data.Names[0]);
    end;

    data.Free;
    ZoomClear.Click;
    Caption := Application.Title + ' - '+ ExtractFileName(OpenDialog1.FileName);
    end;
    Вот, если нужно, полный код проекта
    Посмотреть вложение Oscilograph.rar
     
  4. SantilaS

    SantilaS New Member

    Регистрация:
    17 авг 2012
    Сообщения:
    3
    Симпатии:
    0
    Эти цифры - координата по оси "У" и координата по оси "Х". Зависимость напряжения от времени. В программировании не силен, а задача состоит в том, чтобы написать программу, которая при выборе файла .dat строила бы граффик по координатам и представляла пользователю картинку. Благодарю за ответ.

    Добавлено: Большое спасибо за помощь.
     
  5. Cambur

    Cambur Active Member

    Регистрация:
    20 июн 2010
    Сообщения:
    27
    Симпатии:
    0
    привет!
    нужна ещё она? ... программка?
    и на сколько должна быть "крутая"
    то есть, энти самые разработчики наразрабатывали...
    засунули символ окончания файла после заголовка.
    то есть - просто взять и открыть файл не удаётся - нужно или читать его "умным способом", что лениво писать
    или перед использованием открыть в текстовом редакторе и удалить один "непечатный символ"
    определить какой - просто. открой .dat в моей програмке, символ, на котором оборвалось считывание - тот самый, который
    ..разработчикам не стоило бы использовать ;)

    график... очень длинный график - 80 тысяч точек на экран не влазит...
    ну, запихнул, как получилось
    нужно кликнуть "обновить" на закладке "График"
    можно выбрать как рисовать - точками или линией и размер по "У"
    если кликать мышкой на нижнем графике - под ним будут значения "Х" и "У"
    а если кликнуть двойным, то увидешь кусок графика в увеличенном виде в окошке с верху
    (от места, где кликнул и на сколько хватит верхнего окна)

    прикрепленно : програмка, *.dat без энтого символа ))
    Посмотреть вложение grafic.rar

    ***график простенький - достаточно чтобы определиться, что именно нужно
    ***если что - пиши на мыло.
    ***я не часто сюда заглядываю..
     
Загрузка...

Поделиться этой страницей