Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами в Delphi!!! Обращение к файлу со сложной начинкой! 
V
    Опции темы
DimassS
Дата 13.4.2006, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Проблема в следующем: Файлы формата "DAT" , имеют сложную структуру, сдвоенные ячейки, разные форматы данных и т.д. Хотелось бы написать запрос или что-то в этом роде, чтобы данные этого файла отображались в Delphi, причем чтобы не только просто посмотреть, но и осуществлять редактирование... smile

Натолкните на мысль, заранее благодарю! smile
PM MAIL ICQ   Вверх
StayAtHome
Дата 14.4.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Не совсем понял что требуется... Типизированные файлы? http://vingrad.ru/DELPHI-DELPHI-002029
PM MAIL WWW ICQ YIM   Вверх
Snowy
Дата 14.4.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Т.е. ты хочешь работать с каким-то левым файлом, как с базой?
Тогда тебе придется писать драйвер для этого формата...
PM MAIL   Вверх
DimassS
Дата 19.4.2006, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



А не подскажешь, этот драйвер есть смысл писать, и не подкинешь информации как написать этот драйвер, надо попробовать...

Спасибо за мысль, есть над чем поразмыслить... smile  
PM MAIL ICQ   Вверх
DimassS
Дата 25.4.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Вот что получилось - на форме есть компонент Edit, и две кнопки вот на них обработчики:


Код

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
     OpenDialog.DefaultExt:='ttl';
  if OpenDialog.Execute then EditFile.Text:=OpenDialog.FileName;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  ss:string;
  F: TextFile;
  FF: File;
  MyCol, MyVal: TStringList;
  i,j: integer;
  r : real;
  s8: string[8];
begin
// Шапка
  MyCol:= TStringList.Create;
  MyVal:= TStringList.Create;
  MyCol.Clear;
  MyVal.Clear;
    AssignFile(F, EditFile.Text); { File selected in dialog }
    Reset(F);
    Readln(F, SS);
      if SS[1] = 't' then MyCol.Add(SS) ;
      if SS[1] = 'd' then MyVal.Add(SS) ;
    CloseFile(F);

// Шапка
     // Передача данных
    AssignFile(FF, copy(EditFile.Text,1,length(EditFile.Text)-3)+'dat'); { File selected in dialog }
    Reset(FF);

      While EOF(FF) do
        for j:= 1 to MyVal.Count do
{ТО ЧТО НЕ ПОЛУЧАЕТСЯ}
          case MyVal.Strings[j] of
            'dFloat':begin BlockRead(FF,r,SizeOf®);
                      // Exel:=r
                      end;
         'dInteger4':begin BlockRead(FF,i,SizeOf(i));
                      // Exel:=i
                      end;
          'dString8':begin BlockRead(FF,s8,SizeOf(s8));
                      // Exel:=s8
                      end;
          end;

    CloseFile(FF);


end;


При нажатии на первую выбираем файл формата "TTL", это какбы оглавление таблицы данных
При нажатии на вторую кнопку происходит считывание шапки таблицы, и непосредственный перевод в Excel.
Не получается почему-то определить тип, конструкция CASE выкидывает сообщение: "Ordinal Type required", возможно ли обойти эту ошибку? Или заменить эту конструкцию чем-то другим?


Заранее благодарю! smile   

Это сообщение отредактировал(а) Girder - 26.4.2006, 10:04
PM MAIL ICQ   Вверх
Snowy
Дата 25.4.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



case не применим к строкам.
Используй if then begin ... end else if then begin ... end else...

Добавлено @ 11:06 
P.S. А вообще лучше используй класс TWriter, TReader - там все уже сделано. 
PM MAIL   Вверх
DimassS
Дата 26.4.2006, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Цитата

Используй if then begin ... end else if then begin ... end else...

Не подходит, слишком много нужно обработать типов данных...

Цитата

P.S. А вообще лучше используй класс TWriter, TReader - там все уже сделано. 

Не можешь поподробнее об этом рассказать, как применять, если можно с примером...

Спасибо что откликнулся! 
PM MAIL ICQ   Вверх
Snowy
Дата 26.4.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Пример:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  wr: TWriter;
begin
  try
    fs := TFileStream.Create('C:\1.sav', fmCreate);
    wr := TWriter.Create(fs, 64);
    try
      wr.WriteString('Слон');
      wr.WriteDate(now);
      wr.WriteInteger(2006);
    finally
      wr.FlushBuffer; wr.Free; fs.Free;
    end;
  except end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  rr: TReader;
begin
  try
    fs := TFileStream.Create('C:\1.sav', fmOpenRead);
    rr := TReader.Create(fs, 64);
    try
      ShowMessage(rr.ReadString);
      ShowMessage(DateToStr(rr.ReadDate));
      ShowMessage(IntToStr(rr.ReadInteger));
    finally
      rr.Free; fs.Free;
    end;
  except end;
end;

Если порядок следования данных не известен, то придется подождать.
Я как раз над этим работаю. 
PM MAIL   Вверх
DimassS
Дата 27.4.2006, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



А можно обойтись без записи в файл первой кнопкой, скажем у мены есть файл типов, с обозначение типа каждого столбца, при нажатии на первую кнопку я открываю этот файл. И имеется второй файл с самими данными, соответствующие типам из первого файла, при нажатии на вторую кнопку, я запускаю два цикла и опледеляю тип данных и выдаю результат в ячейки Excel, перевод из Delphi в Excel я уже сделал, сейчас бы разобраться как добыть данные из файла...
Посмотрел вашу программу - вот если бы просто прочитать второй кнопкой файл....

Спасибо за беспокойство!! 

 
PM MAIL ICQ   Вверх
Snowy
Дата 27.4.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Да собственно тут нет проблем.
Я написал примеры для 3-х типов. А закатать в файл можно любой.
В том числе и Variant.
WriteVariant, ReadVariant.
Гони в файл варианты, читай из файла варианты. Передавай ехелю варианты.
А какой тип действительно сидит в варианте это уж пускай TReader сам разбирается.
Вобщем просто используй тип Variant и будет тебе щастя. 
PM MAIL   Вверх
DimassS
Дата 27.4.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Не всё так просто, у меня в таблице есть шапка, с объединенными ячейками, необходимо понять в Delphi, что они объединены и объединить их в Excel, сегодня посматривал эти таблицы на Fortran-е было весело.. прийдётся посидеть подольше... Уже сейчас моя программа разраслась до таких размеров, сразу и не просмотришь. . .  

Это сообщение отредактировал(а) DimassS - 27.4.2006, 10:15
PM MAIL ICQ   Вверх
DimassS
Дата 28.4.2006, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Есть вопрос как прописать в Type переменную которая будет в последующем содержать в себе три типа выглядит примерно так:

Type
TtyValue =  (dInteger, dFloat, dString);

 может так:
TtyValue : array of (dInteger, dFloat, dString);
Почемуто выкидывает ошибку! 

Это сообщение отредактировал(а) DimassS - 28.4.2006, 05:14
PM MAIL ICQ   Вверх
Snowy
Дата 28.4.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Так и прописывать:
Код
Type
  TtyValue =  (dInteger, dFloat, dString);
  TtyValues = set of TtyValue;

var
  val: TtyValues;
  tip: TtyValue;
begin
  tip := dInteger;
  val := [dInteger, dFloat];
  if tip in val then ////
   
PM MAIL   Вверх
DimassS
Дата 28.4.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Вот блин я заламирился, не в тех Type-ах писал, весь день парился, а оказываетсЯ что надо внутри процедуры писать... smile  
Спасибо что помог, сам бы наверное не допёр... 
PM MAIL ICQ   Вверх
DimassS
Дата 28.4.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Есть вопрос вот прописал массив типов в Type 
Код

type
 TtyValue = (dInteger, dFloat, dString);
 TtyValues = set of TtyValue;
//..................................................
//Объявил файл и переменную
F: TextFile;
MyVal: array of TtyValue;
//.....................................................
//Открыл файл для чтения
AssignFile(F, EditFile.Text); 
Reset(F);
//.........................................................
//Пошёл просматривать записи
 While NOT EOF(F) do
      Begin
      I:=0;
      //ss:='';
      readln(F,ss);
        if ss[1] = 'd' then
           begin
              {Ищу в файле строку с данными критериями и назначаю своей переменной нужный тип} 
             {Почему приназначении типа он выкидывает ошибку?}
             ?if ss[2] = 'F' then MyVal[I]:=dFloat;?
             ?if ss[2] = 'I' then MyVal[I]:=dInteger;?
             ?if ss[2] = 'S' then MyVal[I]:=dString;?
              
           end;
        I:=I+1;
      End;



Может надо сначала как-нибудь их заполнить, ну типа MyVal[I].Add?  

Это сообщение отредактировал(а) Girder - 9.5.2006, 20:16
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.