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

SantilaS

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

Вложения

H

Hombre

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

sinkopa

Well-Known Member
17.06.2009
344
9
#3
Посоветовали использовать конвертор внутри пакета ПО прибора, который делаем из него файл с расширением dat. Задача состоит в том, чтобы открыть этот файл в Delphi для просмотра, т.к. ПО написано под DOS. Прошу откликнуться знающих людей или дать совет по работе над данным файлом. Отвечать можно на avfelichev@mail.ru. Примеры в приложенном файле.
Teechart вполне рулит...
Конвертируем и грузим...
В "первом приближении" так...
Код:
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
 

SantilaS

New Member
17.08.2012
3
0
#4
Даже не знаю. Я бы наверно обрезал мусор в начале и с помощью цикла, работал бы с данными.
Строки вида:
Код:
3.74803e-005 0.156288
Если Вы понимаете что это, то труда не составит написать обработчик. Мне лично не ясно что эти цифры значат.
Эти цифры - координата по оси "У" и координата по оси "Х". Зависимость напряжения от времени. В программировании не силен, а задача состоит в том, чтобы написать программу, которая при выборе файла .dat строила бы граффик по координатам и представляла пользователю картинку. Благодарю за ответ.

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

Cambur

Active Member
20.06.2010
27
0
#5
привет!
нужна ещё она? ... программка?
и на сколько должна быть "крутая"
то есть, энти самые разработчики наразрабатывали...
засунули символ окончания файла после заголовка.
то есть - просто взять и открыть файл не удаётся - нужно или читать его "умным способом", что лениво писать
или перед использованием открыть в текстовом редакторе и удалить один "непечатный символ"
определить какой - просто. открой .dat в моей програмке, символ, на котором оборвалось считывание - тот самый, который
..разработчикам не стоило бы использовать ;)

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

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

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