Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2016, 13:36   #1
nikitin.leha-201
Пользователь
 
Регистрация: 19.11.2016
Сообщений: 24
По умолчанию Создать редактор для сравнения файлов (Pascal - Delphi)

Всем добрый день !

В общем задача стоит , создать мини HEX редактор, для сравнения и, если требуется корректировки файлов. Работать преимущественно с файлами (bin, Hex), но хотелось бы чтоб редактор работал со всеми файлами (всех типов).
Задача такая : в первое окно загружается файл (оригинал), во второе окно файл (подопытный). Если есть несовпадения, то программа подсчитывает сколько несовпадений и выводит в Label (на форму). Можно реализовать при нажатии на кнопку, чтоб происходило сравнение файлов. А лучше, чтоб при загрузке второго файла, сразу производилось сравнение и подсчёт несовпадений, с выводом в Label. Ещё момент, оригинал может быть скажем в 700 байт, а подопытный, в 2048 и т.д (бывшей в работе уже). Так вот надо чтоб программа показывала не совпадения по оригиналу, остальные данные (переменные) не важны.
И чтоб несовпадения, выделялись и на каких адресах....
Вот начали потихонечку, думали что будет по проще, но оказывается в Дельфи, нет компонента, который бы загружал файл, без описания структуры. Используем Memo, но есть момент : большие файлы долго загружает, не очень айс скажем.

Код:
var
buf: array[0..15] of Byte;
f: TFileStream;
b: array[0..15] of Byte;
i, j,count: Integer;
s:string;
begin
memo1.Clear;
if opendialog1.Execute then
begin
i:=0;
f:=tfilestream.Create(opendialog1.FileName,fmopenRead);
Count := 1 + (f.Size + 15) div 16;
f.Position := 0;
for i := 1 to f.Size div 16 do  // вот эта строчка отвечает за длину файла
begin
f.Read(b, 16);
s := SysUtils.Format('%.8X: ', [16 * (i - 1)]);
for j := 0 to 15 do
s := s + SysUtils.Format('%.2X', [b[j]]);
memo1.Lines.Add(s);
Memo1.SelStart := 0; // код чтоб прокрутка мемо вверх возвращалась, минус большой файл в двое больше грузится с этим кодом
Memo1.SelLength := 0
end;
if f.Size mod 16 <> 0 then
begin
f.Read(b, f.Size mod 16);
s := SysUtils.Format('%.8X: ', [16 * (f.Size div 16)]);
for j := 0 to f.Size mod 16 - 1 do
s := s + SysUtils.Format('%.2X', [b[j]]);
memo1.Lines.Add(s);
Memo1.SelStart := 0; // код чтоб прокрутка мемо вверх возвращалась, минус большой файл в двое больше грузится с этим кодом
Memo1.SelLength := 0
end;
f.Free;
end;
end;
Далее загружаем второй файл, во второе окно Memo2
а вот как сверку произвести и вывести количество несовпадений, пока не получается.

Последний раз редактировалось nikitin.leha-201; 27.11.2016 в 13:40.
nikitin.leha-201 вне форума Ответить с цитированием
Старый 28.11.2016, 11:54   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

в первом приближении можно просто СРАВНИТЬ аналогичные(имеющие одинаковые индексы) строки записанные в ОБА мемо.

Код:
changecount:=0;
for j:=0 to min(memo1.lines.count, memo2.lines.count)-1 do begin
  s1:=memo1.lines.strings[i];
  s2:=memo2.lines.strings[i];
  if s1 = s2 then continue;
  for i:=1 to 16{max(length(s1), length(s2)} do begin
    if i<length(s1) then r1:=s1[i];
    if i<length(s2) then r2:=s2[i];
    if r1=r2 then continue;
    Inc(changecount); 
  end;
end;
ЭТО не готовый код а только пример! многое нюансы в т.ч. РАЗНЫЕ размеры файлов, размеры НЕ кратные 16, ... не учтены.
А если и кажется что учтены, то наверняка не полностью.

Цитата:
Используем Memo, но есть момент : большие файлы долго загружает,
Код:
Memo1.Lines.BeginUpdate;
try
....//заполнение
finally
Memo1.Lines.EndUpdate;
end;
позволит немного сократить время загрузки

НО правильнее будет СРАВНИВАТЬ данные в файлах ДО загрузки в мемо.
используя ОДНОВРЕМЕННОЕ чтение двух файлов в два различных массива(буфера).
Код:
fMaket.Read(bufmaket, 16);
fTest.Read(buftest, 16);
// а здесь сравнение двух буферных массивов (bufmaket, buftest)
//А еще нужны будут проверки на длину файлов(точнее количество считанной информации из каждого файла) и делать это надо ДО самого сравнения буферов
Код:
lenamaket:=fmaket.Read(bufmaket, 16);
lentest:=ftest.Read( buftest, 16);
for i:=0 to 15 do begin
  if (i<lenmaket) and (i<lentest) and (bufmaket[i]=buftest[i]) then //есть информация в обоих файлах и  она одинакова
  else if  ?????????
  .........
  else ...
end;
А уж результаты такого сравнения ВЫВОДИТЬ тем или иным способом в Мемо и ДРУГИЕ визуальные компоненты.
например как-ТО отобразить ЧИСЛО различий на КАЖДОЙ "строке мемо" (то бишь В КАЖДОМ блоке длиной 16 байт).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.11.2016 в 12:32.
evg_m вне форума Ответить с цитированием
Старый 28.11.2016, 21:06   #3
nikitin.leha-201
Пользователь
 
Регистрация: 19.11.2016
Сообщений: 24
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в первом приближении можно просто СРАВНИТЬ аналогичные(имеющие одинаковые индексы) строки записанные в ОБА мемо.

Код:
changecount:=0;
for j:=0 to min(memo1.lines.count, memo2.lines.count)-1 do begin
  s1:=memo1.lines.strings[i];
  s2:=memo2.lines.strings[i];
  if s1 = s2 then continue;
  for i:=1 to 16{max(length(s1), length(s2)} do begin
    if i<length(s1) then r1:=s1[i];
    if i<length(s2) then r2:=s2[i];
    if r1=r2 then continue;
    Inc(changecount); 
  end;
end;
ЭТО не готовый код а только пример! многое нюансы в т.ч. РАЗНЫЕ размеры файлов, размеры НЕ кратные 16, ... не учтены.
А если и кажется что учтены, то наверняка не полностью.


Код:
Memo1.Lines.BeginUpdate;
try
....//заполнение
finally
Memo1.Lines.EndUpdate;
end;
позволит немного сократить время загрузки

НО правильнее будет СРАВНИВАТЬ данные в файлах ДО загрузки в мемо.
используя ОДНОВРЕМЕННОЕ чтение двух файлов в два различных массива(буфера).
Код:
fMaket.Read(bufmaket, 16);
fTest.Read(buftest, 16);
// а здесь сравнение двух буферных массивов (bufmaket, buftest)
//А еще нужны будут проверки на длину файлов(точнее количество считанной информации из каждого файла) и делать это надо ДО самого сравнения буферов
Код:
lenamaket:=fmaket.Read(bufmaket, 16);
lentest:=ftest.Read( buftest, 16);
for i:=0 to 15 do begin
  if (i<lenmaket) and (i<lentest) and (bufmaket[i]=buftest[i]) then //есть информация в обоих файлах и  она одинакова
  else if  ?????????
  .........
  else ...
end;
А уж результаты такого сравнения ВЫВОДИТЬ тем или иным способом в Мемо и ДРУГИЕ визуальные компоненты.
например как-ТО отобразить ЧИСЛО различий на КАЖДОЙ "строке мемо" (то бишь В КАЖДОМ блоке длиной 16 байт).
Добрый вечер ! Спасибо за ответы и помощь, попробывали и с новым кодом , всё ровно долго загрузка идёт....
Вот если без данных об адресах, то файл загружается быстро, но что , за редактор без адреса?

Код:
var
f:tfilestream;
s:byte;
i,i2:integer;
a,b,c:string;

begin
Form1.Caption:='Verification of files v 1.1 ';
if opendialog1.Execute then
begin
memo2.Clear;
f:=tfilestream.Create(opendialog1.FileName,fmopenReadWrite);
i2:=0;
for i := 0 to f.Size -1 do
begin
if i2=16 then
begin
a:=a+#13#10;
i2:=0;
end;
i2:=i2+1;
f.Seek(i,soFromBeginning);
f.Read(s,sizeof(s));
a:=a+(IntToHex(s, 2)+' ');
end;
memo2.Text:=a;
f.Free;
end;
end;
Загружается быстро, даже большой файл, но без адресов, не серьёзно...
nikitin.leha-201 вне форума Ответить с цитированием
Старый 28.11.2016, 21:23   #4
nikitin.leha-201
Пользователь
 
Регистрация: 19.11.2016
Сообщений: 24
По умолчанию

Цитата:
Сообщение от nikitin.leha-201 Посмотреть сообщение
Всем добрый день !

В общем задача стоит , создать мини HEX редактор, для сравнения и, если требуется корректировки файлов. Работать преимущественно с файлами (bin, Hex), но хотелось бы чтоб редактор работал со всеми файлами (всех типов).
Задача такая : в первое окно загружается файл (оригинал), во второе окно файл (подопытный). Если есть несовпадения, то программа подсчитывает сколько несовпадений и выводит в Label (на форму). Можно реализовать при нажатии на кнопку, чтоб происходило сравнение файлов. А лучше, чтоб при загрузке второго файла, сразу производилось сравнение и подсчёт несовпадений, с выводом в Label. Ещё момент, оригинал может быть скажем в 700 байт, а подопытный, в 2048 и т.д (бывшей в работе уже). Так вот надо чтоб программа показывала не совпадения по оригиналу, остальные данные (переменные) не важны.
И чтоб несовпадения, выделялись и на каких адресах....
Вот начали потихонечку, думали что будет по проще, но оказывается в Дельфи, нет компонента, который бы загружал файл, без описания структуры. Используем Memo, но есть момент : большие файлы долго загружает, не очень айс скажем.

Код:
var
buf: array[0..15] of Byte;
f: TFileStream;
b: array[0..15] of Byte;
i, j,count: Integer;
s:string;
begin
memo1.Clear;
if opendialog1.Execute then
begin
i:=0;
f:=tfilestream.Create(opendialog1.FileName,fmopenRead);
Count := 1 + (f.Size + 15) div 16;
f.Position := 0;
for i := 1 to f.Size div 16 do  // вот эта строчка отвечает за длину файла
begin
f.Read(b, 16);
s := SysUtils.Format('%.8X: ', [16 * (i - 1)]);
for j := 0 to 15 do
s := s + SysUtils.Format('%.2X', [b[j]]);
memo1.Lines.Add(s);
Memo1.SelStart := 0; // код чтоб прокрутка мемо вверх возвращалась, минус большой файл в двое больше грузится с этим кодом
Memo1.SelLength := 0
end;
if f.Size mod 16 <> 0 then
begin
f.Read(b, f.Size mod 16);
s := SysUtils.Format('%.8X: ', [16 * (f.Size div 16)]);
for j := 0 to f.Size mod 16 - 1 do
s := s + SysUtils.Format('%.2X', [b[j]]);
memo1.Lines.Add(s);
Memo1.SelStart := 0; // код чтоб прокрутка мемо вверх возвращалась, минус большой файл в двое больше грузится с этим кодом
Memo1.SelLength := 0
end;
f.Free;
end;
end;
Далее загружаем второй файл, во второе окно Memo2
а вот как сверку произвести и вывести количество несовпадений, пока не получается.
Пришли к выводу, что Мемо, всё же не очень подходит под эту задачу.
Все выходные изучали новый компонент StringGrid, очень долго мучились с настройкой строк и вывод данных .
Удалось разобраться с компонентом, сделать нужное количество строк, даже попробовали код, данные Char и первая строка и адреса выводятся быстро, как и большие файлы. Этот компонент, то , что надо.
Решили работать с StringGrid, форму разработали, а вот с кодом что то не то получилось...
Файл загружается, если в три строки делать, а в редакторе, будет 16 клеточек , каждая это строка, всё как в настоящем редакторе.

Но в коде ни как не получается сделать так, чтоб загружался файл не в одну строку, а в 16... символы ANSI которые идут в бинарном файле, выводятся в 17 строку, всё отлично, а вот сами байты файла, только в первый ряд, первой строки.

Где то явно что то неправильно в коде, пока не получается изменить.
Вот новый код под StringGrid :

Код:
var
buf: array[0..15] of Byte;
f: TFileStream;
b: array[0..15] of Byte;
i, j,count: Integer;
s:string;
begin

with OpenDialog1 do
if Execute then
begin
f:=tfilestream.Create(opendialog1.FileName,fmopenRead);
count:= 1 + (f.Size + 15) div 16;
f.Position := 0;
for i := 1 to f.Size div 16 do
begin
StringGrid1.Cells [0, i] := IntToHex(16 * (i - 1), 8);
//f.Position :=0;
count := f.Read(buf, 16);
s := '';
for j := 0 to count  -1 do
s := s + ' ' + IntToHex(buf[j], 2);
StringGrid1.Cells [1,i ] := s; // заполняет только первый столбец

s := '';
for j := 0 to count - 1 do
if buf[j] >= 32 then
s := s + chr(buf[j])
else
s := s + '.';
StringGrid1.Cells  [17, i] := s;  //символы ANSI заполняются отлично и в свою строку
end;
f.Free;
end;

end;
Вот нужна помощь зала, где ошибка в коде и как её исправить.
Как вообще в этом компоненте выводить данные по строкам, если больше трёх строк ?

Последний раз редактировалось nikitin.leha-201; 28.11.2016 в 21:25.
nikitin.leha-201 вне форума Ответить с цитированием
Старый 29.11.2016, 09:58   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

StringGrid1.RowCount:=N;// будет выведено N строк
аналогично для столбцов(колонок) columnCount:=

Цитата:
StringGrid1.Cells [1,i ] := s; // заполняет только первый столбец
правильно какой попросили ([1,..]) такой и заполнили

Код:
for i := 1 to f.Size div 16 do
begin
  StringGrid1.Cells [0, i] := IntToHex(16 * (i - 1), 8);
  //f.Position :=0;
  count := f.Read(buf, 16);
  s := '';
  for j := 0 to count  -1 do
    s := s + ' ' + IntToHex(buf[j], 2);
  StringGrid1.Cells [1,i ] := s; // заполняет только первый столбец 

  s:='';
  for j:=0 to 16 do 
  begin
    if (j>=count) then
    begin
      StringGrid1.Cells[j,i]:='--';
//      s:=s +'';  
    end
    else if {j<count and} buf[j] in ASCII then begin  { const ASCII =['0'..'9','A'..'Z','a'..'z','А'..'Я','а'..'я']; }
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +buf[i];
    end
    else {j<count and not buf in ASCII}
    begin
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +'?';
    end;
  end;
P.S. Правильно форматируйте код, делайте отступы на вложенных блоках, читать и искать ошибки алгоритма будет легче.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.11.2016 в 10:07.
evg_m вне форума Ответить с цитированием
Старый 29.11.2016, 13:51   #6
nikitin.leha-201
Пользователь
 
Регистрация: 19.11.2016
Сообщений: 24
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
StringGrid1.RowCount:=N;// будет выведено N строк
аналогично для столбцов(колонок) columnCount:=


правильно какой попросили ([1,..]) такой и заполнили

Код:
for i := 1 to f.Size div 16 do
begin
  StringGrid1.Cells [0, i] := IntToHex(16 * (i - 1), 8);
  //f.Position :=0;
  count := f.Read(buf, 16);
  s := '';
  for j := 0 to count  -1 do
    s := s + ' ' + IntToHex(buf[j], 2);

  StringGrid1.Cells [1,i ] := s; // заполняет только первый столбец 

  s:='';
  for j:=0 to 16 do 
  begin
    if (j>=count) then
    begin
      StringGrid1.Cells[j,i]:='--';
//      s:=s +'';  
    end
    else if {j<count and} buf[j] in ASCII then begin  { const ASCII =['0'..'9','A'..'Z','a'..'z','А'..'Я','а'..'я']; }
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +buf[i];
    end
    else {j<count and not buf in ASCII}
    begin
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +'?';
    end;
  end;
P.S. Правильно форматируйте код, делайте отступы на вложенных блоках, читать и искать ошибки алгоритма будет легче.


Этот код не работает, при компиляции ошибка выскакивает (не компилируется)....

Код:
 s:='';
  for j:=0 to 16 do 
  begin
    if (j>=count) then
    begin
      StringGrid1.Cells[j,i]:='--';
//      s:=s +'';  
    end
    else if {j<count and} buf[j] in ASCII then begin  { const ASCII =['0'..'9','A'..'Z','a'..'z','А'..'Я','а'..'я']; }
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +buf[i];
    end
    else {j<count and not buf in ASCII}
    begin
      StringGrid1.Cells[j,i]:=format('%.2x', buf[j]);
      s:=s +'?';
    end;
  end;

А потом с выводом ASCII проблем нет, всё выводится как надо в 17 колонку.

А делалось всё в Form Creat

Код:
StringGrid2.Cells [0, 0] := 'ADR :';
StringGrid2.Cells[1, 0] := '00  ';
StringGrid2.Cells[2, 0] := '01  ';
StringGrid2.Cells[12, 0]:= '0B  ';
StringGrid2.Cells[13, 0]:= '0C  ';

А вот с этим не понятно всё же :
StringGrid1.RowCount:=N;// будет выведено N строк
аналогично для столбцов(колонок) columnCount:=

Если это ещё StringGrid1.RowCount:=N; компилируется, то columnCount:=
не в какую.

Не поняли всё же, как выводить для столбцов(колонок)?
Не получается, как распределять и в какой части кода?

Последний раз редактировалось nikitin.leha-201; 29.11.2016 в 13:53.
nikitin.leha-201 вне форума Ответить с цитированием
Старый 29.11.2016, 13:57   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
аналогично
значит что это надо писать так же
StringGrid1.columnCount
написал, заметил надо colCount.

Найдите книжку Aрхангельский 100 компонент Delphi. Русский "почти перевод" справки.
http://programmersforum.ru/showpost....6&postcount=12
http://www.programmersclub.ru/book/
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.11.2016 в 14:02.
evg_m вне форума Ответить с цитированием
Старый 29.11.2016, 14:05   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
Этот код не работает, при компиляции ошибка выскакивает (не компилируется)....
я же писал не программу, а примерный набросок АЛГОРТИМА.
Цитата:
А потом с выводом ASCII проблем нет, всё выводится как надо в 17 колонку.
ну так выкиньте все ненужно вам и оставьте только то что считаете нужным.
ровно до тех пор пока не начнутся "фокусы" со специальными кодами (#00..#031)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.11.2016 в 14:14.
evg_m вне форума Ответить с цитированием
Старый 30.11.2016, 22:51   #9
nikitin.leha-201
Пользователь
 
Регистрация: 19.11.2016
Сообщений: 24
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
я же писал не программу, а примерный набросок АЛГОРТИМА.

ну так выкиньте все ненужно вам и оставьте только то что считаете нужным.
ровно до тех пор пока не начнутся "фокусы" со специальными кодами (#00..#031)
Да, с этим разобрались спасибо !

Теперь проблема другая, при загрузке файла в редактор, должна подсчитываться
crc файла и выводится, так во всех редакторах.

Получается правильно подсчитать, если изначально указать адрес начала файла и конец . Скажем файл имеет определённый размер в 256 байт, тогда создаём константу и в ней прописываем ,адрес, начало файла и конец :$0100 -$0, потом константу вставляем в цикл и тогда всё корректно подсчитывается и выводится.
Но вся проблема в том, что файлы имеют разные размер, от 170 байт, до 98765... скажем и менять в константе адрес на каждый не серьёзно.

Проблема состоит в том, как либо в константе, либо в цикле указать конец файла, чтоб подсчёт вёлся до конца файла, от $0до $.... В общем чтоб код понимал разные
размеры файла и считал от 0, до конца файла.
В инете, ни чего не нашли по данной проблеме, как и по материалам по Дельфи и Вашим ссылкам. Всё не то.

Данный код подсчитывает, но неправильно...

Код:
var
FStream:TFileStream;
A: array [1..1023] of Byte;
D1,D2: Word;
U,size: integer;

begin

FStream .Position:=$0;
FStream.Read(A,1023);
D1:=$0;
for U:=1 to FStream.Size// либо значение константы подставляем с точными адресами do  D1:=D1+A[U];
Label1.Caption:=IntToHex(D1,A[U]);
end;
end;
FStream.Free;
end;
end.
nikitin.leha-201 вне форума Ответить с цитированием
Старый 01.12.2016, 09:26   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

если я правильно понял вашу проблему вы не можете понять а какую же часть буфера вам надо обработать (или константа или ... )
TStream.Read это функция и она возвращает какой-то результат. А значение оного описано в справочной литературе. (в т.ч. и в рекомендованной мною ранее).
Код:
fstream.Position:=0;
CRC:=0;
r:=Fstream.Read(A, length(A));
while r>0 do begin // у нас есть необработанные данные
  for j:=0 to r-1 do begin //именно столько нам "удалось" прочитать в последний раз
     CRC:=CRC + .... ; 
  end;
  r:=Fstream.Read(A, length(A); 
end;
и тоже самое но с одним единственным оператором Read
Код:
r:=-1;  r:=Fstream.Read(); 
CRC:=0;
while r<>0 do begin
  r:=Fstream.Read(A, length(A));
  for j:=0 to r-1 do begin
    CRC:=... ;
  end;
end;
P.S. а что вы будете теперь делать если CRC, как обычно и делается, записано в конце этого же файла и вам надо сравнить
1. рассчитанную вами (вы ведь учли(посчитали) и эти байты), это же "точно такие же" байты
2. записанную ранее (а они при расчетах их не учитывали), их ведь еще не было когда считали и потом записывали

Код:
Delta:=0; Fstream.Position:=0; r:=0;
CRC:=0;
for j:=0 to Fstream.Size -1 do begin
  if j-Delta >=r then begin
     Delta:=Fstream.Position; //Delta:=Delta +r;
     r:=Fstream.Read(A, length(A)); 
  end;
  CRC:=AddCRC(CRC, A[j-Delta] );
end;

function AddCRC(oldcrc: xxx; addval: zzz): xxx;
begin
  result:=oldcrc + ... ;
end;
P.P.S. при современных характеристиках железа, допустимые размеры буфера как правило превышают размеры редактируемых вручную файлов
и имеет смысл динамическая "подстройка" размера буфера под размер файла с целью снижения "сложности" программы путем избавления от "переключения буфера" на другой блок файла.
Код:
var 
  A: array of byte; //динамический массив с неизвестным заранее числом элементов

SetLength(A, Fstream.Size); //задаем размер буфера(число элементов массива) по размеру файла
f:=Fstream(A, length(A));  //к сожалению теперь нельзя будет так просто прочитать данные из потока
r:=Fstream(@A[0], length(A)); // а надо будет сделать как-то вот так
if r<Fstream.Size then ; //черт знает что, я не сумел прочитать все

for j:=low(A) to high(A) do  //обрабатываем буфер(массив) от корки(low -наименьший индекс) до корки(high -наибольший индекс)
....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.12.2016 в 13:31.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. создать проект, содержащий форму для ввода данных о поездке, вычисление стоимости, файл с записями, редактор egor55555 Фриланс 9 05.09.2016 17:28
Редактор XML файлов в Delphi MagGarbut Помощь студентам 1 15.03.2011 16:26
Программа для сравнения содержимого файлов Alter Свободное общение 7 25.11.2009 23:38