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

Delphi Sources



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

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

программа выглядит примерно так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
сonstructor TMain.Create(UnitFile:String);
  Var f:TextFile;
      i:Integer;
      s:String;
  begin
   <font color="Red">inherited Create;</font>
   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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
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
По умолчанию

Код:
1
2
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
Код:
1
2
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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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, время: 16:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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