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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 71)


Программирование на DELPHI
Выпуск #71 (19 июня 2007 г.)

Разделы сайта:

Delphi.int.ru

Новости сайта
Регистрация »
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Рассылки сайта
Дружеств. сайты

IRC-канал сайта:

Сервер: irc.tic-tac.ru
Порт: 6667
Канал: #delphiintru

Ждём Вас на нашем канале!

Доброго времени суток, уважаемые читатели!

Со времени последнего выпуска прошло целых 3 недели. Но думаю, что причины понятны - лето, пора отпусков, а также экзамены, зачёты и пр. Из-за того, что времени действительно мало, выпуск получился немного сокращённый.

Если Вы ещё не являетесь зарегистрированным пользователем www.delphi.int.ru, зарегистрируйтесь прямо сейчас! Регистрация »

Приятного чтения и до скорой встречи!

Статистика системы Delphi.int.ru Expert на 19.06.2007, 17:00:

Зарегистрированных экспертов: 89 (+1), из них в активном режиме 58 (+1).
Участниками задано вопросов: 641 (+43).
Всего отправлено ответов: 1055 (+63).
Всего сообщений на форумах вопросов: 946 (+82).
Максимальное число разосланных в день писем: 608 (24.04.2007, +0).

Разделы рассылки:

» Авторское слово
» Обучение Delphi
» Delphi.int.ru Expert
» Статья по Delphi
» Файловый архив
» Юмор

Delphi.int.ru Expert - решите свою проблему, а также помогайте другим, став экспертом!

Количество читателей рассылки (19.06.2007, 17:00):
5473+1225+376= 7074 (+71)

Связь по e-mail:

admin@delphi.int.ru
expert@delphi.int.ru
info@delphi.int.ru

Если Вы хотите где-нибудь разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с автором или администратором.
Обучение Delphi

» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи".
Последние 3 урока:

7. Обзор палитры компонент: Standard, Additional
8. Pascal - первое знакомство
9. Pascal - базовые конструкции и переменные

Ответ на домашнее задание

Задание: Составить программу, которая вычисляет площадь круга заданного радиуса.

Отличие этого задания от того, что было рассмотрено в уроке #9 лишь в том, что нужно получить число "пи". А получать его никак и не нужно - оно уже определено как константа с именем PI (см. урок #8). А вот и сама программа:

procedure TForm1.Button1Click(Sender: TObject);
var R, S: Real;
begin
  R:=10;
  S:=PI * R * R;
  ShowMessage(FloatToStr(S));
end;

Логические выражения

Автор:
Ерёмин Андрей
Ошибаться человеку свойственно, но сваливать ошибки на других - еще типичнее.
Номер урока:
10
 

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

Логический тип данных

С логическим типом данных мы уже неоднократно встречались при изучении свойств объектов. Этот тип данных состоит всего из двух значений: истина и ложь. На языке Pascal (а также на многих других языках) это соответственно True и False. В некоторых языках допускается использование чисел вместо этих переменных: 1 - истина, 0 - соответственно ложь. Итак, логический тип данных указывает, есть ли что-то или его нет, верно ли что-то или неверно.

В Pascal логический тип данных носит название Boolean (англ. - логический). Значения, как уже было сказано - True и False. Простой пример объявления логической переменной и присвоения ей значения "ложь":

var X: Boolean;

X:=False;

Операции над логическими выражениями

А вот и самое интересное. Для логических выражений введены 4 операции. Работа с ними чем-то похожа на работу с числами. Рассмотрим подробно эти операции.

1. Отрицание: NOT ("не")

Как понятно из названия, данная операция меняет значение логического выражения на противоположное: если была истина, то станет ложь, а если была ложь, то станет истина. Выражение, над которым будет произведена операция, указывается либо после слова NOT через пробел, либо в скобках. Примеры:

k:=True;

m:=not(k);
n:=not m;
p:=not(not(m));

Подразумевается, что все переменные описаны типом данных Boolean. Итак, разберём, что здесь происходит:

  • Сначала мы присваиваем переменной k значение True;
  • Далее, выполняя NOT для k получаем False: m становится равным False;
  • n становится противоположным m, т.е. True;
  • Над m делается двойное отрицание, т.е. значение p станет также False.

2. Логическое умножение (конъюнкция) - AND ("и")

В отличие от рассмотренного выше NOT, оператор AND работает уже с двумя (и более) выражениями. Логическое умножение равно истине тогда и только тогда, когда все выражения, связанные этим оператором, истинны. Если хотя бы один является ложью, то весь результат будет также ложью. Поэтому, собственно, операция и называется умножением: если истину обозначить за 1, а ложь - за 0, а числа перемножить, то при наличии хотя бы одного нуля весь результат будет нулевым. Примеры:

a:=True;
b:=False;
c:=True;

d:=a and b;
e:=a and c;
f:=not(b) and c;

Значение d будет False, т.к. один из операндов (операнды - выражения, которыми управляют операторы) равен False (b). Переменная e примет значение True, ведь и a и c истинны. Наконец, f тоже станет True, ведь not(b) - это истина и c тоже истина.

3. Логическое сложение (дизъюнкция) - OR ("или")

Как и AND, OR работает с несколькими операндами. Название "или" уже отвечает на вопрос "что будет в итоге": если хотя бы один из операндов - истина, то всё выражение будет истиной. Результат False будет только в случае, если все операнды будут ложными.

a:=False;
b:=True;

c:=a or b;
d:=not(b) or a;

Значение переменной c станет True, а переменной d - False.

4. Исключающее "или" - XOR

Данная операция выдат результат True, если один из операндов является истиной, а другой - ложью, т.е. выражения не должны быть одинаковыми.

a:=True;
b:=False;

c:=a xor b;
d:=not(a) xor b;
e:=not(a) xor not(b);

Переменная c станет истиной, ведь a и b различны, а d - ложью, т.к. под сравнение попадут два значения False. Наконец, e станет истиной.

Итог

Этих четырёх операций - NOT, AND, OR, XOR достаточно для построения логического выражения любой сложности. Эти операторы могут как угодно комбинироваться и можно составлять большие выражения. Однако следует заботиться и о скорости работы. Если выражение вычисляется один раз - всё в норме, но если оно будет вычисляться несколько тысяч раз (например, обработка информации из большой базы данных), то грамотность составленного выражения будет отражаться на скорости выполнения операции. Если в программе появились грмоздкие логические выражения, следует задуматься об их упрощении: одно условие всегда будет проверяться быстрее, чем два.

Немного об оптимизации

В Delphi есть специальные методы оптимизации, в том числе и для логических выражений. Дело в том, что в некоторых случаях вычисление логического выражения полностью не требуется, чтобы получить результат. Простые примеры на AND и OR:

A:=False;
B:=True;
C:=True;
D:=True;

X:=A and B and C and D;

Поскольку используется оператор AND, результат всего выражения будет истинным только в том случае, если все выражения будут истинны. В данном же случае уже первое выражение (A) ложно. Дальнейшая проверка просто не имеет смысла - всё равно результат останется False.

Ещё пример:

A:=True;
B:=False;
C:=True;
D:=False;

X:=A or B or C or D;

Абсолютно неважно, какие значения имеют B, C и D, ведь A истинно, а значит OR в любом случае выдаст True.

Изначально такая оптимизация в Delphi включена, т.е. выражения не будут вычисляться полностью. Эту возможность можно отключить (правда, непонятно - зачем?) в свойствах проекта: Project » Options » Compiler » Complete boolean eval (если включить эту опцию, то выражения будут вычисляться полностью).

Функция оптимизации логических выражений (Complete boolean eval)

Практическое применение

Где применяются логические выражения? Практически повсюду. Они могут использовать лишь в программном коде для каких-либо проверок, а могут быть связаны и с интерфейсом программы. Как уже было сказано ранее, многие свойства компонент заданы логическим типом данных. Например, давайте сделаем две кнопки и запрограммируем их так, чтобы на экране всегда была только одна. Помещаем на форму 2 кнопки (TButton) и одну из них (Button2 например) делаем невидимой: в Инспекторе Объектов изменяем свойство Visible на False. Теперь дважды щёлкаем по Button1 и пишем (дописать следует только то, что находится между begin и end):

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Visible:=False;
  Button2.Visible:=not Button1.Visible;
end;

Разберёмся, что здесь происходит. Сначала мы изменяем видимость 1-ой кнопки - скрываем её. А затем меняем видимость 2-ой кнопки на противоложное первому. Аналогично пишем обработчик 2-ой кнопки:

procedure TForm1.Button2Click(Sender: TObject);
begin
  Button2.Visible:=False;
  Button1.Visible:=not Button2.Visible;
end;

Если теперь запустить программу и пощёлкать по кнопкам, то они будут по очереди появляться на экране. В принципе, вторые строки обоих обработчиков можно написать и немного иначе - просто присвоить другой кнопке Visible:=True - результат не изменится. Такой способ приведён лишь в качестве примера использования оператора NOT.

Небольшое замечание

Следует обратить внимание ещё вот на что. Если в выражении несколько операндов, то их следует брать в скобки, расставляя таким образом приоритеты выполнения. Если этого не сделать, результат может получиться иным. Примеры находятся в тесте, который расположен ниже.

Тест по теме
Для прохождения этого теста в Вашем браузере должен быть включен JavaScript. В почтовых программах тест работать не будет - нужно открыть его в браузере.
Определите значения приведённых логических выражений
True False

a:=True;
b:=False;

(a OR b) AND (a XOR b) = ?

True False

a:=False;
b:=True;
c:=False;

(NOT(b AND c) XOR (a OR c)) AND NOT(A) = ?

True False

a:=True;
b:=True;
c:=False;

NOT(NOT(a) OR NOT(b)) AND NOT(((A XOR B) OR (A OR B)) AND NOT(C)) = ?

Оцените данный урок по пятибалльной шкале:
1 2 3 4 5
Комментарии и замечания приветствуются.

 

Delphi.int.ru Expert
(текущая версия системы: 1.68
последнее обновление: 08.05.2007)

Если Вы не являетесь зарегистрированным пользователем сайта, зарегистрируйтесь прямо сейчас! Регистрация »

Delphi.int.ru Expert - это автоматизированная система экспертной помощи, призванная помочь в решении проблем, возникающих как у начинающих, так и опытных программистов, а также способствующая обмену информации между участниками лично и публикации этой информации в массовых рассылках в дальнейшем. Система полностью автоматизирована и постоянно развивается и обновляется. Если у Вас есть какие-то либо вопросы или Вы столкнулись с какой-либо проблемой при программировании на Delphi/WinAPI - задайте свой вопрос и эксперты Вам помогут. Кроме того, Вы сами можете войти в состав экспертов и помогать другим.

Задать вопрос экспертам » | Справочное руководство » | Перейти в состав экспертов » | Эксперты »

Здесь публикуются вопросы вместе с ответами, срок действия которых закончился (каждый вопрос действителен в течение одной недели).

* Администраторы сайта не корректируют сообщения и за наличие грамматических ошибок ответственности не несут.

Delphi.int.ru Expert  – вопросы и ответы (#246 - #265)
Вопрос № 246

Текст вопроса:

Компонент TTabControl...
Как на созданих рание вкладках изменить иконки в процесе выполнения програмы?
У меня есть 3 иконки...
Одна иконка используется при создании вкладки...
Вторая при изменении динамически созданых даных (которые связаны по индексу), когда вкладка не имеет фокуса...
Третья когда изменение динамических даних запрещено...
(Проблема в том что в этом компоненте иконки, я так понимаю, изменяются токо в процессе создания вкладки... Но может есть какието варианты, типа SendMessage(...) или что-то подобное чтобы заставить компонет сменить иконку созданой вкладки...)

Автор вопроса: Александр (статус: Посетитель)
Дата и время отправки вопроса: 08.01.2007, 01:01
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 12
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Новаковский Юрий Аврамович (статус: 4-ый класс), 09.01.2007, 12:43]:

Здравствуйте, Александр!

К TTabControl подключаете TImageList,наполняете его 25 иконками, если у Вас 5 вкладок, используются иконки NN 0,1,2,3,4.
При необходимости сменить иконку просто перемещаете ее
ImageList1.Move(25,0);,
а чтоб вернуть остальные иконки на место не забудьте
ImageList1.Move(1,25);
Удачи Вам.

Оценка за ответ: 2.
Комментарий: Расход памяти... Это минус...



Вопрос № 247

Текст вопроса:

Привет Всем!
Помогите вставить ProgressBar в этот код.

Приложение:

Автор вопроса: Vit2 (статус: Посетитель)
Дата и время отправки вопроса: 08.01.2007, 21:25
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 5
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 09.01.2007, 17:02]:

Переделать следует эту строку
AContext.Connection.IOHandler.ReadStream(AStream, Filesize, False);

Делим наш размер на несколько логических кусков. Думаю на 10 будет предостаточно, но при маленьком размере, можно и уменьшить.
слишком дробить файл не советую, так как это может замедлить работу. В примере я использую блоки по 16кбай.
Код в приложении
P.S. Советую код вынести в поток.

Приложение:

Оценка за ответ: 5.



Вопрос № 248

Текст вопроса:

Здравствуйте! У меня есть DBGrid1 связаный с IBQuery1 с двумя полями "ID" и "Name"! Моя задача оссуществить сортировку при нажатии на заголовок столбца. То мне по клику на заголовок надо изменить свойство IBQuery1.SQL! Как это сделать?
Заранее спасибо)))

Автор вопроса: RedMask (статус: Посетитель)
Дата и время отправки вопроса: 09.01.2007, 10:13
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Иусов Сергей Ник. (статус: 2-ой класс), 09.01.2007, 10:27]:

Здравствуйте, RedMask!

В коде метода TDBGrid.TitleClick

IDQuery.Close;
IDQuery.SQL.Text:='SELECT * FROM [Имя_Таблицы] ORDER BY '+Column.Field.FieldName;
IDQuery.Open;

Оценка за ответ: 5.
Комментарий: Спасибо, помогло(как же я этот обработчик не углядел?)! Только на Close почему то жаловался, но я его убрал и заработало! Спасибо большое ещё раз!

2. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 09.01.2007, 11:02]:

Здравствуйте, RedMask!
Я на Access сделал сейчас, мне так проще, но с IB всё так же должно быть:
...
const
SQL_str = 'SELECT * FROM Table1 ORDER BY ';

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
s: String;
begin
s := Column.FieldName;
Query1.Active := false;
Query1.SQL.Text := SQL_str + s;
Query1.Active := true;
end;
...

Оценка за ответ: 4.
Комментарий: Ну это тоже самое, но спасибо)



Вопрос № 249

Текст вопроса:

Люди плиз помогите с задачкой.

[Quote]На шахматной доске размером N на N размещен круг с радиусом R так, что его центр совпадаетс центром одной из клеток. Требуется посчитать количевство белых и черных клеток доски, целиком попавших внутрь круга. Левая нижняя клетка доски - черная.
Входные данные (circle.in):
На первой строке входного файла даны 4 целых числа, разделенные пробелом: N - размер стороны доски (1<=100), R - радиус круга (1<=R<=100). X, Y - координаты
клеток центр которой совпадает с центром круга (1<=X,Y<=N). Координаты клетокотсчитываются от левой нижней клетки доски, которая имеет координаты (1,1).
Выходные данные (circle):
В выходной файл нужно вывести два целых числа - количевство белых и черных клеток которые попали внутрь круга.[/Quote]

Я ее уже дня два решаю и... ничего.

Желательно на паскале но можно и на delphi.
Заранее спасибо!

Автор вопроса: AlexKZ (статус: Посетитель)
Дата и время отправки вопроса: 09.01.2007, 12:50
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 09.01.2007, 17:20]:

Алгоритм простой до безобразия. Но как обычно в алгебре, нужно лишь точно задать систему координат
Пусть сторона квадрата клетки имеет размер 1 еденицу. Тогда координаты первой клетки такие
(0.0)
(0,1)
(1,0)
(1,1)

Для произвольной клетки координаты будут такие
(x,y)
(x+1,y)
(x,y+1)
(x+1,y+1)

Теперь круг. он у нас рисуется с центра клетки, поэтому координаты должны просчитываться так
(x+0.5,y+0.5)

Здесь у меня x и y координаты клетки (по номерам, а не в новой системе координат)

Теперь споминаем геометрию, которая говорит, что если есть круг с центром в точке (x,y), радиуса R и точка (a,b), то точка будет внутри круга, если выполняется условия
R^2>(x-a)^2+(y-b)^2
^2 - это "в квадрате". По поводу равно надо ещё подумать, так как вещественные числа сравнивать на равенство нельзя, и как быть, когда точка находиться на окружности.

и предпоследнее - как определить цвет клетки.
если клетка (1,1) чёрная, то
если mod(x-y)mod 2=0 то эта клетка также чёрная
Если 1 - белая.

Теперь у нас всё есть. Можно алгоритм писать.
Заводим две переменные для количества белых и чёрных клеток. Обнуляем их.
делаем двойной цикл, что бы оббежать по всем клеткам.
в цыкле
Вычисляем координаты 4 вершин текущей клетки и проверяем, попадают ли они в круг. Если все четыре вершины попали, значит и клетка попадает. Почему - докажите сами.
Если попали - вычисляем цвет клетки и увеличиваем соответствующую переменную.
Хотя, если мы пробегаем последовательно по всем клеткам, то цвета будут постоянно чередоваться.

Код не привожу - это удовольствие оставляю для вас :)

Оценка за ответ: 5.
Комментарий: Большое спасибо!



Вопрос № 250

Текст вопроса:

Здравтсвуйте.
На данный момент я пишу дипломную работу. И времени у меня почти не осталось. Помогите пожалуста. Подскажите как мне сделать сделать отчеты в Excel из таблиц базы данных?
Заранее благодарен...

Автор вопроса: BLOOD_OMEN (статус: Посетитель)
Дата и время отправки вопроса: 09.01.2007, 19:49
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 09.01.2007, 20:59]:

Здравствуйте, Shab!
Как пример работы из D7 с Excel: "Создание сводного отчета в Excel" - http://citforum.ru/programming/delphi/pivot_report/

Оценка за ответ: 5.



Вопрос № 251

Текст вопроса:

Уважаемые эксперты. Мне опять нужна ваша помощь в задаче. Условие такое: Имеется N кубиков. Стеной будем считать несколько столбиков из этих кубиков, расположенных рядом. Обозначим h[i] - высотой i-го столбика стены. Требуется посчитать количество различных стен таких что
h[i]>=h[i+1] & h[1] + h[2] + ... + h[m]=N для всех i - от 1-го до m-1, где m-это количество столбиков в стене.
Пример (http://savepic.ru/37264.gif).
Заранее спасибо.

Автор вопроса: AlexKZ (статус: Посетитель)
Дата и время отправки вопроса: 09.01.2007, 21:15
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 4
Страница данного вопроса >>


» Ответы на данный вопрос:

К сожалению, ответов на данный вопрос не поступило...



Вопрос № 252

Текст вопроса:

Здравствуйте, господа Эксперты!!!
Помогите разобраться со спящим, энергосберегающим, экраносохранящим режимом, как в ХР, так и в 9х. Моей программе необходимо отключать онные, но никак не выходит. Функция SystemParametersInfo в секции инициализации не отключает их. Система все равно выходит в спящий режим.
Необходимо чтоб при работе программы не было никаких режимов энергосбережения, т. е. всегда было активно и работало главное окно программы.

параметры главной формы:
WindowState:= wsMaximized;
BorderStyle:= bsNone;

Спасибо за ответы. Плиз на мыло.

Приложение:

Автор вопроса: Александр (статус: Посетитель)
Дата и время отправки вопроса: 10.01.2007, 01:31
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

К сожалению, ответов на данный вопрос не поступило...



Вопрос № 253

Текст вопроса:

Здравствуйте=)Как сделать выпадающий список из DBGrida, поля которого определяются через IBTable.Fields? Я знаю, что это делается через DbGrid.Columns.PickList, но в моём DBGrid'е свойство Columns не определено, и используется IBTable.Fields!

Подскажите, как можно решить эту нетривиальную задачу! Пологаю, что для экспертов это вообще не проблема, а я ещё новичёк в БД %) Заранее спасибо!

Автор вопроса: RedMask (статус: Посетитель)
Дата и время отправки вопроса: 10.01.2007, 09:45
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 5
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Иусов Сергей Ник. (статус: 2-ой класс), 11.01.2007, 11:09]:

Здравствуйте, RedMask!

На самом деле колонки у грида есть, иначе не было бы видно данных. Вот это добавляет выпадающий список в DBGrig1 со значениями 1,2,3 во второй (слева на право) столбец

DBGrid1.Columns[1].PickList.Text:='1'#$0D#$0A'2'#$0D#$0A'3'#$0D#$0A;
DBGrid1.Columns[1].ButtonStyle:=cbsAuto;

Оценка за ответ: 5.
Комментарий: Спасибо! В следущий раз обязательно так сделаю =)



Вопрос № 254

Текст вопроса:

Кто имел опыт, поделитесь - как работать с сенсорным монитором в Delphi?

Автор вопроса: X_nx (статус: Посетитель)
Дата и время отправки вопроса: 10.01.2007, 10:30
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 2
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Бубырь Александр Николаевич (статус: 4-ый класс), 10.01.2007, 15:05]:

Я имел опыт.
Ничего особенного не нужно. Сенсорный монитор фактически эмулирует щелчок мышью, никаких дополнительных обработчиков не нужно. (По крайней мере мне не понадобилось с сенсором GeneralTouch).
Так что успехов.



Вопрос № 255

Текст вопроса:

Добрый день уважаемые эксперты!
Как открыть таблицы FoxBase, используя технологию ADO?
Драйвера ODBC инсталированы.

Автор вопроса: Булатов Михаил Майорович (статус: Посетитель)
Дата и время отправки вопроса: 11.01.2007, 06:17
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 12.01.2007, 16:52]:

Здравствуйте, Булатов Михаил Майорович!
Если есть драйвера ODBC,то с помощью менеджера ODBC можно создать источник данных. Потом к нему можно подключиться. Какие выбрать параметры подключения? Вначале, когда только я разбирался с этой технологией, я придумал оригинальный способ, который гарантирует подключение. Запускаете Excel. У него есть пункт меню "Данные -> Импорт внешних данных -> Импортировать данные". Ну а дальше пользуетесь получеными окошками. Если данные импортируются, и вы их видите на листе, значит у вас получиться работать с ними. Для этого в Excel'я надо забрать строку подключения, еоторую потом указываем соответстующим компонентам нашего приложения. Берётся она так.пункт меню "Данные -> Импорт внешних данных -> Изменить запрос". И он у вас как на ладоне. Что обозначают определённые слова в этой строке подключения, вы разберётесь позже



Вопрос № 256

Текст вопроса:

Здравствуйте эксперты. Проблема такова - есть код создания отчета, но в нем есть ошибка
With table1 do begin
While not EOF do begin
Abc.Cells[i,2]:=FloatToStr(Table1['No_Zapisi']);
Abc.Cells[i,1]:=FloatToStr(Table1['No']);
Abc.Cells[i,3]:=FloatToStr(Table1['Vstuplenie']);
Abc.Cells[i,4]:=FloatToStr(Table1['Doljnost']);
необходимо присвоить полям правильное преобразование строк. Как это сделать?

Автор вопроса: BLOOD_OMEN (статус: Посетитель)
Дата и время отправки вопроса: 11.01.2007, 22:21
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 12.01.2007, 01:28]:

Здравствуйте, BLOOD_OMEN!
Надо так:
Abc.Cells[i,2]:=String(Table1['No_Zapisi']);
Советую почитать какой-нить учебник по D&БД, про создание объектов-полей в частности, а то мне не нравится ваш стиль.

Оценка за ответ: 2.
Комментарий: With table1 do begin While not EOF do begin Abc.Cells[i,2]:=Vartostr(Table1['Family']); Abc.Cells[i,1]:=Vartostr(Table1['Name']); Abc.Cells[i,3]:=Vartostr(Table1['Otchestvo']); Abc.Cells[i,4]:=Vartostr(Table1['Data_Rojd']); Знаешь, а я сделал вот так!! И все ногрмально работает... Твой вариант, вообще то сам по себе не работоспособен!!! Извини, но факт!

2. [Отвечает: Иусов Сергей Ник. (статус: 2-ой класс), 12.01.2007, 05:18]:

Здравствуйте, BLOOD_OMEN!
Все ж таки, как говорится, "классически" нужно писать так (приложение)

Приложение:



Вопрос № 257

Текст вопроса:

Здраствуйте! Мне необходимо минимум через каждые 500мкс делать опрос и установки через LPT. И также регулировать этот интервал опроса. С помощью TTimer это не получается и нет стабильных интервалов. Помогите кто чем может!

Автор вопроса: Цопа Владимир Милузиевич (статус: Посетитель)
Дата и время отправки вопроса: 12.01.2007, 12:22
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 12.01.2007, 16:50]:

Посмотри в сторону QueryPerformanceFrequency(), QueryPerformanceCounter(). Ну и не забывать, что Windows не обеспечивает никаких _гарантированных_ интервалов времени. Хотя продуманное выделение критических частей в отдельные потоки с соответствующими приоритетами в большинстве случаев даёт положительный результат.

2. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 12.01.2007, 17:05]:

Здравствуйте, Цопа Владимир Милузиевич!
Попробуйте зациклить в ПОТОКЕ с использованием вместо таймера либо Sleep(500), либо (что лучше):
...
var
h: THandle;
begin
...
h := CreateEvent(nil,true,false,'');
WaitForSingleObject(h,500);
CloseHandle(h);
...

3. [Отвечает: Вадим К (статус: Высокий уровень), 12.01.2007, 17:06]:

Здравствуйте, Цопа Владимир Милузиевич!
Чёто мне кажеться, вы на неправильном пути. Дело в том, что таким способом при всём желании вы не получите стабильных интервалов. Даже если генератор на мамке позволит это (не путать с тактовым генераторм проца! У порта свой контролер.) Например некоторые СОМ порты не могут преодолеть скорость в 256кб. Вдобавок, при всём старании Windows не гарантирует вам, что она вовремя отправит запрос. Она не операционка реального времени. Выходов здесь 3
1)Использовать операционку реального времени, QNX. Но тогда прийдётся забыть о Делфи, хотя есть FreePascal на котором под неё можно писать, но я не знаю, позволяет ли он корректно работать в режиме реального времени.
2) Использовать контролер. Теперь вы просто отдаёте ему комманды по мере необходимости, а он сам всё разруливает. По мере необходимости отсылает вам данные. Возможно прийдётся перейти на USB порт.
3)Использовать не полноценный контролер, а просто схему с генератором и несколькими регистрами.



Вопрос № 258

Текст вопроса:

Как мона датасет сортировать по лукап-полям? По вычисляемым полям (желательно)?

Приложение:

Автор вопроса: Ласковый 3лоумышленник (статус: 3-ий класс)
Дата и время отправки вопроса: 12.01.2007, 17:59
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 9
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alex Van Glukhman (статус: 7-ой класс), 13.01.2007, 06:57]:

Здравствуйте, Ласковый 3лоумышленник!

Видимо придётся подробно осветить данный вопрос!

Начнём с TADOQuery и с теории - поля Lookup при открытии TDataSet содержат значение соответствующее ключу основной таблицы, т.е список раскрывается только в тот момент когда TDataSet находится в состоянии dsEdit. Простой прямой метод сортировки по полю Lookup невозможен ввиду того, что в наборе данных это поле драйвером dbGo не распознаётся. Отсюда возникает решение подмены данного поля полем fkData дублирующим значение текста поля Lookup по которому возможно произвести сортировку. В случае с TADOQuery привожу конкретный пример есть две таблицы Страны TableName:=Country c полями id - autoincrement и Name - String(100) и Регионы Regions соответственно поля id - autoincrement Region - String(100) и IDCOUNTRY - integer. соответственно первые поля ключи.
На форму кидаем TADOQuery и TADOTable к TADOTable подключаем таблицу стран а в SQL запросе ADOQuery пишем 'SELECT A.REGION, B.NAME, A.IDCOUNTRY FROM REGION A, COUNTRY B WHERE A.IDCOUNTRY=B.ID ORDER BY B.NAME' проверяем запрос работает. Далее в редакторе поле ADOQuery добавляем все существующие поля их должно быть 3 и выбираем добавить новое поле которое определяем как Lookup имя cnt key-idcountry, lookup dataset ADOTable, lookup key - id, result field - name. Готово далее набор данных от ADOQuery подключаем к TDBGrid в котором добавляем все Columns и далее скрываем либо удаляем колонку отражающую NAME. Всё готово и всё работает. Дальнейшая обработка записи, редактирования, удаления набора данных ложится на ручки программера теми же SQL запросами, но сортировка в данном случае выполняется железно. C таблицей объясню позднее

Удачи!




Вопрос № 259

Текст вопроса:

Уважаемые эксперты. Хочу написать свой веб-сервер, поэтому и вопрос: где можно прочитать про протокол HTML(в частности и про стандарт, желательно на руссаком языке)? И если можно приведите ссылки на стать, как с ним работать.

Автор вопроса: SMaks (статус: Посетитель)
Дата и время отправки вопроса: 13.01.2007, 04:06
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 13.01.2007, 11:41]:

Здравствуйте, SMaks!
Вот где почитать мона про протокол: http://book.itep.ru/4/45/http4561.htm

Оценка за ответ: 4.
Комментарий: Спасибо, еще бы чисто примеров общения клиента с сервером.

2. [Отвечает: Вадим К (статус: Высокий уровень), 13.01.2007, 15:32]:

Здравствуйте, SMaks!
Во первых о протоколе HTML вы не то, что на русском не найдёте, вы даже на английском ничего не найдёте. Вам нужно знать протокол HTTP и язык разметки HTML (в меньшей степени, но тоже надо). К счастью, разработчики компонентов Indy позаботились и написали компоненту TIdHTTPServer (начиная с 6 делфи - в стандартной поставке). Эта компонента берёт на себя все проблемы протокола, вам нужно только написать что на какой запрос выдавать.
В демках (папка Demod\Indy) примеров нет, но там есть текстовый документ с указанием откудова их можно стащить. А в примерах есть пример web-сервера.
А также погуглите на тему HTTP протокола. Скорее всего вы попадёте на RFC (к сожалению номер не помню). Есть даже переводы на русский. А там подробно описаны запросы-ответы.

Оценка за ответ: 4.
Комментарий: Да знаю я HTML, мне нужно только с протоколом разобраться. А на сокетах писать намного сложнее будет? И еще, как осуществляется обмен даными между сервером и, к примеру, PHP?



Вопрос № 260

Текст вопроса:

Ув. эксперты, как можно программно вытащить(безопасное извлечение устройств) flash-память?

Автор вопроса: SMaks (статус: Посетитель)
Дата и время отправки вопроса: 13.01.2007, 04:08
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 15.01.2007, 12:48]:

Формально для безопасного извлечения USB-накопителя достаточно сделать вызов CM_Query_And_Remove_SubTree() для родительского экземпляра устройства (Device Instance) нужного диска.
Однако проблема получения кода экземпляра устройства по букве диска достаточно нетривиальна.

Один из вариантов решения:
1) получить номер устройства в своём классе по имени устройства:
DeviceIoControl() c кодом операции IOCTL_STORAGE_GET_DEVICE_NUMBER для хэндла,
полученного с помощью CreateFile('\\.\X:', .... ) (где X - имя нужного диска)
Запомним найденный номер, например, в DeviceNumber.

2) Далее, путём перебора всех устройств в классе GUID_DEVINTERFACE_DISK (в случае USB-Flash), определяем номер устройства по имени:
DeviceIoControl() c кодом операции IOCTL_STORAGE_GET_DEVICE_NUMBER для хэндла, полученного с помощью CreateFile(Path, .... )
(где Path - SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath, которое возвращает SetupDiGetDeviceInterfaceDetail() )
Если полученный номер совпал с DeviceNumber (из п.1), то найденное устройство это то, которое нам нужно - запоминаем код экземпляра в DeviceInstance ( SP_DEVINFO_DATA.DevInst, которое возвращает SetupDiGetDeviceInterfaceDetail() )
Для перебора используем SetupDiGetClassDevs(), SetupDiEnumDeviceInterfaces().

Теперь, имея в наличии DeviceInstance, получаем код экземпляра родительского устройства с помощью CM_Get_Parent(DevInstParent, DeviceInstance) и выполняем CM_Query_And_Remove_SubTree() для DevInstParent.

Всё - USB-флэш можно извлекать.

P.S.: Интерфейсы к упомянутым функциям не входят в поставку Delphi, так что MSDN (или setupapi.h и cfgmgr32.h из DDK) в руки и...

Оценка за ответ: 4.



Вопрос № 261

Текст вопроса:

Уважаемы эксперты. Где можно скачать иходник(исходный текст программы) для работы с zip-файлами на прямую?

Автор вопроса: SMaks (статус: Посетитель)
Дата и время отправки вопроса: 13.01.2007, 04:30
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 13.01.2007, 15:44]:

Здравствуйте, SMaks!
Заходим на сайт www.torry.net
В строке поиска пишем zip и запускаем поиск. Просматриваем результаты. Возле каждого результата вы увидите буковки зелёнькие или красные. если там SW - это платное, нам не надо.
FW - бесплатные, но нет исходников. А вот если FWS - это то что надо - безплатные и с исходниками. Их и качаем. Запускаем демки, смотрим. Те, которые работают так как ожидается (иногда там попадают неполностью работоспособные) расковыриваем и изучаем до полного просветления. Я только что проверял и там точно с десяток компонент и библиотек есть. Для компонентов с исходниками можно смело качать и те, что не подходят вам по версии делфи (ну только акуратно надо с 1 версией и 8. Так как первая 16 битная и там были свои правила написания кода, а втроая под .NET - там свои законы). Иногда, когда версия не совпадает, бывает с первого раза не компилиться, но исправления обычно минимальны.

Оценка за ответ: 5.



Вопрос № 262

Текст вопроса:

Доброго всем времени суток. Хотел бы найти единомышлеников, тех кто пользуется: FB(+LAN)+D2006(/D7)+FIB+EhLib+FR3.
Среди вопросов, задаваемых посетителями, есть много таких, которые данная схема решит автоматически.
Хотелось бы завести отдельную тему по этому вопросу и решать возникающие задачу совместно. Как говориться много голов лучше, если они работают сообща ;-)

Автор вопроса: Хаитов Тимур (статус: Посетитель)
Дата и время отправки вопроса: 13.01.2007, 09:08
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


» Ответы на данный вопрос:

К сожалению, ответов на данный вопрос не поступило...



Вопрос № 263

Текст вопроса:

Ув. экперты. У меня есть одна картинка, состоящая из какой-то палитры цвета, есть другая картинка, покрывающая первую со своей палитрой, мне нужно слить их в одну картинку, т.е. вручну нужно на каждому пикселю их объеднить с определенным коэфициентом прозрачности, но как? (Слышал есть какой-то blending метод...)

Автор вопроса: SMaks (статус: Посетитель)
Дата и время отправки вопроса: 13.01.2007, 12:12
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 13.01.2007, 15:55]:

Здравствуйте, SMaks!
Этот метод подразумевает, следующее. Опишу фунцией: :)
//c1,c2 - два цвета для смешивания.
//скоко взять первого цвета, от 0 до 1
function Smeshat(c1,c2:TColor; pr:float):TColor;
var b1,b2:byte;
r,g,b:byte;
begin
b1:=(c1 shr 16) and $FF;
b2:=(c2 shr 16) and $FF;
r:=round(b1*pr+b2*(1-pr));

b1:=(c1 shr 8) and $FF;
b2:=(c2 shr 8) and $FF;
g:=round(b1*pr+b2*(1-pr));

b1:=c1 and $FF;
b2:=c2 and $FF;
b:=round(b1*pr+b2*(1-pr));
result:=RGB(r,g,b);
end;
Теперь в двойном цикле пробегаем по пикселям и записываем а результирующий. Правда через Pixels[i,j] будет немного медлено, но для отладки самое оно. Потом можно перейти на ScanLine - скорость возрастёт на порядок.

Оценка за ответ: 5.
Комментарий: Что-то я неслышал ничего про ScanLine, а это собсвенно что?

2. [Отвечает: Denisss (статус: 2-ой класс), 13.01.2007, 16:54]:

Здравствуйте, SMaks!

Привожу свою функцию по слиянию двух изображений c учетом коэффициента прозрачности (от 0 до 255).
Если коэффициент прозрачности = 0, то на выходе первое изображение, если = 255, то второе.

Пример использования:

// Допустим, есть некие два изображения
// (c загруженными в них изображениями):
// Bmp1, Bmp2: TBitmap;
// есть визуальные компоненты
// Image1: Timage;
// TrackBar1: TTrackBar1;
// У последнего необходимо установить
// свойство Max = 255
// В событии OnChange компонента TrackBar1 пишем
// следующий код:

procedure TForm1.TrackBar1Change(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp:= dsBMPMerge(Bmp1, Bmp2, TrackBar1.Position);
Image1.Picture.Bitmap.Assign(Bmp);
FreeAndNil(Bmp);
end;

Вот и все. Все остальные комментарии см. в приложенном коде.

Удачи!

Приложение:

Оценка за ответ: 5.
Комментарий: Спасибо.



Вопрос № 264

Текст вопроса:

Имеются компоненты DrawGrid1(8X8) и DrawGrid2 (2X4) заполненые на половину картинками. Как осуществить перетаскивание картинки из DrawGrid1 в DrawGrid2 и обратно.Перетаскивание на занятую ячейку запретить. Как осуществить проверку ячейки на наличие картинки

Автор вопроса: Эмиль (статус: Посетитель)
Дата и время отправки вопроса: 14.01.2007, 00:39
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 14.01.2007, 01:21]:

Надо реализовать банальный Drag&Drop. Для этого запасаемся бубдиками и читаем
www.delphiworld.narod.ru/base/drag_and_drop.html
www.delphiworld.narod.ru/base/drag_and_drop_tlistview.html
www.delphiworld.narod.ru/base/drag_two_lbs.html
www.delphiworld.narod.ru/base/drag_and_drop_two_dbgrids.html



Вопрос № 265

Текст вопроса:

Здраствуйте уважаемые эксперты. помогите пожалуста решить задачу.
Условие такое:
На обруч равномерно наклеили числа от одного до N по возрастанию по часовой стрелки так, что в верхней точке обруча было число 1. Затем с обручем проделали M действий. Нужно определить положение обруча в конце.
Возможные операции:
1. поворот влево или вправо на несколько позиций
-с этим вроде бы все понятно.
2. поворот относительно какой-то точки.
Во время выполнения любой операции центр обруча остается на месте.

Входные данные:
Первая строка - числа M и N.
Последующие M строк имеют следующий формат:
+X-поворот вправо на X позиций
-X-поворот влево (против часовой стрелки) на X позиций
Y-поворот относительно позиции Y, отсчитываемой по часовой стрелке с самого верхнего числа, позиция которого равна 1.

Выходные данные:
Hoop.out должен содержать N целых чисел - числа на обруче в итоговом положении по часовой стрелки, начиная с самого верхнего.

Пример:
hoop.in:
[Code]
5 3
+2
-3
3
[/Code]
hoop.out:
[Code]
1 5 4 3 2
[/Code]
Комментарий к примеру:
Исходное положение обруча: 1 2 3 4 5
После 1-ой операции: 4 5 1 2 3
После 2-ой операции: 2 3 4 5 1
После 3-ой операции: 1 5 4 3 2

Автор вопроса: Александр (статус: Посетитель)
Дата и время отправки вопроса: 14.01.2007, 16:50
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Высокий уровень), 14.01.2007, 21:26]:

Да, сложная задача, ничего не скажеш. Я так понимаю с чтением файла проблем нет?
Тогда начнём. Эту задачу лучше решать если знать математику остатков (поля Галуа). Но всё знать не обязательно. Надо только уметь додавать и вычитать. Итак, основная идея этой матиматики в отличии от обычной, то что количество чисел строго ограничено. Например от 0 до 9. А что же делать, если результат сложения, к примеру, выходит за этот интервал? Тогда берут по модулю. В нашем случае по модулю 10. Приведу примеры, станет ясней. Будем считать на нашем диапазоне.
2+2 = 4 - это работает
5+5 = 0. Упс, необычно, но на самом деле 10 mod 10 = 0, где mod - взятие остатка.
4+8 = 2.
теперь вычитание
3-2 = 1
2-3 = 9
Если присмотреться, то это очень похоже на вращения вашего обруча
где первое слагаемое - текущая позиция, второе - на сколько сдвинуть а модуль - максимальное число на обруче. Но так как у нас счёт начинается с 1, то просто необходимо чуточку "модифицировать" нашу арифметику.
Что бы Вы не мучились, я написал готовую функцию, которая складывает (и вычитает, если второй аргумент указать с минусом)
function Add(a,b,m:integer):integer;
begin
result:=(a+b) mod m;
if Result<0 then
result:=result+m;
end;
С вращением первого типа разобрались. Осталось разобраться с вторым типом.
Давайте обозначем текущую точку (та, что вверху) буквой T, точку вращения - V. Теперь обозначим на кругу точку X. Именно она окажеться вверху после переворота. Здесь будет слудующая зависимость
(T-V) mod N = (V-X) mod N; Но если переписать в нашей арифметике, то это будет просто
X=V-(T-V) - только функцию прийдётся вызывать дважды!
Ну а дальше уже всё просто. Можно ещё и оптимизировать.

Оценка за ответ: 5.




Статьи  >>
К сожалению, выпуск без статьи.

Вы можете отправить свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте.


Файловый архив  >>

Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения

Уважаемые читатели! Отправляйте полезные компоненты/модули, интересные исходники, собственные программы/игры и мы разместим их на сайте. Отправить можно здесь »

Название
Описание
Раздел
Объём
Ссылки

Monitoring


Программа для мониторинга директории. В комплекте компоненты DirMonitor и CoolTrayIcon.
788 Кб
  Архив рассылки: выпуски №51 - №60.
187 Кб
  Архив рассылки: выпуски №61 - №70.
239 Кб
 
Всего новых файлов: 3  
1.19 Мб
 

Если у Вас есть книги по Delphi (в электронном виде, разумеется) или другая полезная документация - сообщите и её можно будет разместить на сайте.

Отправить файл »   

Юмор

Ведущий раздела: Bruder

Хроники компьютерного маньяка (часть II)

21.07.
"Чего такой грустный, внучек?" - спрашивает сегодня дед. "Да хоть самый простой PALM бы мне, - отвечаю. - Дед, у тебя ведь палм'а нет?" "Hет, - отвечает.
- Hе растет, а вот бананов я тебе нарву в огороде". Это он так шутит, садюга.
22.07.
Бабка заставила (как она туманно выразилась, чтобы поправить меня трудотерапией) ухаживать за поросенком. Когда я увидел, какой уровень стерильности в его обиталище, то отказался наотрез входить туда без специального одеяния. Описал бабке, что нужен такой спецкостюм, как у Дюка Hюкема, когда он идет через канализацию с ядовитыми стоками. Она не поняла. Дала 1 прищепку на нос. Говорит, больше ничего не надо. А потом я, мол,вообще привыкну. Если справлюсь, то обещала показать с окраины нашей деревни соседнюю, где точно есть Интернет. Придется рискнуть.
23.07.
Что-то не заладилось у меня с Целероном. Сегодня он за мною погнался. Думал, все - придется начинать свою жизнь опять с первого уровня! Помогло дерево. Отсиделся на нем, пока дед отмодерировал зверюгу. Hо было кульно, как на последнем овне в третьем QUAKEI Еще показали мне летучую мышь. Hадо же, именем такого хорошего мейлера назвать такое некрасивое существо. Рассмотрел ее и понял, откуда черпают вдохновение создатели образов персонажей многих игрушек.
24.07.
В дополнение ко вчерашнему наблюдению. Обнаружил, откуда "великие дизайнеры" при разработке разных MechWarrior брали многие образцы, когда придумывали внешний вид своих боевых роботов. По двору бегает множество маленьких желтых Мехов, пищат и клюют зерна.
25.07.
Поросенок. Этот зверь быстрый, как разогнанный Athlon. Впрочем, это бывает только тогда, когда дело касается еды. И убрать у него в загоне очень трудно. Он то кусает за ноги, то толкает под коленки, то с размаху кидается в корыто с едой, после чего видимость в сарае пропадает полностью. Другой бы в этой ситуации сдался, но я решил терпеть. Как узнаю от бабки, где село с Интернетом, сбегаю туда и кину эху друзьям, пусть подкинут мне на время хоть какой-нибудь ноутбук, пока я совсем не одичал. Справиться с поросенком мне помог ассемблер. Кормление поросенка алгоритмизируется, как простейшая команда. Сначала надо его выгнать во двор. Потом указать все необходимые регистры, то есть все ему в загончике почистить и еду положить. И в конце сделать 21-е прерывание. То есть впустить эту зверюгу.
25.07.
Я выживу! В конце концов, есть ведь люди, которые за неимением Р4 еще работают на 486. А это также необитаемый остров. Итак, попробую оставшееся время провести с пользой. Устрою себе квест "Покорение деревни". Для начала хакнул улей с медом. Задымил спамом их админов и крякнул соты.(смайлик) Правда, потом их модераторы так насели, что, удирая, перескакивал я через FIREWALL'ы высотой в два моих роста. Теперь систему свою восстанавливаю специальными примочками. А облик у меня, как у Воина Хаоса из SPELCROSS, бабка пугается.
26.07.
Опять подозрения. Что-то они скрывают от меня. Hе может быть, чтобы компа у них не было. Вот подслушал, как дед говорил бабке: "Погода плохая, Macintosh'n для внучка не дозреют". Я насторожился, если дед "дозревает" до перехода на iMac, значит сейчас же он на чем-то работает? Дед взял с собой на рыбалку. Совать палец в рот щуке, чтобы проверить, как далеко он входит, может только полный тормозной чайник... Я видел, как один тип сделал это.
28.07.
Сегодня разогнал Целерона. Hатолкнуло меня на эту мысль его имя. Если есть такой процессор, то как же его не разогнать! Итак, набор для разгона. Бык (мой недоброжелатель), красная футболка (с надписью КОМТЕК 2000), кулер (емкостью 10 литров), забор (ограничитель скорости). Разгон Целерона был осуществлен, когда дед с бабкой были в огороде. Процесс занял восемь секунд: загрузка системы, когда бык выпускается из загона; и собственно разгон, когда используется красная футболка. Затем применяется охлаждение, когда надо с забора вывернуть на быка ведро воды. Хорошо получилось! Только тормозится он не сразу. Так что забор придется строить заново. Поэтому пока бабка деревню с Интернетом мне показывать отказывается. Кто же знал, что так получится?...
29.07.
Попросила бабка наколоть дров. Меня?! Это все ее трудотерапия. Показала чем и как. Я, конечно, видел такие орудия в <Аллодах>. Hо там они использовались больше для борьбы с врагами. А тут небольшие такие деревянные цилиндры.
Погибать в своем возрасте, не дописав свою операционку, я не хотел, поэтому принял ряд предосторожностей. В результате я разрубил два цилиндра, ушиб одну собаку, разбил два окна (так ей, Винде, и надо) и украсил двор десятком глубоких воронок. "Ты будешь отвечать у нас за дрова", - сказала бабка. "Hу, тогда уж пусть я буду Король Дров", - сразил я ее иронией. Она не поняла.
30.07.
Еще новости о тщательно скрываемой от меня компьютерной жизни села. Вчера наш сосед, простой тракторист, рассказывал бабке, что завтра огород вспахать ей не сможет, будет полуось менять. "Полетела она у него". Ага, думаю, это чем же он такую операционку запорол? Это значит, задачи решает вполне серьезные. А с другой стороны, может, он просто слабо программирует под OS/2, вот и загнал машину. Так я его и спросил. "Точно, - отвечает. - Загнал. Пер с прицепом по таким оврагам, что боялся - совсем машина рассыплется". Как восстановит, даст посмотреть. От моей помощи отказался.
31.07.
День огорчений. С макинтошами прокол, съедобные они. И с полуосью ошибочка вышла. Видел я ту полуось, мы ее всем компьютерным клубом не поднимем, тяжеленная. И вся в машинном масле. И палец, погрызенный щукой, болит до сих пор...
32.07.
Совсем отвык сам дату форматировать.
1.08.
Бабка моя, конечно, не Лара Крофт, но мешок груш мечет на вполне солидное расстояние. Так ей и сказал.
2.08.
Понял, как со стороны видится мой любимый чат. Это я наблюдал, как утром пять кур, семь гусей, четыре индюка и пара десятков их птенцов ведут себя, когда бабка сыпет им корм... Точно, мой чат. Или еще какой слабо модерируемый форум.
3.08.
Видел живую лошадь. Дед попросил помочь запрячь. К своему стыду обнаружил, что я о них ничего не знал. Hет, знаю, что кони бывают троянские, однажды у меня один такой порезвился в компьютере - но больше ничего. Для меня все эти приспособления для запрягания и очередность их использования - полнейшая тайна. Так ничего и не понял. Hо разберусь из принципа, ведь по идее это должно быть не сложнее HTML. Hадо будет после возвращения озадачить поисковики в Сети и пошарить по сайтам не может быть, чтобы кто-то уже не сбросил туда нужную информацию.
4.08.
Домой! Внезапно поймал себя на мысли, что так привык к своему квесту, что даже уезжать не хотелось. А на прощание дед меня шокировал! Когда приехал папик, и я уже сидел в машине, он, прощаясь, сказал мне в окно: "Hу что, внучек, мы с бабкой размер файла подкачки тебе подкорректировали?" Откуда? Как? Вот, еду, пишу и думаю...

Прислал: Aleksey P. Kharitinov

:))

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки.
Ведущий рассылки, Ерёмин Андрей.

В избранное