Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2256
∙ повысить рейтинг »
star9491
Статус: Практикант
Рейтинг: 1804
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Бакалавр
Рейтинг: 927
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1528
Дата выхода:09.05.2010, 21:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:388 / 195
Вопросов / ответов:1 / 1

Вопрос № 178204: огромная просьба! помогите с решением задач из лабораторной, в делфи я полный ноль! Текст лабораторной в приложении, а задания вот: 1. Сохранение данных блокнота. a) Модифицируйте код приложения так, чтобы вопрос «Сохранить изменения?» появлял...



Вопрос № 178204:

огромная просьба! помогите с решением задач из лабораторной, в делфи я полный ноль! Текст лабораторной в приложении, а задания вот:
1. Сохранение данных блокнота.
a) Модифицируйте код приложения так, чтобы вопрос «Сохранить изменения?» появлялся только, если данные блокнота были изменены.
b) После щелчка по системной кнопке закрытия формы (крестик в правом верхнем углу формы), форма закрывается без предупреждения о необходимости сохранить данные блокнота. Исправьте этот недостаток.
2. Считывание данных в блокнот.
a) При запуске приложения страницы заполняются данными из файлов.
b) Создайте модальное окно выбора папки для сохранения (и считывания) данных блокнота. Модифицируйте код приложения так, чтобы при запуске появлялось модальное окно для выбора папки, в которой хранятся данные.
Примечание. Используйте компоненты DriveComboBox, DirectoryListBox, FileListBox, FilterComboBox со страницы Win 3.1 палитры компонентов.
3. Данные блокнота хранятся в восьми файлах – это не является рациональным с точки зрения компактности данных. Продумайте структуру файла для хранения записей блокнота и внесите необходимые изменения в программный код.

Отправлен: 04.05.2010, 20:46
Вопрос задал: mihail77, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, mihail77.
Могу предложить такой вариант решения данной задачи:
Форма выбора папки
Код:
unit vubor;

interface

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

type
TFormvubor = class(TForm)
DriveComboBox1: TDriveComboBox;
DirectoryListBox1: TDirectoryListBox;
FileListBox1: TFileListBox;
FilterComboBox1: TFilterComboBox;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Formvubor: TFormvubor;

implementa tion

uses Main;

{$R *.dfm}

procedure TFormvubor.Button1Click(Sender: TObject);
var
i: integer;
TempComponent: TListBox;
f: TextFile;
dir, s, s1: string;
begin
dir:= FileListBox1.Directory + '\NoteBook.ttxt'; // Получаем полный путь к файлу
if not FileExists(dir) then // Проверяем существование файла
begin
ShowMessage('Файл блокнота не найден!'); // Показ окна с сообщением
exit; // Выход из процедуры
end;
AssignFile(f, dir); // Связали файловую переменную с файлом
Reset(f); // Встали на начало файла
while not eof(f) do // Делаем пока не дойдём до конца файла
begin
Readln(f, s); // Считали строку из файла
s1:= copy(s, 1, 5); // Скопировали первые 5 символов из строки
if s1 = '[Page' then // Если это метка номера страницы делаем
begin
i:= StrToInt(copy(s, 6, 1)); // Получил и номер страницы
With NoteBookF do // Делаем для основной формы
begin
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(i))); // Нашли нужный listbox
Readln(f, s); // Считали строку из файла
s1:= copy(s, 1, 5); // Скопировали первые 5 символов из строки
while s1 <> '[Page' do // Пока недойдём до следущей метки страницы делаем
begin
TempComponent.Items.Add(s); // Добавляем строку в listbox
Readln(f, s); // Считали строку из файла
s1:= copy(s, 1, 5); // Скопировали первые 5 символов из строки
end;
end;
end;
end;
CloseFile(f); // Закрыли файл
Close; // Закрыли форму
end;

procedure TFormvubor.Button2Click(Sender: TObject);
begin
NoteBookF.SaveAll; // Вызов процедуры сохран ения в файл
Close; // Закрыли форму
Button2.Visible:= false; // Спрятали кнопку
end;

end.

Главная форма
Код:
unit Main;

interface

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

type
TNoteBookF = class(TForm)
Notebook1: TNotebook;
TabSet1: TTabSet;
ListBox1: TListBox;
ListBox2: TListBox;
ListBox3: TListBox;
ListBox4: TListBox;
ListBox5: TListBox;
ListBox6: TListBox;
ListBox7: TListBox;
ListBox8: TListBox;
Panel1: TPanel;
Label1: TLabel;
RecordEdt: TEdit;
AddBtn: TButton;
ChangeBtn: TButton;
DeleteBtn: TButton ;
ClearBtn: TButton;
CloseBtn: TButton;
procedure FormCreate(Sender: TObject);
procedure AddBtnClick(Sender: T Object);
procedure TabSet1Click(Sender: TObject);
procedure CloseBtnClick(Sender: TObject);
procedure ChangeBtnClick(Sender: TObject);
procedure DeleteBtnClick(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure RecordEdtKeyPress(Sender: TObject; var Key: Char);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
dir: string;
procedure SaveAll;
end;

var
NoteBookF: TNoteBookF;
modif: Boolean; {переменная хранящая изменение блокнота}

implementation

uses vubor;

{$R *.dfm}

procedure TNoteBookF.SaveAll;
var i, j: integer;
TempComponent: TListBox;
f: TextFile; // переменная для работы с текстовым файлом
begin
dir:= Formvubor.FileListB ox1.Directory + '\NoteBook.ttxt'; // Получаем полный путь к файлу
AssignFile(f, dir); // Связали файловую переменную с файлом
Rewrite(f); // Открыли файл для перезаписи
for i:= 0 to 7 do // проходим все страницы блокнота
begin
NoteBook1.PageIndex:= i; // Активная страница блокнота
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(i + 1))); // Нашли компонент listbox
Writeln(f, '[Page' + IntToStr(i + 1) + ']'); // Записали метку номера страницы
for j:= 0 to TempComponent.Items.Count - 1 do
Writeln(f, TempComponent.Items.Strings[j]); // записали содержтмое listbox в файл
end;
CloseFile(f); // Закрыли файл
end;


procedure TNoteBookF.FormCreate(Sender: TObject);
begin
TabSet1.Tabs:= NoteBook1.Pages; {копируем содержимое свойства Pages
компонента NoteBook в свойство Tabs компонента TabSet}
TabSet1.TabIndex:= No teBook1.PageIndex; {Независимо от того, какая
страница блокнота активна во время проектирования (свойство ActivePage) будет выбрана соответствующая этой странице закладка}
end;

procedure TNoteBookF.AddBtnClick(Sender: TObject);
var
TempComponent: TListBox; {введем вспомогательную переменную}
begin
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(Notebook1.PageIndex + 1)));
{TListBox(<компонент>) используется для преобразования к типу TListBox}
if RecordEdt.Text <> '' then
TempComponent.Items.Add(RecordEdt.Text);
RecordEdt.Text:= '';
modif:= true;
end;

procedure TNoteBookF.TabSet1Click(Sender: TObject);
begin
NoteBook1.PageIndex:= TabSet1.TabIndex;
{страница блокнота и страница набора закладок должны совпадать}
end;

procedure TNoteBookF.CloseBtnClick(Sender: TObject);
begin
Close; {Закрыли приложение}
end;

procedure TNoteBookF.Cha ngeBtnClick(Sender: TObject);
var
TempComponent: TListBox; {введем вспомогательную переменную}
begin
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(Notebook1.PageIndex + 1)));
{TListBox(<компонент>) используется для преобразования к типу TListBox}
if RecordEdt.Text <> '' then
TempComponent.Items.Strings[TempComponent.ItemIndex]:= RecordEdt.Text; // Записали данные в listbox
modif:= true; // идентифокатор модификации блокнота
end;

procedure TNoteBookF.DeleteBtnClick(Sender: TObject);
var
TempComponent: TListBox; {введем вспомогательную переменную}
i: integer;
begin
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(Notebook1.PageIndex + 1)));
{TListBox(<компонент>) используется для преобразования к типу TListBox}
i:= TempComponent.ItemIndex; // Сохранили номер выделнной строки
TempComponent.Items.Delete(i); // Удалили выде ленную строку
TempComponent.ItemIndex:= i; // Выделили следующую запись
RecordEdt.Text:= TempComponent.Items.Strings[i]; // Записали выделенную запись в поле редактирования
modif:= true;
end;

procedure TNoteBookF.ClearBtnClick(Sender: TObject);
var
i: integer;
TempComponent: TListBox; {введем вспомогательную переменную}
begin
for i:= 1 to 8 do
begin {Очищаем все listbox}
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(i))); // Нашли активный listbox
TempComponent.Clear; // Очищаем весь listbox
end;
modif:= true;
end;

procedure TNoteBookF.ListBox1Click(Sender: TObject);
var
TempComponent: TListBox; {введем вспомогательную переменную}
begin
TempComponent:= TListBox(FindComponent('ListBox' + IntToStr(Notebook1.PageIndex + 1)));
{TListBox(<компонент>) используется для преобразования к типу TListBox}
RecordEdt.Text:= TempComponent.Items.Strings[TempComponent.ItemIndex]; // Записали выделенную запись в поле редактирования
end;

procedure TNoteBook F.RecordEdtKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
AddBtn.Click; // Если нажата клавиша ввод, добавляем запись в блокнот
end;

procedure TNoteBookF.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if modif then // Если делались изменения в блокноте выдаём диалог с вопросом о сохранениии
if MessageDlg('Сохранить изменения?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin // Ответили да
Formvubor.Button2.Visible:= true; // Сделали видемую кнопку "Сохранить"
Formvubor.ShowModal; // Показать форму выбора папки
end;
end;

procedure TNoteBookF.FormShow(Sender: TObject);
begin
Formvubor.ShowModal; // Перед показом основной форму, показываем форму выбора папки
end;

end.

Прикрепленный файл: загрузить »

-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 08.05.2010, 14:45
Номер ответа: 261283

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261283 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.03.2010

    В избранное