Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.10.2015, 12:40
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию символы табуляции

проблема в том что при считывании из текстового файла - каждый раз ошибка

Код:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure Form2Activate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
{$R *.dfm}
 uses Unit1, Unit3, Unit4, Unit5;
procedure TForm2.Form2Activate(Sender: TObject);
var
fv1:TextFile;
s,s1,s2,s3,s4:string[255];
s5:string[2];
i,k:integer;
  begin
  StringGrid1.Cells[0,0]:='Цех';
  StringGrid1.Cells[1,0]:='Наименование изделия';
  StringGrid1.Cells[2,0]:='Наименование детали';
  StringGrid1.Cells[3,0]:='Количество деталей, шт.';

  AssignFile(fv1,'Изделия.txt');
  if not(FileExists('Изделия.txt'))
  then
  ShowMessage('Файла с указанным именем не сущетсвует')
  else
    begin
  Reset(fv1);
  Readln(fv1,s);
  i:=-1;
  while not(SeekEof(fv1)) do
     begin
  i:=i+1;
  Str(i:2,s5);
  Readln(fv1,s);
  k:=Pos(Chr($09),s);
  if k=0
then
ShowMessage('Строка №'+s5+' содержит ошибку')
else
        begin
s2:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(Chr($09),s);
if (k=0) or (s1='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
          begin
s3:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(Chr($09),s);
if (k=0) or (s3='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
            begin
s4:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(Chr($09),s);
if (s3='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
              begin
ceh[i]:=s1;
StringGrid1.Cells[0,i]:=s1;
naim[i]:=s2;
StringGrid1.Cells[1,i]:=s2;
det[i]:=s3;
StringGrid1.Cells[2,i]:=s3;
kolich[i]:=StrToFloat(s4);
StringGrid1.Cells[4,i]:=s4;
end;
end;
end;
end;
end;
end;

n:=i;
CloseFile(fv1);
W1:=True;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
Close
end;

end.
Ответить с цитированием
  #2  
Старый 28.10.2015, 12:52
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ну и, что за ошибка? Недостаточно инфы для экстрасенсорики, да и текстовый файл покажите пжлст
Ответить с цитированием
  #3  
Старый 28.10.2015, 13:03
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию вот файлик и проект

proj.rar
Изделия.txt
Ответить с цитированием
  #4  
Старый 28.10.2015, 14:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так это не табуляция, это мусор в первой строковой переменной s1, поскольку она не заполняется ничем, просто невнимательность, вот так вроде сетка наполняется правильно
Код:
procedure TForm1.FormActivate(Sender: TObject);
var
fv1:TextFile;
s,s1,s2,s3,s4:string[255];
s5:string[2];
i,k:integer;
  begin
  StringGrid1.Cells[0,0]:='Цех';
  StringGrid1.Cells[1,0]:='Наименование изделия';
  StringGrid1.Cells[2,0]:='Наименование детали';
  StringGrid1.Cells[3,0]:='Количество деталей, шт.';

  AssignFile(fv1,'Изделия.txt');
  if not(FileExists('Изделия.txt'))
  then
  ShowMessage('Файла с указанным именем не сущетсвует')
  else
    begin
  Reset(fv1);
  Readln(fv1,s);
  i:=0;
  while not(SeekEof(fv1)) do
     begin
  inc(i);
  Readln(fv1,s);
  k:=Pos(#9,s);
  if k=0
then
ShowMessage('Строка №'+s5+' содержит ошибку')
else
        begin
s1:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(#9,s);
if (k=0) or (s1='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
          begin
s2:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(#9,s);
if (k=0) or (s2='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
            begin
s3:=Copy(s,1,k-1);
Delete(s,1,k);
k:=Pos(#9,s);
if (s3='')
then
ShowMessage('Строка №'+s5+'содержит ошибку')
else
              begin
ceh[i]:=s1;
StringGrid1.Cells[0,i]:=s1;
naim[i]:=s2;
StringGrid1.Cells[1,i]:=s2;
det[i]:=s3;
StringGrid1.Cells[2,i]:=s3;
kolich[i]:=StrToFloat(s4);
StringGrid1.Cells[4,i]:=s4;
end;
end;
end;
end;
end;
end;

n:=i;
CloseFile(fv1);
W1:=True;
end;
можно код и упростить, много повторений, пересмотрите немного логику
Ответить с цитированием
  #5  
Старый 28.10.2015, 15:01
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

поменял - теперь
er.jpg
Ответить с цитированием
  #6  
Старый 28.10.2015, 15:49
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

а после запуска программы ,у вас запускается первая кнопка меню "ввод исходных данных? в вашем исправленном варианте ?
Ответить с цитированием
  #7  
Старый 28.10.2015, 22:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Извнт, но не смотрел вашу сборку, времени нет, просто открыл новый проект и в нём немного подправил первопостный код, как оно у вас там работает - неведомо, извнс
Ответить с цитированием
  #8  
Старый 28.10.2015, 23:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Извращенцы.
Код:
procedure LoadGridFromFile(AFileName : String; AGrid : TStringGrid);
var
  I, C : Integer;
  L, S : String;
  Lst : TStringList;
begin
  If Not FileExists(AFileName) Then
    Raise Exception.CreateFmt('File does not exist (%s).',[AFileName]);

  
  Lst := TStringList.Create;
  Try
    Lst.LoadFromFile(AFileName);
    AGrid.Rows := Lst.Count;
    AGrid.Cols := 1;
    For I := 0 To Lst.Count-1 Do
      Begin
        L := Lst[i];
        C := 0;
        While S <> '' Do
          Begin
            L : = Copy(S,1,Pos(#8,S)-1);
            Inc(C);
            If AGrid.Cols < C Then AGrid.Cols := C;
            AGrid.Cells[I,C] := L;
            S := Copy(S,Pos(#8,S),Length(S));
          End;  
      End;
  Finally
    Lst.Free;
  End;
end;

Как-то так. Должно работать...
Ответить с цитированием
  #9  
Старый 29.10.2015, 08:32
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

это программа по методичке препода, и он сказал - что нужно делать ровно по методичке. а там примерно тот код который я написал - но где -то происходит ошибка. и оно не считывает ни одной строки из текстового файла.
Ответить с цитированием
  #10  
Старый 29.10.2015, 10:09
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Известно, что одна и та же деталь может входить в разные изделия и изделие может состоять из разных деталей. Разные цеха могут изготавливать одни и те же детали.
Разработайте алгоритм и программу подсчета количества одноименных деталей, изготовленных всеми цехами для всех изделий. Результаты расчета запишите в новый текстовый файл, содержащий таблицу из двух граф: Наименование детали; Общее количество деталей, шт.
Ответить с цитированием
  #11  
Старый 29.10.2015, 10:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от lam
поменял - теперь...
Это ошибка конвертации текста в число, уберите на время даблслешем строку
Код:
...
// kolich[i]:=StrToFloat(s4);
...
загрузка данных хоть и криво, но работает. Скачал проект и просмотрел, но так и не понял, откуда кол-во деталей задумано будет браться, непонятки
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
lam (29.10.2015)
  #12  
Старый 29.10.2015, 17:42
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

из текстового файла. в котором табуляцией разделены столбцы
Ответить с цитированием
  #13  
Старый 29.10.2015, 17:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

т.е. выходит каждой детали по одной шт.? Пустая графа с кол-вом в текстовом файле
Ответить с цитированием
  #14  
Старый 29.10.2015, 18:09
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

нет, по заданию из екселевского файла выгружается в текстовый . там много деталей.Изделия.txt
Ответить с цитированием
  #15  
Старый 29.10.2015, 18:11
lam lam вне форума
Прохожий
 
Регистрация: 28.10.2015
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

а каким образом можно обойти эту конвертацию
Цитата:
Сообщение от Alegun
Это ошибка конвертации текста в число, уберите на время даблслешем строку
Код:
...
// kolich[i]:=StrToFloat(s4);
...
или хотя бы объясните почему происходит ошибка

Последний раз редактировалось lam, 29.10.2015 в 18:31.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter