Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с записным типом / 21 сообщений из 21, страница 1 из 1
13.03.2018, 22:10
    #39614420
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Дан файл записей.
1. Исходные данные

Файл org_tab.bin
Структура файла:
Otdel: Char 16; Отдел
Dolg: Char 21; Должность
FIO: Char 31; ФИО
Oklad: Int; // 4 byte Оклад
Auto: Char 3; Личный автомобиль
Prava: Char 3; Права
Pass: Char 13; Паспорт
SizeOf=91

Файл нужно коррентно обработать (считать все записи).
Сейчас делаю так.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TEmp=record
  Otdel: String[16];
  Dolg: String[21];
  FIO: String[31];
  Oklad: Integer;
  Auto: String[3];
  Prava: String[3];
  Pass: String[13];
  end;



Работает некорректно, неверно читает файл. Что делать с типами вроде Char 13 указанными в задании? Исходный файл прикладываю.
...
Рейтинг: 0 / 0
13.03.2018, 22:21
    #39614426
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Как рано мог уж он тревожить
Сердца кокеток записных!

Девушка, код давай!
...
Рейтинг: 0 / 0
13.03.2018, 22:25
    #39614431
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Я не девушка :)

Вот код.

Код: pascal
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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Data.DB,
  Data.Win.ADODB;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    ADOConnection1: TADOConnection;
    Employees: TADOTable;
    ADOQuery1: TADOQuery;
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TEmp=record
  Otdel: String[16];
  Dolg: String[21];
  FIO: String[31];
  Oklad: Integer;
  Auto: String[3];
  Prava: String[3];
  Pass: String[13];
  end;

var
  Form1: TForm1;
  F:File of TEmp;
  num:integer;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var zap:TEmp;
var i:integer;
begin

AssignFile(F, ExtractFilePath(Application.ExeName)+'org_tab.bin');
reset(f);
for i:= 1 to 91 do
begin
read(f, zap);
Employees.Append;
Employees.FieldByName('EmployeesID').AsInteger:=num+i;
Employees.FieldByName('FIO').AsString:=zap.FIO;
Employees.FieldByName('Dolg').AsString:=zap.Dolg;
Employees.FieldByName('Auto').AsString:=zap.Auto;
Employees.FieldByName('Prava').AsString:=zap.Prava;
Employees.FieldByName('Pass').AsString:=zap.Pass;
Employees.FieldByName('Oklad').AsInteger:=zap.Oklad;
Employees.Post;

end;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
ADOConnection1.Connected:=False;
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+ExtractFilePath(Application.ExeName);
ADOConnection1.ConnectionString:=ADOConnection1.ConnectionString+'org.mdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
ADOConnection1.ConnectionString:=ADOConnection1.ConnectionString+'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;';
ADOConnection1.ConnectionString:=ADOConnection1.ConnectionString+'Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;';

ADOConnection1.Connected:=True;

Employees.Active:=True;
ADOQuery1.Active:=True;
num:=ADOQuery1.FieldByName('Maximum').AsInteger;
end;

end.
...
Рейтинг: 0 / 0
13.03.2018, 22:40
    #39614434
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

версия Delphi какая?
...
Рейтинг: 0 / 0
13.03.2018, 22:42
    #39614436
Помогите с записным типом
Debusen,
Код: plaintext
1.
2.
1.  sizeof(zap.Dolg) = ?
2.  reset(f, ?);
3.  eof(f); ?
...
Рейтинг: 0 / 0
13.03.2018, 22:59
    #39614442
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

не надо было строки использовать. В нулевом байте коротких строк хранится длина, а ты ее затираешь, т.к. в исходном фале нет длины.

Написано Char - их и используй.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TEmp = packed record
    Otdel: array [0..15] of char ;
    Dolg: array [0..20] of char ;
    FIO: array [0..30] of char ;
    Oklad: Integer;
    Auto: array [0..2] of char ;
    Prava: array [0..2] of char ;
    Pass: array [0..12] of char ;
  end;
...
Рейтинг: 0 / 0
13.03.2018, 23:01
    #39614443
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Насяль-ник-аDebusen,
Код: plaintext
1.
2.
1.  sizeof(zap.Dolg) = ?
2.  reset(f, ?);
3.  eof(f); ?

SizeOf(zap.Dolg) показывает 22. Я понимаю что в этом проблема, но не знаю как решить.
Ресет я сделал.
Eof не понимаю зачем.
Прошу не задавать ребусы, а просто пояснить что я сделал не так и как сделать нормально.
Версия дельфи XE8.
...
Рейтинг: 0 / 0
13.03.2018, 23:02
    #39614444
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
чччД, спасибо. А как потом преобразовать массив в тип String, который видимо мне нужен?
...
Рейтинг: 0 / 0
13.03.2018, 23:12
    #39614446
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

да прямо так и пиши:

Код: pascal
1.
2.
3.
4.
5.
6.
var
  fStr : string;
...
begin
...
    fStr := zap.Otdel;


Лишние нулики и отсекутся. Волшебство ибо.
...
Рейтинг: 0 / 0
13.03.2018, 23:18
    #39614450
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
чччД,
спасибо, но все равно программа косячит и не работает корректно. Можете посмотреть файл и сказать что я сделал не так? SizeOf(zap) по непонятной причине показывает вообще 180.
...
Рейтинг: 0 / 0
13.03.2018, 23:21
    #39614452
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

1. 21253924 - ?

2. "программа косячит и не работает корректно" - это как понимать?
...
Рейтинг: 0 / 0
13.03.2018, 23:27
    #39614455
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen...Можете посмотреть файл и сказать что я сделал не так?...

Да ты упорота, зайка.
Я тебе про массив символов писал, а ты что тут снова со строками выкладываешь? То есть, ты ничего не делаешь, несмотря на то, что я тут распинаюсь.

Вместо тебя твою программу переделывать?
...
Рейтинг: 0 / 0
13.03.2018, 23:35
    #39614457
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
чччДDebusen...Можете посмотреть файл и сказать что я сделал не так?...

Да ты упорота, зайка.
Я тебе про массив символов писал, а ты что тут снова со строками выкладываешь? То есть, ты ничего не делаешь, несмотря на то, что я тут распинаюсь.

Вместо тебя твою программу переделывать?

Извините, я забыл пересохранить файл.
Вот как сейчас это выглядит.
Нет, программу переделывать не надо, просто указать на ошибки. Я подозреваю что тип char состоит не из одного байта, в этом косяк.
...
Рейтинг: 0 / 0
13.03.2018, 23:35
    #39614460
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
И все-таки я настаиваю что я ОН, а не она. Хочется как-то сохранить половую идентичность.
...
Рейтинг: 0 / 0
13.03.2018, 23:37
    #39614461
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Версию дельфи я указал выше.
Программа косячит - считывает явно не то что нужно. В таблицу заносятся китайские символы.
...
Рейтинг: 0 / 0
13.03.2018, 23:42
    #39614464
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

AnsiChar?
...
Рейтинг: 0 / 0
13.03.2018, 23:43
    #39614465
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
DebusenЯ подозреваю что тип char состоит не из одного байта, в этом косяк.
А почему я уже третий раз спрашиваю - 21253924 , не догадываешься?
...
ansichar используй.
...
Рейтинг: 0 / 0
13.03.2018, 23:51
    #39614467
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
makhaonDebusen,

AnsiChar?
Спасибо, это помогло.
И теперь последний, возможно самый глупый вопрос. Почему SizeOf(zap) показывает 92 вместо 91? Я три раза перепроверил длину всех полей, должно быть 91.
Код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TEmp=record
    Otdel: array [0..15] of ansichar ;
    Dolg: array [0..20] of ansichar ;
    FIO: array [0..30] of ansichar;
    Oklad: Integer;
    Auto: array [0..2] of ansichar;
    Prava: array [0..2] of ansichar;
    Pass: array [0..12] of ansichar;
  end;
...
Рейтинг: 0 / 0
14.03.2018, 00:00
    #39614470
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Debusen,

компилятор умничает, на границу слова в памяти выравнивает, для скорости.
Получается не размер записи, а размер выделяемого под запись блока. Если хочешь ровно 91, пиши:

Код: pascal
1.
  TEmp = packed record



Но смысла в этом совсем мало.
...
Рейтинг: 0 / 0
14.03.2018, 00:25
    #39614474
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с записным типом
Всем огромное спасибо за помощь, все проблемы решены, всё получилось.
...
Рейтинг: 0 / 0
14.03.2018, 01:14
    #39614481
Помогите с записным типом
DebusenРесет я сделал.
Eof не понимаю зачем.
Прошу не задавать ребусы
1. reset -> F1 -> читаем о втором параметре
2.1 Eof -> F1 -> читаем о том как долго читать (у тебя нет 91 записи, где ты взял это число ?)
2.2 CloseFile -> F1

При разгадке 'ребуса' повышается количество ассоциативных связей. Что в дальнейшем повышает продуктивность решения схожих задач.

всё получилось.Каковы твои критерии слова "всё" и/или слова "получилось" ? (увидел первую прочитанную запись и обрадовался)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с записным типом / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]