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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2008, 09:02
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию Число из файла не присваивается переменной

программа выглядит примерно так:
Код:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,UnitGl, ComCtrls, Buttons, ExtCtrls, Grids;

type
  TForm4 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label1: TLabel;
    Button5: TButton;
    Bevel1: TBevel;
    Button6: TButton;
    Bevel2: TBevel;
    BitBtn1: TBitBtn;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;
  Work:TMain1;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
begin
 If OpenDialog1.Execute Then
  Begin
   Work:=TMain1.Create(OpenDialog1.FileName);
  End;
end;

procedure TForm4.Button2Click(Sender: TObject);
begin
 work.polniispis(StringGrid1);
end;

end.

unit UnitGl;

interface

Uses Dialogs,StdCtrls,SysUtils,grids;

type
TData=record
 day:1..31;
 month:1..12;
 year:Integer;
end;

TOcheredniki=record
 fam:String;
 name:String;
 otch:String;
 plosh:Integer;
 kol:Byte;
 srok:TData;
 staj:TData;
end;

TMain=class
 protected
  NameFile:String;
  l:Integer;
  D:Array Of TOcheredniki;
 public
  Constructor Create(UnitFile:String);
  Destructor Destroy; override;
  Procedure polniispis(StrGr:TStringGrid);
end;

TMain1=class(TMain)
 published
  Constructor Create(UnitFile:String);
  Destructor Destroy; override;
end;

implementation
 Constructor TMain.Create(UnitFile:String);
  Var f:TextFile;
      i:Integer;
      s:String;
  begin
   NameFile:=UnitFile;
   AssignFile(f,UnitFile);
   Reset(f);
   ReadLn(f,l); {Вот здесь переменная l ничего не считывает и    получается= 0}
   SetLength(d,l);
   For i:=1 To l Do
    Begin
     ReadLn(f,d[i].fam);
     ReadLn(f,d[i].name);
     ReadLn(f,d[i].otch);
     ReadLn(f,d[i].plosh);
     ReadLn(f,d[i].kol);
     ReadLn(f,d[i].srok.day,d[i].srok.month,d[i].srok.year);
     ReadLn(f,d[i].staj.day,d[i].staj.month,d[i].staj.year);
    End;
   CloseFile(f);
  end;

  Procedure TMain.polniispis(StrGr:TStringGrid);
   var i:Integer;
   begin
    StrGr.RowCount:=l;
      For i:=1 To l Do
   end;

  Destructor TMain.Destroy;
   begin
   end;
  Constructor TMain1.Create(UnitFile:String);
   begin
   end;
  Destructor TMain1.Destroy;
   begin
   end;
end.
Так программа запускается, работает, но l = 0.
В текстовом файле в самом начале стоит число не равное 0.
Помогите плиз, если знаете в чем дело...


Aristarh Dark: пользуемся тэгами!!!
Ответить с цитированием
  #2  
Старый 13.05.2008, 09:35
Аватар для SedmoiDemon
SedmoiDemon SedmoiDemon вне форума
Прохожий
 
Регистрация: 11.05.2008
Сообщения: 14
Репутация: 10
По умолчанию

Друг, я если честно чайник, может чего не понимаю, но "Reset(f)"-это вроде при записи файла, при чтении используется вроде "rewrite(f)"... еще так и не увидел указа позиции(вроде "seek")... но эти методы я использовал, заменив "f:TextFile" на "f:file of byte", так что извени если не посуществу совет
Ответить с цитированием
  #3  
Старый 13.05.2008, 09:53
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Во-первых, зачем использовать TextFile для структурных данных?
Во-вторых, если объявил TextFile, то будь добр и читай/пиши только строковые переменные, а потом их преобразовывай.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #4  
Старый 13.05.2008, 10:24
voron_paa voron_paa вне форума
Прохожий
 
Регистрация: 26.01.2008
Сообщения: 49
Репутация: 10
По умолчанию

Цитата:
Сообщение от SedmoiDemon
"Reset(f)"-это вроде при записи файла, при чтении используется вроде "rewrite(f)"

Наоборот...

Погоди минитут 15 сейчас свой вариант брошу...
Ты с классами напутал...
Ответить с цитированием
  #5  
Старый 13.05.2008, 10:26
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

да пробовал я и строковые переменные, но один фиг получается 0
Ответить с цитированием
  #6  
Старый 13.05.2008, 10:45
voron_paa voron_paa вне форума
Прохожий
 
Регистрация: 26.01.2008
Сообщения: 49
Репутация: 10
По умолчанию

Цитата:
Сообщение от Nicoman
да пробовал я и строковые переменные, но один фиг получается 0

Код:
сonstructor TMain.Create(UnitFile:String);
  Var f:TextFile;
      i:Integer;
      s:String;
  begin
   inherited Create;
   NameFile:=UnitFile;
   AssignFile(f,UnitFile);
   Reset(f);
   ReadLn(f,l); {Вот здесь переменная l ничего не считывает и    получается= 0}
   SetLength(d,l);
   For i:=1 To l Do
    Begin
     ReadLn(f,d[i].fam);
     ReadLn(f,d[i].name);
     ReadLn(f,d[i].otch);
     ReadLn(f,d[i].plosh);
     ReadLn(f,d[i].kol);
     ReadLn(f,d[i].srok.day,d[i].srok.month,d[i].srok.year);
     ReadLn(f,d[i].staj.day,d[i].staj.month,d[i].staj.year);
    End;
   CloseFile(f);
  end;

Измени код конструктора... срузу не заметил ...

К стати брось исходник... может если так не пройдёт в нём покапаемся ... хотя если чесно ты перемудрил...
Можно гораздо короче и проще сделать..

Последний раз редактировалось voron_paa, 13.05.2008 в 10:49.
Ответить с цитированием
  #7  
Старый 13.05.2008, 11:48
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

Все равно не помогает, опять ноль выводит... А насчет исходника, то я почти все скинул (самое главное)
Ответить с цитированием
  #8  
Старый 13.05.2008, 11:52
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Код:
var
f: File of Integer;
i: Byte;
begin
AssignFile(f, '1.txt');
Reset(f);
Read(f, i);
CloseFile(f);
end;
Разве так не работает?
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.

Последний раз редактировалось The Shadow, 13.05.2008 в 12:13.
Ответить с цитированием
  #9  
Старый 13.05.2008, 11:59
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

мне нельзя fail of integer, там еще есть и текстовые значения (дальше)...
Ответить с цитированием
  #10  
Старый 13.05.2008, 12:00
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Код:
var
f: file of TMyRecord; //В типе-записи нельзя использовать строки String, замени их на PChar или String[макс. длина строки]
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #11  
Старый 13.05.2008, 12:01
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

плюс к тому же в AssignFile сначала идет переменная, а потом файл
Ответить с цитированием
  #12  
Старый 13.05.2008, 12:03
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от The Shadow
Код:
var
f: file of TMyRecord; //В типе-записи нельзя использовать строки String, замени их на PChar или String[макс. длина строки]

если можно, то поподробнее, а то есть много вопросов
Ответить с цитированием
  #13  
Старый 13.05.2008, 12:12
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Код:
TData=record
 day:1..31;
 month:1..12;
 year:Integer;
end;

TOcheredniki=record
 fam:String[50];
 name:String[30];
 otch:String[50];
 plosh:Integer;
 kol:Byte;
 srok:TData;
 staj:TData;
end;
var
Ocheredniki: TOcheredniki;
f: file of TOcheredniki;
begin
AssignFile(f, 'x.txt');
Reset(f);
Read(f, Ocheredniki);
//
CloseFile(f);
end;
end;
Я сразу на форуме писал, поэтому ошибся.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #14  
Старый 13.05.2008, 12:26
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

Так тоже не пойдет... Мне надо из файла для начала вытащить только одно число, оно стоит в самом начале. Мне кажется, что ошибка где-то в объявлении конструктора или в
procedure TForm4.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute Then
Begin
Work:=TMain1.Create(OpenDialog1.FileName);
End;
end;

если l присваивать например 10, то дальше программа работает нормально
Ответить с цитированием
  #15  
Старый 13.05.2008, 12:50
Nicoman Nicoman вне форума
Прохожий
 
Регистрация: 13.05.2008
Сообщения: 13
Репутация: 10
По умолчанию

Если что, то вот ссылка на исходник: http://ifolder.ru/6539624
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter