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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2013, 18:07   #1
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию Не корректно выводит данные в StringGird (Lazarus).

Здравствуйте.
Первая программа редактирует типизированный файл (*.dat).
Вторая выводит отредактированный файл в таблицу, но название фильмов частично переносит в поле с жанром не которые буквы меняются на квадраты, вопросы, года вместо 4-ёх значных чисел меняются на произвольные (см. скриншот), хотя при редактирование всё отлично.
Заранее спасибо!

Первая программа
Код:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons, lconvencoding;

type
   profilm=record
    nazv:string[75];
    ganr:string[75];
    god:word end;
    film1=string[75];

  { TForm2 }

  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button5: TButton;
    Button6: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    OpenDialog1: TOpenDialog;
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;
  f2:file of profilm;
  s2:profilm;
  nz:word;

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.Button1Click(Sender: TObject);
begin             //начать
  assignfile(f2,'C:\Users\Akin0t\Desktop\432.dat');
  reset(f2);
  read(f2,s2);
  nz:=0;
  Edit1.Text:=s2.nazv;
  Edit2.Text:=s2.ganr;
  Edit3.Text:=inttostr(s2.god);
  CloseFile(f2);
end;

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
    CloseFile(f2);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin           //предыдущий
  Button6Click(Sender);
  if nz<=0 then nz:=0 else
begin dec(nz);
      seek(f2,nz);
      read(f2,s2);
      Edit1.Text:=s2.nazv;
      Edit2.Text:=s2.ganr;
      Edit3.Text:=inttostr(s2.god);
end;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin            //Следующий
  Button6Click(Sender);
  if nz>=24 then nz:=24 else
begin inc(nz);
      seek(f2,nz);
      read(f2,s2);
      Edit1.Text:=s2.nazv;
      Edit2.Text:=s2.ganr;
      Edit3.Text:=inttostr(s2.god);
end;
end;


procedure TForm2.Button5Click(Sender: TObject);
begin             // Добавить
    reset(f2);
    read(f2,s2);
    nz:=nz+1;
    s2.nazv:=Edit1.Text;
    s2.ganr:=Edit2.Text;
    s2.god:=strtoint(Edit3.Text);
    seek(f2,nz+1);
    write(f2,s2);

end;

procedure TForm2.Button6Click(Sender: TObject);
begin                 //Сохранить
   reset(f2);
    read(f2,s2);
    s2.nazv:=Edit1.Text;
    s2.ganr:=Edit2.Text;
    s2.god:=strtoint(Edit3.Text);
    seek(f2,nz);
    write(f2,s2);
end;

end.
Вторая программа
Код:
unit Unit4;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  lclproc, StdCtrls, lconvencoding;

type
  profilm=record
  nazv:string[75];
  ganr:string[12];
  god:word end;
  film1=string[75];

  { TForm4 }

  TForm4 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    SG: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form4: TForm4;
  z:word;
  f:file of film1;
  f2:file of profilm;
  s:film1;
  s2:profilm;
  k:word;


implementation

{$R *.lfm}

{ TForm4 }

procedure TForm4.Button1Click(Sender: TObject);
var i:integer;
begin

  SG.Cells[0,0]:='Название фильма';
  SG.Cells[1,0]:='Жанр';
  SG.Cells[2,0]:='год';
  if opendialog1.execute then
  assignfile(f2,OpenDialog1.FileName);
  reset(f2);
  k:=0 ;
  while not eof(f2) do begin
    read(f2,s2);
    inc(k);
    sg.cells[0,k]:=s2.nazv;
    sg.cells[1,k]:=s2.ganr;
    sg.cells[2,k]:=inttostr(s2.god);
  end;
  sg.rowcount:=k;
  closefile(f2);
end;
end.
Изображения
Тип файла: jpg 1.jpg (83.2 Кб, 128 просмотров)

Последний раз редактировалось Akin0t; 27.06.2013 в 18:13.
Akin0t вне форума Ответить с цитированием
Старый 27.06.2013, 18:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Юникод...
Попробуй выставь в настройках галочку на использовать AsniString
Ну и
Код:
sg.cells[0,k]:=AnsiToUTF8(s2.nazv);
...
Должно помочь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2013, 18:54   #3
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию

Stilet, не подскажите где подключить AsniString, я что-то не могу найти.
Попробовал без подключения, проект запустился, но отображаться стало ещё хуже.

Последний раз редактировалось Akin0t; 27.06.2013 в 18:56.
Akin0t вне форума Ответить с цитированием
Старый 27.06.2013, 21:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В параметрах проекта - параметры компилятора - обработка. Там галочку на Использовать строки Анси поставь.
Цитата:
проект запустился, но отображаться стало ещё хуже.
Заархивируй и приаттач сюда, я могу посмотреть если хочешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2013, 21:36   #5
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию

Хм, галочка стояла...
Архив весит больше допустимого залью на файлообменик.
http://rghost.ru/47060837
В Юните1 Там конечно не всё идеально, зато работает.
Юнит2 редактирует файл 432.dat.
Юнит4 Открывает файл 432.dat.
Akin0t вне форума Ответить с цитированием
Старый 27.06.2013, 22:11   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так.
Во-первых. Сразу вопрос в лоб: profilm=record у тебя описано в разных модулях.
Почему? Почему не выделить еще один модуль для описания функций считывания этого файла?.

Во-вторых:Unit3 я там не нашел, восстанавливал из бэкапов.

В третьих:
Цитата:
procedure TForm2.Button5Click(Sender: TObject);
begin // Добавить
reset(f2);
read(f2,s2);
nz:=nz+1;
s2.nazv:=Edit1.Text;
s2.ganr:=Edit2.Text;
s2.god:=strtoint(Edit3.Text);
seek(f2,nz+1);
write(f2,s2);

end;
Зачем тут считывание элемента, если нужно добавление в конец?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2013, 22:24   #7
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию

Я пока плохо разбираюсь, что-то делал по методичке, что-то сам, что находя в интернете... И ответ на первый вопрос, наверное что бы работало, хотя возможно где-то и лишнее описание.
Возможно стоит выделить отдельный модуль, но как писал выше пока плохо разбираюсь...
Юнит3 это была не удачная попытка, я его удалил, но потом понадобилась ещё одна форма, по этому появился Юнит4.
В принципе по методичке это была кнопка сохранения, но она не пересохраняла, а дописывала, по этому я слегка изменил её код и сделал отдельно кнопку сохранить, а эту не трогая переименовал в "добавить".
Akin0t вне форума Ответить с цитированием
Старый 27.06.2013, 22:35   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ладно.
Код:
procedure TForm2.Button5Click(Sender: TObject);
var fs:Cardinal;
begin             // Добавить
    reset(f2);
    fs:=FileSize(f2);
    seek(f2,fs);
    nz:=nz+1;
    s2.nazv:=Utf8ToAnsi(Edit1.Text);
    s2.ganr:=Utf8ToAnsi(Edit2.Text);
    s2.god:=strtoint(Edit3.Text);
    write(f2,s2);
    closefile(f2);

end;
Т.е. стать в конец. Дописать.
Использовать ANSI вместо UTF8.
Попробуй так. А вообще я бы на твоем месте занялся изучением TFileStream
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2013, 22:39   #9
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию

Огромное спасибо за помощь!
Сейчас попробую.
Ну а изучать ни когда не поздно
Akin0t вне форума Ответить с цитированием
Старый 27.06.2013, 22:57   #10
Akin0t
Пользователь
 
Регистрация: 27.06.2013
Сообщений: 10
По умолчанию

Выдаёт ошибку на
Код:
fs:=FileSize(f2);
Говорит о не совместимости типов "file of profilm" ожидалось "AnsiString".
Попытался поменять на AnsiString, тогда выдаёт ошибку в этой строчке
Код:
assignfile(f2,'C:\Users\Akin0t\Desktop\432.dat');
Тоже о не совместимости типов.
Akin0t вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Суммирование столбцов StringGird Dikey804 Общие вопросы Delphi 11 04.03.2013 10:37
не корректно выводит min из массива [с++] Aliosha2 Общие вопросы C/C++ 11 27.12.2012 18:20
Сводная таблица с двух листов не выводит нужные данные kipish_lp Microsoft Office Excel 2 26.04.2010 12:46
Нужно корректно отобразить данные из таблиц на сервере mysql Amabilis Помощь студентам 0 01.03.2010 20:40