суббота, 14 ноября 2009 г.

Пишем простой органайзер на Delphi

Привет всем.
Сегодняшний мой рассказ я хочу посвятить проблемам расписания и организации рабочего времени. Я знаю, что статей на эту тему уже довольно много, но здесь я хочу рассказать вам, как не забыть всего самого важного, при работе за компьютером, так как, как известно, сядешь ты на 5 минут проверить почту, а посмотришь на время – уже час прошел. Так вот, сегодня мы напишем свой собственный органайзер на Delphi.

Начало

Сначала нужно определится – что именно мы хотим увидеть в нашем будущем «изделии». Проще говоря, составить ТЗ. (Техническое задание). Для своего органайзера я поставил следующие цели:

1. Он должен уметь показывать время. Какой же это будет органайзер, если нет времени?

2. Дата и календарь.

3. Заметки на каждый день.

4. Дни рождения, чтобы не забывать.

5. Телефонная книга.

6. Расписание (уроков, занятий).

Вот такой вот классический вариант органайзера.

Дизайн

Вторым важным этапом является дизайн программы – размещение всех компонентов по своим местам. Я выбрал много-вкладочный интерфейс, если вам не нравится – сделайте свой. На главной странице (первая вкладка) у меня будут располагаться дата, время, заметки и календарь. А также несколько кнопок для управления заметками: вперед, назад, добавить, очистить.

На второй вкладке – дни рождения. Для отображения я использовал ListView – на мой взгляд, это самое оптимальное решение. Третья вкладка также содержит ListView для отображения телефонной книги. На четвертой вкладке я разместил расписание.

Кодинг

А вот и основная часть – самая важная. Итак, архив с кодом программы вы сможете скачать ниже, а тут я лишь поясню некоторые функции. Основной проблемой с которой я столкнулся – не умение и не желание ListView сохранять всю информацию в файл, а также загружать. Поэтому, тут я приведу обе функции, с пояснениями.

Сохраняем в файл

procedure TForm1.SaveListView(AListView: TListView; aFileName: string);
// AListView –
содержит экземпляр TListView
// aFileName
– имя файла для сохраненися инфы
var F: TIniFile; // сохранять будем в Ini файл
p: string; // путь к Ini файлу
I: integer; // параметр цикла
begin
p:=ExtractFileDir(Application.ExeName)+'\'+aFileName; // извелчем-ка мы путь к проге
F:=TIniFile.Create(p); // а заодним создадим Ini - file
try // «как бы чего не вышло», сказал Акакаий Акакиевич…
for I := 0 to AListView.Items.Count - 1 do // пробежимся по элементам AListView’а
begin
f.WriteString('Items', IntToStr(i), AListView.Items[i].Caption); // сохраним строку 1 столбика
f.WriteString('SubItems', IntToStr(i), AListView.Items[i].SubItems.GetText); // … 2 столбика
end;
f.WriteInteger('AllCounts', 'K', AListView.Items.Count); // запишем суммарное кол-во элементов
finally
F.Free; // все, теперь нам ini ненужен, а вот память нужна…
end;
end;

Загрузка из файла

Попробуйте сами понять смысл написанного ниже – уверяю вас, это несложно.

procedure TForm1.LoadListView(AListView: TListView; aFileName: string; aImageIndex: byte);
var F: TIniFile;
p: string;
I: integer;
aCounts: integer;
begin
if FileExists(aFileName) then
begin
p:=ExtractFileDir(Application.ExeName)+'\'+aFileName;
F:=TIniFile.Create(p);
try
aCounts:= f.ReadInteger('AllCounts','K',0);
for I := 0 to aCounts - 1 do
begin
with aListView.Items.Add do
begin
Caption:=f.ReadString('Items', IntToStr(i), '');
ImageIndex:=aImageIndex;
SubItems.Add(f.ReadString('SubItems', IntToStr(i), ''));
end;
end;
finally
F.Free;
end;
end;
end;

Некоторые пояснения

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

procedure TForm1.LoadZametki;
var F: TIniFile;
p: string;
I: Integer;
begin
p:=ExtractFileDir(Application.ExeName)+'\data.dat'; // путь к файлу
F := TIniFile.Create(p); // создаем экземпляр
try // «мало ли чего…»
if FileExists(p) then // проверим, есть ли наш файл
begin
// есть, значит загрузим заметки
k:=F.ReadInteger('AllCounts','Counts',1); // всего заметок
SetLength(strmas, k+1); // установим длину массива
for I := 1 to k do // будем заполнять массив
strmas[i]:=F.ReadString('Zametki', IntToStr(i), '');
nowSelect:=1; // выбранная заметка - 1
Label9.Caption:=IntToStr(nowSelect); // выведем номер выбранной заметки
Button2.Enabled:=true; // активируем управляющие кнопки
Button3.Enabled:=true;
RichEdit1.Text:=strmas[nowSelect]; // ну и, собственно, покажем саму заметку
end;
finally
F.Free; // очистим память
end;
end;

Заключение

Мы рассмотрели, как создать самый простой органайзер. Конечно, в него можно напихать еще кучу всего интересного и полезного – но это уже ваша задача, вы должны сами решить, что в нем будет. Вкладку расписание я оставляю вам на «д/з» - надо же как-то совершенствоваться? J Ну и напоследок – есть такие люди, которые берегут каждый бит памяти, я таким не являюсь, поэтому мой код может быть не оптимальным – усовершенствуйте его J. На этом все, удачи вас в таком не легком деле.


 на upload.com.ua

1 комментарий: