Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами 
:(
    Опции темы
Максим1989
Дата 21.3.2011, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

Репутация: нет
Всего: нет



Здравствуйте! Я являюсь новичком как в Delphi, так и на форуме. Нуждаюсь в помощи в выполнении лабораторной работы. Она практически сделана, но есть некоторые вопросы.
Есть задание и есть мое выполнение (прикрепляю).
Как правильно запрограммировать кнопку «Открыть файл», чтобы после ввода в Edit имени ранее созданного файла, при нажатии на кнопку таблица заполнялась автоматически?


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  _______________________________.rar 271,15 Kb
PM MAIL   Вверх
Keeper89
Дата 23.3.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



А там вроде есть код, он не работает как нужно?


--------------------
PM MAIL WWW   Вверх
Romkin
Дата 23.3.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Код можно было и сюда кинуть, с тегами. Форматирование ужасное.
Вот, взял на себя смелость отформатировать, плюс переименовал тип film в TFilm, чтобы не путаться:
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;

    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;

    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    ComboBox1: TComboBox;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure ComboBox1Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TFilm = record
    nazv: string[20];
    ghanr: string[20];
    strana: string[15];
    god_vyp: byte;
    time: integer;
  end;

var
  Form1: TForm1;
  FV: file of TFilm;
  RV: TFilm;
  i: integer;
  m: array [1 .. 4] of TFilm;
  f: textfile;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); // запись данных в файл
begin
  write(f, Edit1.text);
  closefile(f);
end;

procedure TForm1.Button2Click(Sender: TObject); // вывод значений в таблицу
begin
  with StringGrid1 do
  begin
    Cells[0, RowCount - FixedRows] := Edit1.text;
    Cells[1, RowCount - FixedRows] := Edit2.text;
    Cells[2, RowCount - FixedRows] := Edit3.text;
    Cells[3, RowCount - FixedRows] := Edit4.text;
    Cells[4, RowCount - FixedRows] := Edit5.text;
    RowCount := RowCount + 1;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject); // удалить строку с записью
var
  n: integer;
begin
  if StringGrid1.RowCount = 2 then
    exit; // если осталось две строки, не удалять
  for n := StringGrid1.Row to StringGrid1.RowCount - 2 do
    StringGrid1.Rows[n] := StringGrid1.Rows[n + 1];
  StringGrid1.RowCount := StringGrid1.RowCount - 1;
  // Удаление последней строки таблицы
end;

procedure TForm1.Button4Click(Sender: TObject); // создать файл
begin
  assignfile(f, 'exemple.text');
  rewrite(f);
end;

procedure TForm1.Button6Click(Sender: TObject); // закрыть программу
begin
  Form1.Close;
end;

procedure TForm1.Button7Click(Sender: TObject); // открыть файл
begin
  assignfile(FV, Edit1.text);
  reset(FV);
  StringGrid1.Cells[0, 0] := 'Название фильма';
  StringGrid1.Cells[1, 0] := 'жанр';
  StringGrid1.Cells[2, 0] := 'Страна';
  StringGrid1.Cells[3, 0] := 'Год выпуска';
  StringGrid1.Cells[4, 0] := 'Продолжительность(мин.)';
  StringGrid1.ColWidths[0] := 120;
  StringGrid1.ColWidths[1] := 80;
  StringGrid1.ColWidths[2] := 80;
  StringGrid1.ColWidths[3] := 100;
  StringGrid1.ColWidths[4] := 150;
  with RV do
  begin
    while not EOF(FV) do
    begin
      read(FV, RV);
      i := i + 1;
      StringGrid1.RowCount := i + 1;
      StringGrid1.Cells[0, 0] := nazv;
      StringGrid1.Cells[1, 0] := ghanr;
      StringGrid1.Cells[2, 0] := strana;
      StringGrid1.Cells[3, 0] := IntToStr(god_vyp);
      StringGrid1.Cells[4, 0] := IntToStr(time);
    end;
  end;
end;

procedure TForm1.Button8Click(Sender: TObject); // уничтожить файл
begin
  assignfile(f, 'exemple.text');
  erase(f);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
    StringGrid1.Cells[0, 1] := 'Время ведьм';
  if ComboBox1.ItemIndex = 1 then
    StringGrid1.Cells[0, 2] := 'Любовь-Морковь 3';
  if ComboBox1.ItemIndex = 2 then
    StringGrid1.Cells[0, 3] := 'Амэрикен бой';
  if ComboBox1.ItemIndex = 3 then
    StringGrid1.Cells[0, 4] := 'Греческая смоковница';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.ItemIndex := -1;
  StringGrid1.ColCount := 5;
  StringGrid1.RowCount := 2;
  StringGrid1.Cells[0, 0] := 'Название фильма';
  StringGrid1.Cells[1, 0] := 'Жанр';
  StringGrid1.Cells[2, 0] := 'Страна';
  StringGrid1.Cells[3, 0] := 'Год выпуска';
  StringGrid1.Cells[4, 0] := 'Продолжительность(мин.)';
  StringGrid1.ColWidths[0] := 120;
  StringGrid1.ColWidths[1] := 80;
  StringGrid1.ColWidths[2] := 80;
  StringGrid1.ColWidths[3] := 100;
  StringGrid1.ColWidths[4] := 150;
  StringGrid1.RowCount := 2;
  StringGrid1.FixedRows := 1;

  // Для того, чтобы в таблице выделялась целая строка, а не одна ячейка:
  StringGrid1.Options := StringGrid1.Options + [goRowSelect];
end;

end.

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

Добавлено через 4 минуты и 36 секунд
Кстати, а какое задание-то? smile
PM ICQ   Вверх
Максим1989
  Дата 24.3.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

Репутация: нет
Всего: нет



Уважаемые господа!
Извиняюсь перед всеми за долгое молчание. Просто долго не было ответа и я подумал что не так и дождусь его.
Ну во-первых, я должен всё-таки показать своё задание. (Сразу два файла к моему сообщению почему-то не прикрепились)
Во-вторых, извините уж, но я не знаю как кидать код с тегами, поэтому решил так вот написать.
В-третьих, помимо той проблемы, которую я описал ранее, где-то есть ещё ошибка в моём коде, но я её не вижу, а именно.
После компиляции, после того как выбираю из списка Combobox1 какой-либо фильм, заполняю его поля, заношу их в таблицу кнопкой "Вывести в таблицу" происходит ужасное! Следующий выбранный фильм стирает название в предыдущей строке! Вообщем, программа как-то криво работает
Надеюсь на подсказку. 

Это сообщение отредактировал(а) Максим1989 - 24.3.2011, 21:28

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ____________________4__Delphi_.doc 37,50 Kb
PM MAIL   Вверх
Romkin
Дата 25.3.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Ну вот. Задание получше, чем ожидалось.
Цитата
«Работа с внешними файлами записи»
Постановка задачи. Создать приложение, обеспечивающее выполнение следующих задач:
создание файла записей;
просмотр файла записи;
редактирование файла записи (изменение, удаление, добавление)
Содержимое файла - любая предметная область, например, видеотека, отдел кадров, магазин. Среди полей должны присутствовать такие как строковое, числовое, дата (время), поле с маской в ввода.

Где поле дата/время? Подразумевается TDateTime, а не integer smile
Где поле с маской ввода?
Цитата
Переменная и файл записей – в разделе var:
<имя переменной>:<имя записи>;
<имя файловой переменной>:file of<имя записи>;
Просмотр файла необходимо осуществить с помощью таблицы StringGrid.Заголовок таблицы заполняется программным путём (присвоением ячейкам нулевой строки строковых констант, например StringGrid1.Cells:=’Название’).

Воообще, переменная в разделе var ограничивает. FV - как раз и есть файл записей. Но тогда зачем ты работаешь с f:textfile? Это не нужно, вся работа должна быть с FV.
Цитата
Для задания текстовых полей рекомендуется использовать компонент  ComboBox (страница Standart). С его помощью пользователь может либо ввести текст либо выбрать из списка (выпадающий список определяется устоновкой свойства Style этого компонента в значение csDropDown).

Собственно, это и все резюме задания. Как я понял, выбрана "Видеотека".

В общем, везде  где работа идет с f: textfile - код неверен.
PM ICQ   Вверх
Максим1989
Дата 25.3.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

Репутация: нет
Всего: нет



1. А Edit-ы - разве не поле с маской ввода?
2. Под TDateTime подразумевается TDateTimePicker на вкладке Win32 ?
(У меня установлен Delphi2009)

PM MAIL   Вверх
Romkin
Дата 25.3.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Цитата(Максим1989 @  25.3.2011,  20:12 Найти цитируемый пост)
1. А Edit-ы - разве не поле с маской ввода?2. Под TDateTime подразумевается TDateTimePicker на вкладке Win32 ?(У меня установлен Delphi2009)

Нет, есть TMaskEdit, неплохо подходит для ввода времени. Впрочем, как и TDateTimePicker, у него кстати тонкость: если надо ввести только время то дату надо обнулить, и наоборот. Выдает он именно TDateTime.
TDateTime - такой же элементарный тип, как и integer. Хранит дату и время.
Год выпуска - как минимум word, сейчас 21 век, а не первый-второй smile
Поле time - это что, длительность? Так и назвать.
Дальше.
Задание прямо диктует действия, которые надо реализовать. Каждое действие надо оформить как минимум отдельной процедурой. То есть, должны быть методы:
1. Создание файла. Вход - имя файла.
2. Чтение файла (можно сразу в грид) Вход - имя файла, переменная-грид.
3. Модификация записи в файле. Вход - переменная файла (это FV), номер записи, сама запись.
4. Чтение отдельной записи из файла по ее порядковому номеру. Вход переменная файла, номер. Результат функции - запись. 
5. Закрытие файла. Вход - переменная файла.
6. Добавление записи (в конец, думаю достаточно). Вход - переменная файла, запись.
7. Удаление записи. На самом деле самый сложный. Вход - переменная файла, номер записи.
Все. Для лабораторной этого достаточно.
Добавил/удалил запись - тупо перечитай весь файл. Собственно, п.4 тоже необязателен.
А потом добавляешь кнопки, которые вызывают нужный метод с нужными параметрами.
PM ICQ   Вверх
Максим1989
Дата 25.3.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

Репутация: нет
Всего: нет



Спасибо за советы! В данный момент сижу и пытаюсь все их реализовать. Но, честно говоря, дело идет со страшным скрипом, т.к. я успел изучить в основном только компоненты со вкладки стандарт, и сейчас пытаюсь ускоренно понять свойства и назначение других компонентов.
PM MAIL   Вверх
Romkin
Дата 26.3.2011, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Компонентов достаточно уже. Цель лабораторной - работа с файлами, ее и надо изучать. Открытие файла, позиционирование в нем и т.д. Да, переменная файла должна передаваться в метод через var всегда, это давнее условие.
Перечень процедур для работы с файлами: Standard Routines and I/O
Если память не изменяет, Seek для типизованного файла перемещает именно на размер записи, т.е. Seek(0) - первая запись, Seek(9) - десятая.
И надо бы два метода, которые переводят позицию в гриде в номер записи и обратно. Это просто: номер записи = номер выбранной строки минус FixedRows. Простые методы, зато не запутаешься.

Добавлено через 12 минут и 52 секунды
Еще, если пишешь прямо в форме, как и выше, то метод обновления записи в файле должен выглядеть примерно так (псевдокод):

RecNo := GetRecNo(Grid) //Именно выделенная строка минус величина заголовка грида, получили порядковый номер
Rec := CollectRecord; //Сборка записи из всех эдитов в TFilm
//Есть номер и запись, записать:
WriteRecord(FV, Rec, RecNo);
//Теперь просто обновить запись в гриде, стоим на нужной строке
UpdateGrid(Grid, Rec); 

Соответственно, чтение всего файла примерно так:
в цикле
Rec := ReadRecord(FV);
Выделяем очередную строку в гриде
UpdateGrid(Grid, Rec);// пихаем значения из Rec в текущую строку в гриде

Все очень ориентировочно smile
PM ICQ   Вверх
Максим1989
Дата 26.3.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

Репутация: нет
Всего: нет



Спасибо! Как только все эти указания применю, я обязательно покажу свою отредактированную работу
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.