воскресенье, 22 ноября 2009 г.
Философия правды
1) Это высказывание ложно.
2) Я лжец.
3) Это утверждение невозможно доказать.
Смотрим: в 1 случае, если высказывание истино, значит оно ложно, а если ложно - то само утверждение истино. Точно также и со вторым случаем. Ну а в последнем случаи - если оно истино, то доказать это невозможно. Непонятно однако получается, что же такое правда. Так что поговорка "У каждого своя правда", пожалуй на самом права :) Это относительно понятие, который каждый воспринимает по своему...
суббота, 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. На этом все, удачи вас в таком не легком деле.

четверг, 12 ноября 2009 г.
Connect...
Правда, ничего интересного я вам сейчас не скажу - простая проверка блога. Появятся мысли, напишу