powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с записным типом
21 сообщений из 21, страница 1 из 1
Помогите с записным типом
    #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
Помогите с записным типом
    #39614426
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как рано мог уж он тревожить
Сердца кокеток записных!

Девушка, код давай!
...
Рейтинг: 0 / 0
Помогите с записным типом
    #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
Помогите с записным типом
    #39614434
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Debusen,

версия Delphi какая?
...
Рейтинг: 0 / 0
Помогите с записным типом
    #39614436
Debusen,
Код: plaintext
1.
2.
1.  sizeof(zap.Dolg) = ?
2.  reset(f, ?);
3.  eof(f); ?
...
Рейтинг: 0 / 0
Помогите с записным типом
    #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
Помогите с записным типом
    #39614443
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насяль-ник-аDebusen,
Код: plaintext
1.
2.
1.  sizeof(zap.Dolg) = ?
2.  reset(f, ?);
3.  eof(f); ?

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

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

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


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

1. 21253924 - ?

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

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

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

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

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

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

AnsiChar?
...
Рейтинг: 0 / 0
Помогите с записным типом
    #39614465
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DebusenЯ подозреваю что тип char состоит не из одного байта, в этом косяк.
А почему я уже третий раз спрашиваю - 21253924 , не догадываешься?
...
ansichar используй.
...
Рейтинг: 0 / 0
Помогите с записным типом
    #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
Помогите с записным типом
    #39614470
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Debusen,

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

Код: pascal
1.
  TEmp = packed record



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

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

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


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