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

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

  Все выпуски  

Выпуск No88.


Программирование на DELPHI
Рассылка сайта www.delphi.int.ru
Выпуск #88 (30 декабря 2009 г.)

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

Delphi.int.ru

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

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

Сеть: DalNet
Сервер: irc.dalnet.ru
Порт: 6667
Канал: #delphiintru

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

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

Поздравляю Вас с наступающими праздниками - Новым Годом и Рождеством! Пусть новый год будет лучше предыдущего в 2010 раз и пусть он принесёт ещё больше прекрасных дней, ну и конечно море радости и веселья! Пусть все Ваши существующие программы избавятся от глюков, а все новые будут изначально их лишены! К сожалению, опыт показывает, что это практически невозможно, но тогда пусть количество ошибок сведётся к минимуму! Удачи!

А теперь давайте кратко подведём итоги уходящего года применительно к нашему совместному сетевому проекту. За этот год на сайте расширился функционал, были исправлены найденные ошибки. На начало будущего года запланированы ещё некоторые мероприятия в отношении нововведений. А теперь несколько слов по статистике. За 2009 год на сайте было задано на 35% больше вопросов, чем в 2008 году; в мини-форумах было оставлено на 75% больше сообщений, а если сравнивать количество написанного, то относительное увеличение превысило даже 100%; количество зарегистрированных на сайте пользователей увеличилось на 40%. Подводя итог, можно сказать, что за прошедший год проект довольно существенно расширил аудиторию, что не может не радовать.

Также стоит напомнить, что в социальной сети вКонтакте есть наша официальная группа: Delphi.int.ru - программирование (на Delphi и не только). Те, кто заглядывает в эту сеть и у кого есть желание - присоединяйтесь к группе. И ещё не забывайте о нашем IRC-канале, где могут быстро подсказать ответ на какой-нибудь вопрос. На канале работает бот, который сообщает обо всех основных событиях и изменениях на сайте. Информация по подключению находится в левом блоке.

В этом выпуске:

  • Статья: Компоненты Ribbon в Delphi;
  • Файловый архив - новые компоненты, исходники, программы и игры;
  • Юмор - Почему Дед Мороз не может существовать.

Статистика нашей экспертной системы по состоянию на 30.12.2009, 12:00 (предыдущий подсчёт - 22.08.2009, 12:00):

Количество экспертов: 97 (+14).
Участниками задано вопросов: 3 601 (+491).
Экспертами дано ответов: 3 704 (+333).
Количество сообщений на мини-форумах: 13 280 (+2 804).

До встречи в следующем выпуске!

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

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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом.

Количество читателей рассылки (30.12.2009, 12:00):
5345+2067+439= 7851

Связь по e-mail:

Администратор сайта
Служба поддержки


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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом
(текущая версия системы: 2.6+; последнее обновление: 27.12.2009)

Последние новости

5 сентября 2009 г.

По многочисленным просьбам пользователей создана возможность изменить количество сообщений, отображающихся на одной странице мини-форума. Рекомендуемое количество: 20-25. Приятной работы!

6 сентября 2009 г.

В личную информацию добавлено поле "Подпись". Содержимое этого поля отображается под сообщениями в мини-форумах. Ранее в качестве подписи использовался девиз, но это был временный вариант. Сейчас девиз и подпись - два разных поля. Тем участникам, кто размещал в девизе какую-то информацию, рекомендуется перенести её в новое поле. Делается это на странице Личная информация. Для поля подписи также доступно использование HTML-тегов, однако не стоит этим злоупотреблять.

8 сентября 2009 г.

В личной информации произошли изменения с полем «Страна». Ранее название страны вводилось вручную, но теперь страна выбирается из списка. Тем не менее, в списке присутствуют только те страны, которые были указаны тремя и более пользователями. Если нужной страны в списке нет, следует ввести её название вручную. Позже, если страна станет «популярной», она будет внесена в список и появится её флаг. Более чем у 80% пользователей название страны было автоматически сопоставлено со списком. Выбор из списка является более предпочтительным, чем ручной ввод названия. На странице с профилем также теперь отображается и флаг выбранной страны.

15 сентября 2009 г.

Усовершенствован мини-форум вопросов. Теперь участники, которым доступно использование HTML, могут легко цитировать сообщения с указанием автора цитаты. Делается это просто: выделяете на странице текст, который хотите процитировать, и нажимаете на ссылку «Цитировать» под образом участника (слева от сообщения). Выделенный текст автоматически добавляется в сообщение с тегом <quote>, а сам тег снабжается параметром user, который и определяет автора цитаты. Новый способ цитирования гораздо удобнее старого, где это приходилось делать вручную.
Кроме того, теперь возможность выделять блоки кода (т.е. автоматически подсвечивать их) в сообщениях доступна всем без исключения участникам! Чтобы выделить код, не имея доступа к HTML, нужно использовать специальный шаблон - {{code}}. Важно также закрыть блок командой {{/code}}. Пример: {{code}}if not(Ok) then{{/code}}. В случае, если нужно указать формат подсветки, то в открывающей команде нужно поставить вертикальную черту и далее указать желаемый формат, например: {{code|pascal}}begin a:=5; end;{{/code}}

17 октября 2009 г.

В подсветку кода добавлены 2 формата - Visual Basic / VBA и SQL. Соответствующие коды - «vb» и «sql», например <code language=sql>...</code> (или альтернатива для всех пользователей {{code|sql}}...{{/code}}).

 

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

За август кубки получили: min@y™ (лучший ответ) и Pessimist (лучший вопрос).
За сентябрь: Вадим К (лучший ответ) и I{ () T (лучший вопрос).
За октябрь: Егор (лучший ответ) и Черняев Саша (лучший вопрос).
За ноябрь: Обрезков Евгений Евгенийович (лучший ответ), Ruslan (лучший вопрос).

Последние достижения:

26 декабря 2009, 21:47: Жикльор повысил свой уровень и теперь имеет статус 4-ый класс (прежний статус: 3-ий класс).

24 декабря 2009, 07:46: Fantom повысил свой уровень и теперь имеет статус 2-ой класс (прежний статус: 1-ый класс).

23 декабря 2009, 23:45: Егор повысил свой уровень и теперь имеет статус 5-ый класс (прежний статус: 4-ый класс).

17 декабря 2009, 14:41: webkent стал экспертом и теперь имеет статус 1-ый класс (прежний статус: Посетитель).

9 декабря 2009, 10:17: min@y™ повысил свой уровень и теперь имеет статус Кандидат наук (прежний статус: Магистр).

 

Архив: вопросы и ответы

В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 1031 - 1050. Вопросы, на которые не было дано ни одного ответа, не публикуются.
Так как темп поступления вопросов от пользователей намного выше темпа их публикации, вопросы в рассылке публикуются выборочно. Просмотреть все заданные вопросы и ответы Вы всегда можете на сайте.

Статистика по выпуску:

Кол-во вопросов из выбранного диапазона: 19
Вопросов без ответов: 2
Кол-ответов: 23
Баллов за ответы: 50
Сообщений в мини-форумах: 14

 

Вопрос # 1 031

Приветствую, уважаемые эксперты!
22. Что делает стандартная подпрограмма Copy. Приведите пример обращения к ней и результат выполнения.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 18:40
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, natasha!
Функция Copy возвращает подстроку строки.
Имеет вид: Copy (S:string; Index, Count:Integer):String;
где
S - исходная строка
Index - позиция начала возвращаемой подстроки подстроки
Count - число символов в возвращаемой подстроке, в случае если Index + Count больше длины строки S, то возвращается подстрока начиная с символа в позиции Index и до конца строки S.

Примеры:
Copy('ABCDE',2,1) -> 'B'
Copy('ABCDE',3,7) -> 'CDE'
Copy('ABCDE',2,2) -> 'BC'

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 18:54
Оценка за ответ: 5


Вопрос # 1 032

Приветствую, уважаемые эксперты!
23. Что делает стандартная подпрограмма Delete. Приведите пример обращения к ней и результат выполнения.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 18:45
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

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

Delete(var s:string; index,count:integer)
Процедура удаляет из строки-параметра s подстроку длиной count символов, начиная с символа под номером index.

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 19:05


Вопрос # 1 033

Приветствую, уважаемые эксперты!
24. Что делает стандартная подпрограмма Insert. Приведите пример обращения к ней и результат выполнения

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 18:48
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

Здравствуйте, natasha!
Insert(source:string; var s:string;index:integer)
Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 19:06
Оценка за ответ: 5


Вопрос # 1 034

Приветствую, уважаемые эксперты!
25. Что делает стандартная подпрограмма Pos. Приведите пример обращения к ней и результат выполнения.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 18:55
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

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

Pos(substr,s:string):byte
Функция производит поиск в строке s подстроки substr. Результатом функции является номер первой позиции подстроки в исходной строке. Если подстрока не найдена, то функция возвращает 0.
Пример.

s := 'Система Turbo Pascal';
x1 := pos('Pascal', s); {x1 будет равно 15}
x2 := pos('Basic', s); {x2 будет равно 0}

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 19:03


Вопрос # 1 035

Приветствую, уважаемые эксперты!
26. Написать функцию и процедуру, которая преобразует заданную строку, так, чтобы все прописные русские буквы стали строчными. Написать пример обращения к этой функции.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 18:57
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: min@y™

{26. Написать функцию и процедуру, которая преобразует заданную строку, так,
чтобы все прописные русские буквы стали строчными. Написать пример
обращения к этой функции.}
 
function RusUpperCase(const S: string): string;
var
  i: Integer;
begin
  Result:= S;
  for i:= 1 to Length(Result) do
    if Result[i] in ['А'..'Я']
      then Result[i]:= Char(Byte(Result[i]) + 32)
      else if Result[i] = 'Ё'
             then Result[i]:= 'ё';
end;
 
// Пример использования:
S:= 'Пример ИсполЬзования';
WriteLn(RusUpperCase(S));

Ответ отправил: min@y™ (статус: Кандидат наук)
Ответ отправлен: 29 октября 2007, 13:54


Вопрос # 1 036

Приветствую, уважаемые эксперты!
28. Написать функцию и процедуру, которая преобразует заданную строку, так, чтобы все строчные латинские буквы стали прописными. Написать пример обращения к этой функции и процедуре.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:09
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

Здравствуйте, natasha!
Вот ответ на ваш вопрос...

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 19:21
Оценка за ответ: 5


Вопрос # 1 037

Приветствую, уважаемые эксперты!
30. Написать функцию, которая работает так, как стандартная подпрограмма Copy.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:12
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

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

Вот пример такой функции:

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 23:23
Оценка за ответ: 5


Вопрос # 1 038

Приветствую, уважаемые эксперты!
31. Написать функцию, которая работает так, как стандартная подпрограмма Delete.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:17
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Николай Рубан

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

Функция, которая работает так, как стандартная подпрограмма Delete (все параметры функции аналогичны самой Delete, только описана как функция, а не процедура):

function NewDelete(s:string; index,count:integer):string;
var i:integer;
sn:string;
begin
sn:='';
for i:=1 to length(s) do
if (i<index) or (i>=index+count) then sn:=sn+s[i];
NewDelete:=sn;
end;

Пример использования:
var s:string;
begin
...
s:='паровоз';
ShowMessage(format('Исходная строка="%s"'+#13+
'Удаляем из строки 3 символа начиная со второго'+#13+
'Новая строка="%s"', [s,NewDelete(s,1,4)]));
...
end;

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 28 октября 2007, 19:59
Оценка за ответ: 5


Вопрос # 1 039

Приветствую, уважаемые эксперты!
32. Написать функцию, которая работает так, как стандартная подпрограмма Insert, TrimLeft, TrimRight.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:19
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: min@y™

Делаем лабы вместе! УРА!

{32. Написать функцию, которая работает так, как стандартная подпрограмма
Insert, TrimLeft, TrimRight.}
 
function MyInsert(const S, Sub: string, Index: Integer): string;
begin
  Result:= Copy(S, 1, Index - 1) + Sub + Copy(S, Index, Length(S));
end;
 
function MyTrimLeft(const S: string): string;
begin
  Result:= S;
  while Result[1] in [#1..#32] do
    Delete(Result, 1, 1);
end;
 
function MyTrimRight(const S: string): string;
begin
  Result:= S;
  while Result[Length(Result)] in [#1..#32] do
    Delete(Result, Length(Result), 1);
end;

Мадемуазель, читай книжки по паскалю.
Хотя, наверное, это неплохой бизнес.

Ответ отправил: min@y™ (статус: Кандидат наук)
Ответ отправлен: 29 октября 2007, 14:17


Вопрос # 1 041

Здравствуйте!
Как определить все доступные шрифты и их возможные размеры для определенного компонента и для отдельного текста в этом компоненте?

Вопрос задал: Трофимов Евгений (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:24
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Трофимов Евгений!
Не понятно немного, что имеется ввиду "определенного компонента". Вообще то есть такой глобальный объект screen. А у него свойство Fonts. С помощью его можно получить полный список шрифтов.
Где то так можно получить список в Memo

var
  i: Integer;
begin
  Memo1.Clear;
  for i := 0 to Screen.Fonts.Count - 1 do
    Memo1.Lines.Add(Screen.Fonts[i]);
Что бы получить характеристику шрифта, вам нужна структура TTextMetric. пример её использования можно подсмотреть здесь здесь В примере проверяют только TrueType шрифта, но полностю структуру можно подсмотреть в файле Windows и MSDN

Ответ отправил: Вадим К (статус: Доктор наук)
Ответ отправлен: 28 октября 2007, 20:39


Вопрос # 1 042

Приветствую, уважаемые эксперты!
Написать функцию, которая возвращает сумму N случайных чисел

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:27
Всего ответов: 2

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

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

Функция может иметь вид:

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 22:59

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, natasha!
Функция, которая возвращает сумму N случайных чисел есть в стандартном модуле Math.pas :

function Sum(const Data: array of Double): Extended register; сумма ряда
function SumInt(const Data: array of Integer): Integer register; сумма ряда целых чисел

Ответ отправил: Feniks (статус: Бакалавр)
Ответ отправлен: 30 октября 2007, 15:36


Вопрос # 1 043

Приветствую, уважаемые эксперты!
Написать функцию, которая возвращает среднее арифметическое для N случайных чисел.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:30
Всего ответов: 2

 

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

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

Переделанная версия функции из вопроса № 1 042

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 23:01

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, natasha!
Функция поиска среднего арифметического для N случайных чисел есть в стандартном модуле Math.pas :

function Mean(const Data: array of Double): Extended;

Ответ отправил: Feniks (статус: Бакалавр)
Ответ отправлен: 30 октября 2007, 15:26


Вопрос # 1 044

Приветствую, уважаемые эксперты!
Написать процедуру, которая возвращает максимальное и минимальное значения в последовательности N случайных чисел.

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:34
Всего ответов: 4; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Бубырь Александр Николаевич

Здравствуйте, natasha!
Вы уже прикумарили всех! Есть волшебная клавиша F1, она расказывает что делает каждая функция и дает примеры использования.
Здесь помогают людям решать проблемы, а не делают задания в школу за ламеров, которые ни книг не хотят читать, ни даже помощь вызвать лень.

Ответ отправил: Бубырь Александр Николаевич (статус: Студент)
Ответ отправлен: 28 октября 2007, 19:33

Ответ #2. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, natasha!
var
i,N,z:integr;
max:integer;
begin
max:=-30000;
WriteLn('Введите N?');
ReadLn(N);
for i:=1 to N do
begin
WriteLn('Введите число №',i);
ReadLn(z);
if z>max then max:=z;
end;
WriteLn('Максимальное число: ', max);
end;

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 19:36

Ответ #3. Отвечает эксперт: Aleksey P. Kharitonov

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

Как бы это могло быть на Паскале:

Приложение:

Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)
Ответ отправлен: 28 октября 2007, 23:12

Ответ #4. Отвечает эксперт: Feniks

Здравствуйте, natasha!
Функции поиска минимального и максимального значения в масиве чисел есть в стандартном модуле Math.pas и кажется они описаны в Хелпе :

MaxIntValue
Returns the largest signed value in an integer array

MaxValue
Returns the largest signed value in an array

Mean
Returns the average of all values in an array

MinIntValue
Returns the smallest signed value in an integer array

MinValue
Returns smallest signed value in an array

В этом же модуле можно и исходники посматреть.

Ответ отправил: Feniks (статус: Бакалавр)
Ответ отправлен: 30 октября 2007, 15:21
Оценка за ответ: 5


Вопрос # 1 045

Здравствуйте!
Я так долго старался но у меня не получается. Если Вам не трудно уважаемые Ехперты отправьте мне исходник. Кароче...
У меня часто проблема с сетью и у меня много айпи-ов чтобы каждого по отдельности пинговать. Как сделать чтобы я ввел в Edit1 айпи например 192.168.1.1 -t то в Мемо1 он показал бы вточь-вточь похожую на пинг кторую на стандартном командном строке.
Если Вам не трудно уважаемые Ехперты то отправьте исходник на почту mehroj-1@mail.ru
C уважением Мехродж.

Вопрос задал: POWER (статус: Посетитель)
Вопрос отправлен: 28 октября 2007, 19:38
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, POWER!
Навряд ли тут кто-то будет польностью писать за Вас всю программу, а вот наставить на путь истинный – это запросто ;-)

Протокол Ping предназначен для тестирования компьютерных соединений в Интернете путём посылки через протокол Internet Protocol (IP) по обределённому адресу сообщения и ожидания от него ответа.

ICMP - Internet Control Message Protocol. ICMP служит для передачи сообщений об ошибках а так же управляющих сообщений . ICMP-тест может показать насколько быстро проходит информация между двумя узлами в Интернете

Вариант 1.

// Запуск консольного приложения и перехват вывода
procedure ExecCmdine(const CmdLine: string; CmdResult: TStrings);
var
Output: PIOFile;
Buffer: PChar;
TempString: string;
Line: string;
BytesRead: Integer;
 
const
BufferSize: Integer = 1000;
 
begin
Output := popen(PChar(CmdLine), 'r');
GetMem(Buffer, BufferSize);
if Assigned(Output) then
try
   while feof(Output) = 0 do
   begin
     BytesRead := Libc.fread(Buffer, 1, BufferSize, Output);
     SetLength(TempString, Length(TempString)+BytesRead);
     memcpy(@TempString[length(TempString)-(BytesRead-1)], Buffer, BytesRead);
     while Pos(#10, TempString) > 0 do
     begin
       Line := Copy(TempString, 1, Pos(#10, TempString)-1);
       if CmdResult<>nil then CmdResult.Add(Line);
       TempString := copy(TempString, Pos(#10, TempString)+1, Length(TempString));
     end;
   end;
finally
   Libc.pclose(output);
   wait(nil);
   FreeMem(Buffer,BufferSize);
end;
end;
 
Function Ping(host:string):boolean;
var params, CommandLine:string;
      t:TStringList;
      i:integer;
begin
Params := Format('-s%d ', [32]);
Params := Params+Format('-c%d ', [1]);
CommandLine := Format('ping %s%s', [Params, host]);
t:=TStringList.Create;
ExecCmdine(CommandLine, t);
Result:=pos('1 received, 0% packet loss', t.text)>0;
t.free;
end;

Примечание - под отладчиком Kylix код может не работать. Надо запускать приложение не под Kylix для того чтобы удостовериться что код работает.

Вариант 2.

1. Запускаем Delphi;
2. В Новом проекте добавляем в форму Tbutton, Tedit и Tmemo;
3. Вставляем "winsock";
4. объявляем структурку для IP-заголовка:
type
IPINFO = record
   Ttl: char;
   Tos: char;
   IPFlags: char;
   OptSize: char;
   Options: ^char;
end;

5. объявляем структурку для хранения ICMP пакета:
type
ICMPECHO = record
   Source: longint;
   Status: longint;
   RTTime: longint;
   DataSize: Shortint;
   Reserved: Shortint;
   pData: ^variant;
   i_ipinfo: IPINFO;
end;

6. Объявляем функции и процедуры, которые мы будем вызывать из ICMP.DLL
TIcmpCreateFile = function():integer; {$IFDEF WIN32} stdcall; {$ENDIF} 
TIcmpCloseHandle = procedure(var handle:integer);{$IFDEF WIN32} stdcall; {$ENDIF} 
TIcmpSendEcho = function(var handle:integer; endereco:DWORD; buffer:variant; tam:WORD; IP:IPINFO; ICMP:ICMPECHO; tamicmp:DWORD;
tempo:DWORD):DWORD;{$IFDEF WIN32} stdcall; {$ENDIF}

7. В Tbutton в событие Onclick вставляем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
wsadt: wsadata;
icmp: icmpecho;
HNDicmp: integer;
hndFile: integer;
Host: PHostEnt;
Destino: in_addr;
Endereco: ^DWORD;
IP: ipinfo;
Retorno: integer;
dwRetorno: DWORD;
x: integer;
 
IcmpCreateFile: TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
 
begin
if (edit1.Text = '') then
   begin
     Application.MessageBox('Enter a HostName ro a IP Adress',
       'Error', MB_OK);
     exit;
   end;
HNDicmp := LoadLibrary('ICMP.DLL');
if (HNDicmp <> 0) then
   begin
     @IcmpCreateFile := GetProcAddress(HNDicmp, 'IcmpCreateFile');
     @IcmpCloseHandle := GetProcAddress(HNDicmp, 'IcmpCloseHandle');
     @IcmpSendEcho := GetProcAddress(HNDicmp, 'IcmpSendEcho');
     if (@IcmpCreateFile = nil) or (@IcmpCloseHandle = nil) or (@IcmpSendEcho = nil) then
       begin
         Application.MessageBox('Error getting ICMP Adress', 'Error', MB_OK);
         FreeLibrary(HNDicmp);
       end;
   end;
Retorno := WSAStartup($0101, wsadt);
 
if (Retorno <> 0) then
   begin
     Application.MessageBox('Canґt Load WinSockets', 'WSAStartup', MB_OK);
     WSACleanup();
     FreeLibrary(HNDicmp);
   end;
 
Destino.S_addr := inet_addr(Pchar(Edit1.text));
if (Destino.S_addr = 0) then
   begin
     Host := GetHostbyName(PChar(Edit1.text));
   end
else
   begin
     Host := GetHostbyAddr(@Destino, sizeof(in_addr), AF_INET);
   end;
 
if (host = nil) then
   begin
     Application.MessageBox('Host not found', 'Error', MB_OK);
     WSACleanup();
     FreeLibrary(HNDicmp);
     exit;
   end;
memo1.Lines.Add('Pinging ' + Edit1.text);
 
Endereco := @Host.h_addr_list;
 
HNDFile := IcmpCreateFile();
for x := 0 to 4 do
   begin
     Ip.Ttl := char(255);
     Ip.Tos := char(0);
     Ip.IPFlags := char(0);
     Ip.OptSize := char(0);
     Ip.Options := nil;
 
     dwRetorno := IcmpSendEcho(
       HNDFile,
       Endereco^,
       null,
       0,
       Ip,
       Icmp,
       sizeof(Icmp),
       DWORD(5000));
     Destino.S_addr := icmp.source;
     Memo1.Lines.Add('Ping ' + Edit1.text);
   end;
 
IcmpCLoseHandle(HNDFile);
FreeLibrary(HNDicmp);
WSACleanup();
end;

У данного примера есть один недостаток - программа не воспримет доменное имя, только IP-адресс. Для пользователей NT не используйте функцию IcmpCloseHandle.

Это всё…..

Ну и в конце полный исходный код примера:
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
winsock, StdCtrls;
 
type
IPINFO = record
   Ttl: char;
   Tos: char;
   IPFlags: char;
   OptSize: char;
   Options: ^char;
end;
 
type
ICMPECHO = record
   Source: longint;
   Status: longint;
   RTTime: longint;
   DataSize: Shortint;
   Reserved: Shortint;
   pData: ^variant;
   i_ipinfo: IPINFO;
end;
 
TIcmpCreateFile = function(): integer; {$IFDEF WIN32}stdcall; {$ENDIF}
TIcmpCloseHandle = procedure(var handle: integer); {$IFDEF WIN32}stdcall; {$ENDIF}
TIcmpSendEcho = function(var handle: integer; endereco: DWORD; buffer: variant; tam: WORD; IP: IPINFO; ICMP: ICMPECHO;
tamicmp: DWORD; tempo: DWORD): DWORD; {$IFDEF WIN32}stdcall; {$ENDIF}
 
type
TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
 
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
procedure TForm1.Button1Click(Sender: TObject);
var
wsadt: wsadata;
icmp: icmpecho;
HNDicmp: integer;
hndFile: integer;
Host: PHostEnt;
Destino: in_addr;
Endereco: ^DWORD;
IP: ipinfo;
Retorno: integer;
dwRetorno: DWORD;
x: integer;
 
IcmpCreateFile: TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
 
begin
if (edit1.Text = '') then
   begin
     Application.MessageBox('Digite um HostName ou um End. IP',
       'Error', MB_OK);
     exit;
   end;
HNDicmp := LoadLibrary('ICMP.DLL');
if (HNDicmp <> 0) then
   begin
     @IcmpCreateFile := GetProcAddress(HNDicmp, 'IcmpCreateFile');
     @IcmpCloseHandle := GetProcAddress(HNDicmp, 'IcmpCloseHandle');
     @IcmpSendEcho := GetProcAddress(HNDicmp, 'IcmpSendEcho');
     if (@IcmpCreateFile = nil) or (@IcmpCloseHandle = nil) or (@IcmpSendEcho = nil) then
       begin
         Application.MessageBox('Erro pegando endereзos ICMP', 'Error', MB_OK);
         FreeLibrary(HNDicmp);
       end;
   end;
Retorno := WSAStartup($0101, wsadt);
 
if (Retorno <> 0) then
   begin
     Application.MessageBox('Nгo foi possнvel carregar WinSockets', 'WSAStartup', MB_OK);
     WSACleanup();
     FreeLibrary(HNDicmp);
   end;
 
Destino.S_addr := inet_addr(Pchar(Edit1.text));
if (Destino.S_addr = 0) then
   begin
     Host := GetHostbyName(PChar(Edit1.text));
   end
else
   begin
     Host := GetHostbyAddr(@Destino, sizeof(in_addr), AF_INET);
   end;
 
if (host = nil) then
   begin
     Application.MessageBox('Host nгo encontrado', 'Error', MB_OK);
     WSACleanup();
     FreeLibrary(HNDicmp);
     exit;
   end;
memo1.Lines.Add('Pinging ' + Edit1.text);
 
Endereco := @Host.h_addr_list;
 
HNDFile := IcmpCreateFile();
for x := 0 to 4 do
   begin
     Ip.Ttl := char(255);
     Ip.Tos := char(0);
     Ip.IPFlags := char(0);
     Ip.OptSize := char(0);
     Ip.Options := nil;
 
     dwRetorno := IcmpSendEcho(
       HNDFile,
       Endereco^,
       null,
       0,
       Ip,
       Icmp,
       sizeof(Icmp),
       DWORD(5000));
     Destino.S_addr := icmp.source;
     Memo1.Lines.Add('Pingou ' + Edit1.text);
   end;
 
IcmpCLoseHandle(HNDFile);
FreeLibrary(HNDicmp);
WSACleanup();
end;
 
end.

Ответ отправил: Feniks (статус: Бакалавр)
Ответ отправлен: 30 октября 2007, 15:07


Вопрос # 1 046

Приветствую, уважаемые эксперты! Как можно реализовать запрос на подтверждение закрытия окна?

Вопрос задал: alone (статус: Посетитель)
Вопрос отправлен: 29 октября 2007, 00:52
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Гадлевский Олег Вячеславович!
Очень просто. У формы есть событие OnCloseQuery (название само за себя говорит). Оно как раз предназначено для этого. там передается параметр CanClose (по английски - "разрешить закрыть"). так вот, если в этой процедуре присвоить этой переменной значение False, то форма закрыта на будет. а реализовать MessageBox я думаю вы уже сможете:)

Ответ отправил: Вадим К (статус: Доктор наук)
Ответ отправлен: 29 октября 2007, 01:07
Оценка за ответ: 5


Вопрос # 1 047

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

1. Как организовать хранение набора изображений в одном файле?

2. Как добавить изображение (записать) в ветку xml (в текстовом виде, как в dfm в Delphi?

Вопрос задал: Alexx-358 (статус: Посетитель)
Вопрос отправлен: 29 октября 2007, 05:30
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Alexx!
Есть универсальный метод хранения изображений.
XML в данном случае будет слишком избыточным (картинка на 100 кб будет занимать чуть больше 200 кб). Суть заключается в разработке правильного формата.
итак, запись обычно идёт так. вначале файла записываем пару байт - сигнатура.
дальше пишем 4 байта - кол-во картинок
а дальше в цикле размер картинки, какие то данные - например имя её и сама картинка. Причём можно не только bmp, а и любые другие, даже не картинки
в коде это будет выглядеть где то так

var 
  abm:array of TBitmap;
  i:integer;
  b:byte;
  fs:TFilestream;
  ms:TMemoryStream;
  s :string[10];//размер должен быть задан!
begin
  fs := TFileStream.create('filename', fmCreate);
  b:=10;  fs.write(b,1);
  b:=20;  fs.write(b,1);//сигнатуру записали
  fs.write(length(abm),4);
  for i:= 0 to length(abm)-1 do begin
    s := 'namepict';
    fs.write(s[1], 10);
    ms:=TMemoryStream.create;
    abm[i].SaveToStream(ms);
    fs.write(ms.size,4);
    ms.SaveToStream(fs);
    ms.free;
  end;
end;
чтение подобно
var 
  abm:array of TBitmap;
  i, l,sz:integer;
  b:byte;
  fs:TFilestream;
  ms:TMemoryStream;
  s :string[10];//размер должен быть задан!
begin
  fs:=TFileStream.create('filename', fmOpenRead);
  fs.read(b,1);fs.read(b,1);//вычитали сигнатуру. дальше может проверку сделать
  fs.read(l,4); // кол-во объектов
  SetLength(abm,l);
  for i:=0 to l-1 do
  begin
    abm[i]:=TBitmap.create;
    fs.read(s[1], 10);//метку прочитали
    fs.read(sz,4);//размер прочитали
    ms:=TMemorySream.create;
    ms.copyFrom(fs, sz);
    abm[i].loadFromStream(ms);
    ms.free;
    fs.position := fs.position + sz;
  end;
  fs.free;
end;
приимущество этого способа - что сделав метку, можно организовать по ним case и грузить самые разнообразные объекты (TStringList тоже умеет сохранятся в поток). а если объект, сохранённый в потоке нам неизвестен, то всегда можно пропустить его.

по поводу второго вопроса. преобразовать изображение в "строку". Это просто.
сохранение в строку (c Image в Memo)
var
  ms:TMemoryStream;
  s:string;
  i:integer;
  b:byte;
begin
  ms := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(ms);
  ms.Position := 0;
  setlength(s,ms.size*2);
  for i := 0 to ms.size-1 do
    begin
      ms.Read(b,1);
      s[i*2+1] := inttohex((b and $F0) shr 4,1)[1];
      s[i*2+2] := inttohex((b and $F),1)[1];
    end;
  memo1.Lines.Text := s;
  ms.Free;
end;
и обратно
var
  ms:TMemoryStream;
  s:string;
  i:integer;
  b:byte;
begin
  s:=memo1.Lines.text;
  ms := TMemoryStream.Create;
 
  for i:=0 to (length(s)-2) div 2 do
    begin
      b := Strtoint('$'+copy(s, i*2+1,2));
      ms.Write(b,1);
    end;
  ms.Position := 0;
  Image2.Picture.Bitmap.LoadFromStream(ms);
  ms.Free;
end;

Ответ отправил: Вадим К (статус: Доктор наук)
Ответ отправлен: 29 октября 2007, 12:48
Оценка за ответ: 5
Комментарий: Спасибо


Вопрос # 1 048

Здравствуйте, уважаемые эксперты! У меня на форме имеется TChart и TStringGrid(график уже построен,а таблица уже заполнена,график или графики построены соответственно по таблице).Мне бы сохранить таблицу,а под ней и график в вордовском документе.Помогите пожалуйста, подкинте код.

Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 29 октября 2007, 18:34
Всего ответов: 2; сообщений в мини-форуме вопроса: 4

 

Ответ #1. Отвечает эксперт: Николай Рубан

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

Для решения Вашей задачи на форме я расположил такие компоненты:
WordApp: TWordApplication;
StGrid: TStringGrid;
Bt_CreateWordFile: TButton;
Chart1: TChart;

Вот непосредственно код программы (рекомендую Вам внимательно читать комментарии к соответствующим блокам):

{процедура создающая файл *.doc в котором размещает таблицу и рисунок}
procedure TForm1.Bt_CreateWordFileClick(Sender: TObject);
var i,j:integer;
begin
Bt_randomfillClick(Sender);
with WordApp do
begin
ConnectKind:=ckRunningOrNew;
AutoQuit:=false;
Options.CheckSpellingAsYouType:=true;//не проверяем синтаксис
Options.CheckGrammarAsYouType:=true; //не проверяем грамматику
Visible:=true; //видно ли Word
Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);

{добавляем новую таблицу}
ActiveDocument.Tables.AddOld(WordApp.ActiveDocument.Paragraphs.Item(1).Range,StGrid.RowCount,StGrid.ColCount);
{заполняем таблицу данными из StringGrid-a}
with StGrid do
for i:=0 to ColCount-1 do
for j:=0 to RowCount-1 do
ActiveDocument.Tables.Item(1).Cell(j+1,i+1).Range.Text:=Cells[i,j];
{/------перемещаем курсор в конец документа------/}
ActiveDocument.Range(EmptyParam,EmptyParam).Select;
Selection.Start:=Selection.End_;
{/-----------------------------------------------/}
Chart1.CopyToClipboardBitmap; {копируем изображение Chart-а в буфер}
Selection.Paste; {вставляем рисунок из буфера в документ}
Disconnect; {разрываем соединение с Word-ом}
end; {with WordApp}
end;

Good Luck!!!

Приложение:

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Ответ отправлен: 30 октября 2007, 00:07
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, GAZ!
В дополнении к «Николай Рубан».
Прочитайте еще статью на сайте "Работа с приложениями Microsoft Office".

Ответ отправил: Feniks (статус: Бакалавр)
Ответ отправлен: 30 октября 2007, 14:37
Оценка за ответ: 5


Обучение Delphi

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

22. Простые типы данных
23. Множества
24. Записи (часть 1)
25. Работа с файлами и каталогами (часть 1)
26. Записи (часть 2)

Новых уроков пока что нет.


 

Статьи

Компоненты Ribbon в Delphi

Ribbon - тип интерфейса в GUI приложениях, основанный на тулбарах, разделенных табами. Последние приложения, выпущенные компанией Microsoft, применяют эту форму интерфейса, главной частью которой является модульная лента. После выпуска Microsoft Windows Vista и Office 2007 данный тип пользовательского интерфейса стал довольно популярен.

Используем возможности Ribbon Controls в приложениях Delphi

Впервые компоненты Ribbon были включены в состав CodeGear RAD Studio 2009 (Delphi 2009) и вызвали большой интерес среди разработчиков.

Всего закладка содержит пять компонентов: TRibbon, TRibbonComboBox, TRibbonSpinEdit, TRibbonScreenTipsManager и TRibbonScreenTipsPopup.

Закладка Ribbon Controls

Сразу обращу Ваше внимание на то, что использовать Ribbon Вы сможете только в связке с компонентом ActionManager со страницы Additional палитры компоентов. Так что, если Вы не имеете представления как действует ActionManager – то Вам вряд ли удастся реализовать полноценный интерфейс, да и вообще использовать Ribbon Controls в своем приложении.

Для того, чтобы разобраться с работой компонентов Ribbon, я предлагаю Вам разработать простенькое приложение, например текстовый редактор наподобие WordPad’а.

Итак, открываем Delphi и укладываем на форму следующие компоненты:

  • TActionManager с закладки Additional.
  • TImageList со страницы Win32 – здесь мы будем хранить все изображения для панели Ribbon.
  • TRibbon со страницы Ribbon Controls – главный компонент для работы с Ribbon. Собственно он и реализует поддержку Ribbon в Ваших приложениях.
  • Ну и стандартный RichEdit.

В итоге у Вас должен получиться примерно следующий вид будущего приложения:

Заготовка будущего приложения

Теперь начнем настройку.

Выделяем TRibbon и в свойстве ActionManager указываем ActionManager1.

По умолчанию Ribbon использует тему оформления Luna. Если Вы хотите изменить внешний вид панели инструментов, то можете сделать это изменяя свойство Style. Всего можно использовать 3 стандартные схемы: Luna, Obsidian и Silver.

Теперь изменим свойство Caption на что-нибудь другое, например назовем нашу будущую программу "WordPad 2009".

Переходим к ActionManager. В свойстве FileName указываем имя файла, в котором будут храниться пользовательские настройки панели. Если файл не указать, то при работе с программой настройки не сохранятся и при каждом запуске панель инструментов будет выстраиваться по умолчанию.

В свойстве Images выбираем наш ImageList1. Вы можете также указать где у вас будут храниться картинки для неактивных кнопок и пр., но это уже дополнительные "навороты", поэтому ограничимся одним ImageList’ом.

У компонента ImageList меняем свойства Height и Width на значение 32, а свойство DrawingStyle устанавливаем в dsTransperent. Загружаем в ImageList картинки, которые Вы будете использовать в приложении и переходим снова к Ribbon.

Выделяем Ribbon, жмем правую кнопку мыши и в меню выбираем Add Tab – таким образом мы создали страницу RibbonPage1, теперь переходим на эту страницу, снова жмем правую кнопку и выбираем в меню Add Group – добавляем RibbonGroup1. Вот в RibbonGroup'ы и добавляются все элементы управления. Как видите иерархия компонента довольна проста. Теперь переходим к RibbonPage1 и меняем свойство Caption на, например, "Редактор", а у RibbonGroup1 изменяем на "Работа с текстом". Теперь посмотрите на результат – чего-то не хватает? Конечно не хватает самого главного – кнопки меню. Чтобы добавить кнопку меню выбираем Ribbon, жмем правую кнопку мыши и в меню выбираем Add Application Menu. В итоге этих нехитрых действий у Вас должно получиться примерно следующее:

Создаём интерфейс

Заметьте – мы ещё не написали ни одной строчки кода, только настраиваемся на работу.

Теперь настроим вид кнопки меню. Для этого переходим к компоненту TRibbon и раскрываем группу свойств Application Menu, находим там пункт Icon и загружаем любую картинку в формате *.ico. По желанию, можете изменить свойство IconSize на isLarge, isMedium или isSmall. Я оставил это свойство по умолчанию в значении isMedium. Теперь Наше приложение выглядит ещё более "представительно". Осталось самое интересное – настроить все действия. А здесь придётся-таки обратить особое внимание на ActionManager.

Делаем двойной клик на ActionManager и в открывшемся окне переходим на вкладку Actions (Действия). Давайте для начала добавим одно из стандартных свойств, например, открытие файла. Для этого нажимаем на стрелку рядом с кнопкой New Action и в появившемся списке выбираем пункт New Standard Action. В итоге Вы получите целый список стандартных действий, которые поддерживаются в ActionManager. Нам необходимо свойство из группы File под названием TFileOpen. Выбираем свойство и жмем Ok. Теперь в окне ActionManager'а выбираем появившуюся категорию File, а в списке Actions наше добавленное свойство, которое обозначено там по умолчанию как Open... Все, что от нас сейчас требуется – настроить вид кнопки меню, отвечающей за выполнение этого действия и написать пару строк кода. Для этого переходим в Object Inspector, который, кстати сказать, должен сейчас у Вас выглядеть так, как показано на рисунке.

Object Inspector для действия TFileOpen

Здесь от нас требуется изменить свойства:

  • Caption - если вы хотите сделать свою подпись на кнопке.
  • Настроить Dialog.
  • ImageIndex - указать картинку из ImageList.
  • Hint - если хотите изменить подсказку.

Теперь, чтобы добавить это действие на панель инструментов, просто схватите его мышкой и перетяните на RibbonGroup. Теперь выберите в RibbonGroup это действие и найдите в Object Inspector’e свойство Command Properties – Button Size и измените его на bsLarge. Вот теперь наша кнопка выглядит действительно как кнопка. Можете поэкспериментировать со всеми свойствами – так Вы сможете легко научиться встраивать в панель не только кнопки, но и чекбоксы, комбобоксы и прочие элементы управления.

Теперь делаем двойной клик на нашей кнопке и переходим наконец-то к программированию. Описываем следующее событие:

procedure TForm1.FileOpen1BeforeExecute(Sender: TObject);
begin
  RichEdit1.Lines.LoadFromFile(FileOpen1.Dialog.FileName)
end;

Вот и все, что требуется описать, чтобы загрузить содержимое файла в RichEdit. Аналогичным образом Вы можете настроить абсолютно любые действия, причем необязательно стандартные.

И последнее, что хотелось бы отметить – это то, что вы можете использовать на панелях TRibbon и стандартные элементы управления, например стандартный ComboBox, но при этом может возникнуть ряд проблем, которые я рассмотрю ниже.

Проблемы при работе с Ribbon Controls

Как говорится, и в этой бочке мёда нашлась-таки ложка дёгтя. Несмотря на свою красоту и функциональность, Ribbon Controls в Delphi пока ещё сыроват, я бы даже сказал очень сыроват.

Например, присутствует ряд проблем при работе с компонентами в Design-Time – иногда размещенные на закладке компоненты ни в какую не хотят выделяться мышкой. Вроде руки не кривые, жмешь куда надо, а в Инспекторе появляются свойства совсем не того компонента или Action’а. Но это весьма несущественные проблемки, которые наверняка будут исправлены в ближайшем будущем.

Основная проблема с которой я столкнулся заключается в том, что при размещении на панелях большого количества стандартных компонентов Ribbon вдруг перестает напрочь реагировать на любые действия – выдает ошибку доступа к ячейкам памяти и умирает, что в итоге приводит к перезагрузке Delphi. Причём перезагрузка восстанавливает работу только оболочки, а проект так и не оживает.

Также при написании этой статьи натолкнулся на такой глюк – если вы переносите компоненты Ribbon с одной формы на другую, то Вам придётся перенастраивать все действия по-новой. Может это и не глюк, а сделано специально во избежание более серьезных проблем, но уж очень не хотелось бы переписывать по-новой, скажем так, действий 50-60...

Будущее Ribbon Controls в Delphi

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

В настоящее время я использую Ribbon Controls исключительно в целях саморазвития, т.е. не пишу программы "под заказ" с использованием этих компонентов, т.к. не хотелось бы пролетать со сроками сдачи из-за досадных недоразумений при работе с компонентами.

Источник: www.webdelphi.int.ru
(под редакцией Ерёмина А.А.)


Оценить данную статью, а также оставить свои комментарии Вы можете на нашем сайте. Перейти на страницу со статьёй »
 

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

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

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

Название
Описание
Раздел
Объём
Ссылки
SoundButton
Кнопка с возможностью указания звуков, которые будут проигрываться при наведении и убирании с неё курсора.
3 Кб
MirMap8
Программа имитация начальных этапов зарождения планеты. Генерирует рельефные карты, изменяющиеся во времени - от сгустка расплавленной лавы до образования рек и ледников. Предоставляет возможность отслеживать весь процесс как с высоты орбиты спутника, так и с поверхности планеты.
1.54 Мб
Internet Walker

Internet Walker - браузер на движке Internet Explorer с расширенными возможностями, многооконная надстройка. Так как это проект одного человека, и в нем возможны ошибки и недостаток функциональности, то пожалуйста, оставляйте их на форуме автора программы.

394 Кб

Slaid
Небольшая программка, не требующая специальной установки и почти не отвлекающая ресурсы процессора, которая позволит легко просмотреть и рассортировать ваши фото-архивы в формате jpg и bmp. Обеспечивает вывод слайдов с автоматическим масштабированием и применением прозрачного окна.

932 Кб

Симулятор самолета Л39
Симулятор самолета Л39, созданный на базе Direct 3D. В архиве помимо исполняемого файла находятся и исходники.

3.86 Мб

 
Представлено файлов: 5  
6.73 Мб
 


Юмор

Почему Дед Мороз не может существовать

1. Ни один Северный Олень не умеет летать. Но если честно, то мы еще не изучили 300.000 живых существ. И большинство из них - бактерии. Правда это не означает, что одно из существ не может оказаться летающим Северным Оленем.

2. На земле живет 2 миллиарда детей (люди, не достигшие 18 лет). Дед Мороз не приходит к детям мусульман, индусов, евреев и буддистов. Следовательно, можно откинуть 81.1%. Остается 378 миллионов детей. Допустим, что в каждой семье 3 ребенка. Получается 126 миллионов семей. Предположим, что в каждой из них только один хороший ребенок, заслуживший подарок.

3. Из-за разницы во времени и движения земли у Деда Мороза есть 31 час, чтобы доставить подарки, если считать, что он двигается с Запада на Восток (что логично). Получается, что он должен посещать 1129 семьи в секунду. Таким образом, он может потратить только 1/1000 секунды на то, чтобы остановится, вылезти из повозки, запрыгнуть в камин, положить подарок, вылезти назад через камин, залезть в повозку и лететь к другому дому. Допустим, что расстояние между домами равно 0,78 миль, тогда ему нужно проехать всего 75,5 миллионов километров. Но мы еше не учли, что за 31 час Дед должен, так же, делать то, что и все нормальные люди: есть и справлять нужду. Чтобы все это сделать, нужно двигаться со скоростью 650 миль в секунду. Для сравнения: самая быстрая машина, изобретенная человеком (спутник Ulуssеs), двигается со скоростью 27,4 миль в секунду, а обычный Северный Олень двигается, самое быстрое, со скоростью 15 миль в час.

4. Теперь рассмотрим подарки. Если каждый ребенок получит коробку ЛЕГО среднего размера (1.8 кг), получается, что повозка сама по себе весит 314.100 тонн, не считая Деда Мороза, который, по слухам, очень очень толстый. Обычный Северный Олень поднимает 150 кг. Допустим, что Летающие олени в десять раз сильнее. Тогда нам нужно 214.200 оленей, а не 6-8, на которых он, опять таки по слухам, ездит. И чем больше оленей, тем тяжелее повозка. Получается 353.430 тонн с оленями. Для сравнения: Корабль Quееn Еlizаbеth легче в четыре раза.

5. В результате получаем, что тело, весящее 353.000 тонн, двигается со скоростью 650 миль в секунду. Сила трения, возникающая при таком движении, воспламеняет Северных Оленей. При этом каждый Олень выделяет 14,3 квинтиллиона энергии, которая сжигает и Оленей и повозку. Получаем, что Олени и повозка уничтожаются за 4,26 тысячных секунды.

Вывод: Если Дед Мороз и существовал, то он, скорее всего, уже мертв.

Источник: bayanov.net

:))

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




Ведущий рассылки: Ерёмин Андрей


В избранное