Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа *.TXT


Автор: ivan219 13.1.2006, 22:52
Вот моя программа.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls;

type
  TForm1 = class(TForm)
    Table1: TTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   F: TextFile;
   S:String[20];
   C:String[20];
begin
   Table1.Open;
   AssignFile(F,'a.txt');
   Reset(F);
   try
     while not Eof(F) do
      begin
       Readln(F,S,C);
       Table1.Insert;
       Table1['State_Name'] := S;
       Table1['State_Capital'] :=C;
      end;
   finally
    CloseFile(F);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.EmptyTable;
end;
end.


А вто сообщение которое выскакивает при компиляции и запуске программы компиляция при этом проходит без ошибок.


http://imageshack.us

Автор: Albinos_x 13.1.2006, 23:19
было бы не плохо указать строчку в какой возникает ошибка....
Код

procedure TForm1.Button1Click(Sender: TObject);    
var    
   F: TextFile;    
   S:String[20];    
   C:String[20];
   fs:string;    
begin    
   fs:=ExtractFilePath(Application.ExeName)+'a.txt';
   Table1.Open;    
   if not FileExist(fs) then exit;
   AssignFile(F,fs);           
   try    
    Reset(F);
     while not Eof(F) do    
      begin    
       Readln(F,S);
       Readln(F,C);
       Table1.Append;    
       Table1.fieldbyname('State_Name').asstring := S;    
       Table1.fieldbyname('State_Capital').asstring :=C;
       Table1.Post;    
      end;    
   finally    
    CloseFile(F);    
   end;    
end;

Автор: ivan219 13.1.2006, 23:25
Компилится он без ошибки Ctrl+F9 а когда с выполнением просто F9 то ошибка.


http://imageshack.us
Добавлено @ 23:33
Возможно я чегото не укозал в свойствах Table1 smile

Автор: Albinos_x 13.1.2006, 23:41
Цитата(ivan219 @ 13.1.2006, 23:25 Найти цитируемый пост)

Компилится он без ошибки Ctrl+F9 а когда с выполнением просто F9 то ошибка.

а таблица-то есть,? то есть существует и подключена...
Добавлено @ 23:43
процедура:
Код

Table1.EmptyTable;

удаляет из таблицы все записи сохраняя её структуру...

Автор: Quadr0 14.1.2006, 00:02
...

Автор: Albinos_x 14.1.2006, 00:08
Цитата(Quadr0 @ 14.1.2006, 00:02 Найти цитируемый пост)

Если это в блоке Try Except, то убедись, что все строки файла имеют длину, меньшую 20 или вообще сними это ограничение и используй AnsiString.

у него ошибка не при работе с файлом, а при работе с базой данных в строках:
Цитата(ivan219 @ 13.1.2006, 22:52 Найти цитируемый пост)

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.EmptyTable;
end;

скорее всего у него БД не подключена или файла нет...

Автор: ivan219 14.1.2006, 00:18
Сам фаил есть лежит вместе с прогой в одной папке это фаил a.txt в котором всего

asd asd
qwe qwe

это я тест делал.

Но возможно я чтото и не доделал smile

Может подскажете smile

Автор: Albinos_x 14.1.2006, 00:30
может так стоит сделать:
Код

procedure TForm1.FormCreate(Sender: TObject); 
var sf:PAnsiChar;
begin 
sf:=PChar(ExtractFilePath(Application.ExeName)+'a.txt');
if (FileExists(sf)) then
   begin
   Table1.Active:=false;
   Table1.TableName:=sf;
   Table1.Active:=true;
   Table1.EmptyTable; 
   end
   else
   begin
   Table1.Active:=false;
   Table1.TableName:=sf;
   Table1.TableType:=ttParadox;
   with Table1.FieldDefs do
        begin
        clear;
        Add('State_Name',ftString,21,false);
        Add('State_Capital',ftString,21,false);
        end;
   Table1.CreateTable;
   Table1.Open;
   Table1.Active:=true;
   end;
end;

Автор: ivan219 14.1.2006, 01:05
Всё окончательно за парка блин smile руки уменя неотуда растут.
Бросаю.

Вобщем что мне надо: Edit1 - внего будет вводится информация которую надо найти в 1 столбе или Edit2 - внего будет вводится инаормация которую надо найти в 2 столбе файла a.txt и соответственно надо вы вести на остальные 5 Edit то что находится в этой строке в сего столбов 6 и Edit тоже 6 строк 4000 штук.

Помогите smile

Автор: Albinos_x 14.1.2006, 01:26
Цитата(ivan219 @ 14.1.2006, 01:05 Найти цитируемый пост)

Вобщем проект который я хотел зделать, имеется фаил *.txt в нём инфа разбита на столбики я нашол премер который был выше но ведать там чтото не договорили и вот одни ошибки там премер был именно работа с *.txt и не коких библиотек.

кидай мне на мыло [erase] я посмотрю...
Цитата(ivan219 @ 14.1.2006, 01:05 Найти цитируемый пост)

Ладно может тогда подскажете как можно найти определённую строку в водя определённое слово которое находится в этой строке.

Код

function FindTextFile(F: TextFile;FindStr:String; var index:integer):string;
var s:string;
      b:boolean;
begin
result:='';
index:=-1;
b:=true;
try
Reset(f);
while not EOF(F) do
   begin
   ReadLn(f,S);
   inc(index);
   if pos(FindStr,S)>0 then
      begin
      b:=false;
      Result:=s;
      Break;
      end;
    end;
finally
   if b then i:=-1;
   CloseFile(F);
  end;
end;

Добавлено @ 01:28
за забыл сказать функция вернёт найденную строку, Index будет равен номеру строки в файле начиная от 0, если произошла ошибка или строка не найдена index будет равным -1.

Автор: ivan219 14.1.2006, 01:30
Я не успел изменить с вой пост а ты уже аответил smile
Я его изменил.

Автор: Albinos_x 14.1.2006, 01:52
Цитата(ivan219 @ 14.1.2006, 01:05 Найти цитируемый пост)

которую надо найти в 1 столбе или Edit2 - внего будет вводится инаормация которую надо найти в 2 столбе файла a.txt

Код

{функция вернёт всю строку, 
Index будет равен номеру строки в файле начиная от 0, если произошла ошибка или строка не найдена index будет равным -1
len -количество символов в строке столбца
Num - номер столбца в котором искать от 1}
function FindTextFile(F: TextFile;FindStr:String;Len,Num:integer; var index:integer):string;    
var s:string;    
      b:boolean;    
begin    
result:='';    
index:=-1;    
b:=true;    
try    
Reset(f);    
while not EOF(F) do    
   begin    
   ReadLn(f,S);    
   inc(index);    
   if (pos(FindStr,S)>((Num-1)*Len)) and (pos(FindStr,S)>((Num-1)*Len)+Len) then    
      begin    
      b:=false;    
      Result:=s;    
      Break;    
      end;    
    end;    
finally    
   if b then i:=-1;    
   CloseFile(F);    
  end;    
end;

пример использования:
Код
...
var s,fs:string;
      index:integer;
      f:textfile;
...
assignfile(f,fs);
s:=FindTextFile(f,Edit1.text,20,1,index);
// здесь разбиваешь строку как тебе нужно и заносишь в Эдиты
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)