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

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

  Все выпуски  

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


Опрос
Полезные ссылки
Публикуете ли Вы свои программы в сети? Если да, то
к какому типу Вы относите их большую часть?

Нет, не публикую
Да, freeware
Да, shareware
Да, donateware
Не знаю
Сайт "Программирование на Delphi":
http://www.delphi.int.ru/
Система Delphi.int.ru Expert:
http://www.delphi.int.ru/expert/
Форум сайта:
http://www.delphi.int.ru/forum/
Программирование на DELPHI
Выпуск #51 (16 июня 2006 г.)

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

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

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

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

В Delphi.int.ru Expert произошли значительные изменения. Появились новые возможности: загрузка файлов как приложение к ответам, форумы для каждого вопроса. Полностью изменилась система статусов. Статус присваивается в зависимости от количества отправленных ответов. В работе системы были исправлены некоторые ошибки.

Уважаемые читатели! Пожалуйста, активнее задавайте свои вопросы нашим экспертам. Задать вопрос >>

На сайте появились новые файлы. Для тех, кто отправлял файлы на сайт, но они ещё не появились - не огорчайтесь, они обязательно будут опубликованы в ближайшее время.

Также хотелось бы провести один опрос:

Нужна ли возможность установки аватаров (изображений) для зарегистрированных пользователей сайта?

< Да > < Нет >

Например, если сделать такую возможность, то в таблице рейтингов экспертов можно отображать эти аватары - будет намного симпатичнее. Жду Ваших мнений по этому поводу. Чтобы проголосовать просто щёлкните по одной из ссылок и отправьте письмо (можно даже пустое).

Все пожелания по поводу системы Expert отправляйте на expert@delphi.int.ru, а по поводу сайта и рассылки - на admin@delphi.int.ru.

Приятного Вам чтения и безглючного кода! :-)

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

Авторское слово
Delphi.int.ru Expert
Статья по Delphi
Файловый архив
Друзья
Юмор

Количество читателей рассылки: 5206.

Delphi.int.ru Expert

Задать вопрос экспертам >> Стать экспертом или уйти из состава экспертов >>Эксперты системы >>

Вопросы и ответы (#18 - #36)
Вопрос № 18

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

Уважаемые, эксперты.Помогите пожалуйста! Что нужно добавить, чтобы программа записывала значения 'a' и 'x1' в текстовый файл после какого-то текста?

Приложение:

Вопрос задал участник: Свиридов Евгений Геннадьевич
Дата и время отправки вопроса: 24.05.2006, 13:00
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: 6-ой класс), 24.05.2006, 13:50]:

Writeln(H,'Какой-то текст',a);
Writeln(H,'Какой-то текст',x1);
или
Writeln(H,a);
процедура Writeln - это так называемая "магическая", тоесть не неё не распространяются много правил языка. Компилятор зает как правильно обработать её. В данном случае, количество и типы параметров могут быть разные.

2. [Отвечает: Бубырь Александр Николаевич (статус: 1-ый класс), 25.05.2006, 09:51]:

Процедура writeln допускает передачу нескольких выводимых параметров через ",":
Writeln(H,'Например ',a);
В некоторых случаях удобнее самому создавать выводимую строку:
Writeln(H,'Например '+IntToStr(a));



Вопрос № 19

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

Здравствуйте! Подскажите пожалуйста, возможно ли написать на Delphi(7, 2006) TSR? Если да, то как? Спасибо!

Вопрос задал участник: Алексей
Дата и время отправки вопроса: 26.05.2006, 08:35
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 2-ой класс), 26.05.2006, 09:16]:

Здравствуйте, Алексей.
В приложении пример программы TSR (Terminate and Stay Resident).

Приложение:

Оценка за ответ: 4.
Комментарий: Прошу прощения, моя ошибка - не дописал DOS... Но как мне кажется, tsr - dos как само собой разумеющееся...

2. [Отвечает: Вадим К (статус: 6-ой класс), 26.05.2006, 11:29]:

Соглашусь с предыдущим экспертом, но добавлю
TSR - это программы времён DOS'а которые оставались в памяти и делали какую-то полезную и (не очень) работу. Просто тогда не было многозадачности (нельзя было запускать две программы одновременно). Сейчас это дивно, а тогода - норма.
Сейчас операционная система хорошо разруливает десятки приложений и всё работает. В данный момент наиболее вероятной заменой есть сервисы, драйвера (писать на делфи можно, правда только в 3 да ещё с извратом) и хуки.
То что предложил предыдущий эксперт - это обычная программа (хоть и написана на WinAPI)которая создаёт невидимое окно (в понятии делфи - форму) и регистрирует глобальную горячюю клавишу. Резонный вопрос: а зачем нам окно, если мы его не отображаем и вроде не используем?
Отвечаю. Для того, чтобы ваша программа могла обработать сообщения таймера и сообщение о том, что была нажата горячая клавиша, у ваше приложения должно быть окно. Так устроена Windows, она должна знать куда слать сообщения.

Оценка за ответ: 4.
Комментарий: Прошу прощения, моя ошибка - не дописал DOS... Но как мне кажется, tsr - dos как само собой разумеющееся... Я и хотел спросить: возможно ли написать tsr именно для DOS? на С++ я знаю такое написать можно, вот я и подумал, может и на delphi возможно...



Вопрос № 20

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

Как перемещать окно за форму, в смысле например если я делаю BorderStyle:=bsNone; и перемещать нужно или за форму или за какой-то другой элемент (кнопку, например)??? За ранее, спасибо!!!

Вопрос задал участник: Евгений В
Дата и время отправки вопроса: 27.05.2006, 01:43
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: 7-ой класс), 27.05.2006, 07:56]:

Почитайте вот здесь: http://www.delphi.int.ru/?name=articles&action=view&articleid=4 В конце этой статьи есть пример, как реализовать перемещение окна "за форму".

Оценка за ответ: 5.
Комментарий: И вам спасибо! Статья полезная! Как раз то что мне надо!

2. [Отвечает: bruder (статус: 2-ой класс), 27.05.2006, 08:25]:

Здравствуйте, Евгений В.
В событие OnMouseDown нужного компонента напиши две строчки из приложения к ответу.

Приложение:

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



Вопрос № 21

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

Здравствуйте Эксперты ! Как использовать МР3 кодеки установленные в Винде(в частности проигрывание, позиционирование, ID3 тэги и др.), или посоветуйте компоненты для проигрывания МР3 бесплатные, а то SwiftSoft Multimedia платная и без IDE Delphi не запускается.

Вопрос задал участник: deemixman
Дата и время отправки вопроса: 28.05.2006, 12:18
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 2-ой класс), 28.05.2006, 16:10]:

Здравствуйте, deemixman!
TMediaPlayer. Он может проигрывать и MP3. Если это вам не подходит, то рекомендую использовать библиотеку bass (поднять можно тут http://www.un4seen.com/).
Прочитать про тэги можно тут http://www.delphi.int.ru/?name=articles&action=view&articleid=1
УДАЧИ!

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

2. [Отвечает: Вадим К (статус: 6-ой класс), 29.05.2006, 11:16]:

ID3 тэги лучше читать ручками, так как у многих зарубежных компонент есть проблем с кириллицей. Это не очень сложно, так как просто нужно прочитать запись с файла.
Вот здесь почитайте
www.delphiworld.narod.ru/base/get_id3tag_v1.html
www.delphiworld.narod.ru/base/id3_mp3.html

Оценка за ответ: 4.
Комментарий: Нет ничего про проигрывание МР3



Вопрос № 22

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

Здравствуйте, подскажите, пожалуйста, как сделать сортировку строк (например, в алфавитном порядке)в StringGrid по какой либо колонке

Вопрос задал участник: Александр (Alv)
Дата и время отправки вопроса: 28.05.2006, 12:37
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 2-ой класс), 28.05.2006, 16:08]:

Здравствуйте, Alv!
Код в приложении. Использовать так: GridSort(StringGrid1, 1);
Удачи!

Приложение:

2. [Отвечает: mvp (статус: 3-ий класс), 29.05.2006, 10:28]:

Моя версия сортировки отличается тем, что можно сортировать в двух направлениях по очереди.

Приложение:



Вопрос № 23

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

Приветствую! Есть сервак FreeBSD с поднятым Апачем+php (upload_max_filesize=2M), каким образом я могу залить со своей проги файл, ну допустим 10 мегов. Есть ли альтернатива методу POST_FILE, пока думаю, что только таким образом можно достичь нужного мне результата?

Вопрос задал участник: IrviS
Дата и время отправки вопроса: 28.05.2006, 18:02
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: 6-ой класс), 29.05.2006, 11:24]:

Если на сервере стоит ограничение на размер, то "цивилизоваными" методами залить не удастся. Конечно, можно поискать уязвимости, но это уже совсем законно.
Но могу предложить другой метод. Делим файл на куски по пару сотен килобайт. Пересылаем на сервер кусочками. На сервере стоит скрипт, который потом соберёт это назад в один файл. Такой способ имеет несколько преимуществ.
1) размер файла теперь ограничен доступным местом на винте (или квоте)
2) автоматически появляется возможность "докачки". Если блоки не слишком большие, то если закачка сорвалась, нам надо переслать только текущий блок.
3) Если на новом хостинге будет ограничение на другой размер, то всё легко перенастроить.

Существует ли альтернативный способ? А фтп устроит?

2. [Отвечает: Степанов Игорь Николаевич (статус: 2-ой класс), 29.05.2006, 14:36]:

Возможно, сначала попробуй разбить этот файл на куски. Далее залей на сервер, а потом на сервере выполни команду сборки файлов.



Вопрос № 24

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

Каким образом возможно реализовать стиль интерфейса как у Nero SmartStart или Windows Media Player? А именно как позволить пользователю изменять цвет интерфейса на произвольный? Если существуют подобные библиотеки или компоненты подскажите какие.

Вопрос задал участник: Косарев Антон Сергеевич
Дата и время отправки вопроса: 29.05.2006, 03:02
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: Матвеев Игорь Владимирович (статус: 7-ой класс), 29.05.2006, 11:29]:

В Nero SmartStart, как я понимаю, не используются skin библиотеки, просто интерфейс оформлен изображениями, а у WMP - скины, но, в любом случае, скин - это набор изображений, а чтобы изменить цвет интерфейса, Вам достаточно изменить палитру у всех этих изображений.

Приложение:

2. [Отвечает: Вадим К (статус: 6-ой класс), 29.05.2006, 11:32]:

Такие компоненты существуют и называются они компоненты для поддержки скинов. Вообщето есть много разных библиотек, платных и бесплатных. Скачать компоненты можна с сайта torry. конкретно скины http://www.torry.net/quicksearchd.php?String=skin&Title=Yes
смотрим на буковки возле названий компонентов. Если там SW - платный, FW - бесплатный, FWS - ещё и с исходниками.

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

3. [Отвечает: Степанов Игорь Николаевич (статус: 2-ой класс), 29.05.2006, 14:39]:

Тебе поможет KSDev ThemeEngine (http://www.ksdev.com/themeengine/index.html)



Вопрос № 25

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

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

Вопрос задал участник: Николай Фролов
Дата и время отправки вопроса: 29.05.2006, 08:23
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: Матвеев Игорь Владимирович (статус: 7-ой класс), 29.05.2006, 11:20]:

Можно, здесь дело не в среде разработки и не в языке, а в умении программиста.

Распознавание - это нейронные сети, наберите в любом поисковике "нейронные сети + delphi" и найдете массу ссылок. Распознавание звука я не встречал, поскольку с ним работать посложнее, а вот символов видел, только ссылочку потерял, к сожалению.

2. [Отвечает: Вадим К (статус: 6-ой класс), 29.05.2006, 11:40]:

можно, так как такие программы есть:)
Но обычно это академические разработки. Разпознать простой звуковой сигнал (например звук клавиши фортепианно или баяна (не путать с бОяном)) достаточно просто - там чистый тон. Но уже аккардеона сложней.
Для того, что бы убедиться, что голос сложно распознать, запустите программу типа SoundForge и запишите с микрофона какое-нибудь слово, причём несколько раз. Пытайтесь произносить одинаково. Вы увидите, что картинка несколько отличается. А если вы попросите несколько своих знаковых произнести это слово, то картинка будет вообще иной. Но на слух вы слышите одно слово.
Считается, что обычный программист может за приемлемое время написать программу, которая будет распознавать несколько (20-30) его комманд, но не больше. Но только прийдёт ваш брат или сестра - и уже нужно переучивать программу....

3. [Отвечает: Евгений В (статус: 1-ый класс), 29.05.2006, 14:09]:

Исходником помочь не могу, просто ниразу этого не делал, но сделать можно всё что угодно, в принципе!!!
Надо снимать звук с микрофона, а затем обрабатывать его структуру. Ведь у каждого звукового сигнала есть определённая частота, искажения (форма сигнала) и т.д. Просто чтобы распознавать какой либо звук необходимо за ранее знать и частоту и возможные искажения (форму сигнала) и т.д.
Конечно у реальных звуков из жизни форма сигнала может быть очень сложной, поэтому это весьма непростая задача...



Вопрос № 26

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

Создать программу, которая отыскивала бы одинаковые рисунки на жестком диске, даже если они имели бы разные названия

Вопрос задал участник: Котышева О А
Дата и время отправки вопроса: 29.05.2006, 13:11
Всего ответов: 4
Страница данного вопроса >>


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

1. [Отвечает: Евгений В (статус: 1-ый класс), 29.05.2006, 14:19]:

В принципе можно, только не факт что этот способ сработает.
Можно например открывать каждый графический файл по очереди и проверять каждый его пиксель, сверяя его цвет с таким же по координатам цветом пикселя аналога.
Но, естественно, это будет ОООЧЕНЬ медленный процесс, да и к томуже он сработает только при полном соответствии пикселей оригинала и копии. С JPEG врятли сработает (сработает если это просто копия, а не заново сжатый файл) или если BMP и JPEG то врятли сработает (из за сжатия пиксели будут несовсем совпадать).

Хотя с другой стороны можно например продумать какие-то погрешности (максимально допустимые отклонения от полного соответствия), в этом случае в принципе может и нормально работать будет.

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

2. [Отвечает: min@y™ (статус: 1-ый класс), 29.05.2006, 15:41]:

Ладно, чего уж там! Чего велосипед-то изобретать? Написал я такую прогу. Работает она только с файлами *.jpg и делает примерно следующее:

1. В заданной папке и подпапках ищет все jpg-файлы.
2. Вычисляет CRC32 каждого файла и составляет список.
3. Отфильтровывает файлы с одинаковыми CRC32.
4. Копирует в заданную юзером папку все файлы, кроме дубликатов.

То, что только jpg - это не проблема, можно её заточить и под другие форматы.

Могу выслать exe и исходники или где-нить выложить.

3. [Отвечает: Матвеев Игорь Владимирович (статус: 7-ой класс), 30.05.2006, 02:30]:

min@y™ прав - нужно составлять таблицу хеш-значений, только не самого файла, как у него, а битовой матрицы - это сложнее, но будет лучше работать, ведь если у Вас есть два абсолютно одинаковых JPEG рисунка, но один с прогрессивной разверткой, а другой - нет - метод min@y™ не сработает. Итак, Вам нужно составлять таблицу вида Имя файла - Размер картинки - Hash.
Hash функцией может быть обыкновенный CRC, но это не лучший вариант в Вашем случае, можно поискать или даже придумать свою функцию, отражающую "сходство" образцов.
А если вам нужно простое решение - просто сравните размер файлов, отличающиеся значительно - разные, незначительно - подозрение, один размер - одинаковые.

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

4. [Отвечает: Бородинов Илья (статус: 1-ый класс), 30.05.2006, 06:05]:

То что ты предлагаешь не что иное как поиск графических файлов с одинаковым размером. Если ты хочешь создать анализатор который бы полностью аналитически сравнивал изображения то ты маньяк. Единственный способ (помоему) - искать графические файлы, сравнивать их размер, разрешение и по контрольным точкам определять такойже или нет. Вощем застрелишся....



Вопрос № 27

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

Недавно я спрашивал о боблиотеке для распаковки разных типов архивов, но нормальной не нашел, поэтому пишу свою. Напомню, от ZipTV пришлось отказаться, поскольку она неправильно работает с именами файлов в Русской раскладке. Сейчас я пишу класс, для распаковки Zip, использую библиотеку MiniZip (www.torry.ru), но оказывается она тоже не понимает Русских имен файлов. Вообще все библиотеки, что я нашел, для работы с Zip не понимают таких имен (исключая использующие dll, но это мне не подходит). Кроме того, я выяснил, что дело не в библиотеке, а в самом формате - имя файла записывается в файл архива в исковерканом виде, но ведь WinRar его понимает. Помогите разобраться с этим, может кто сталкивался - как преобразовать имя файла обратно в читаемый вид?

Приложение:

Вопрос задал участник: Матвеев Игорь Владимирович
Дата и время отправки вопроса: 29.05.2006, 13:35
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: 7-ой класс), 29.05.2006, 14:00]:

Всё не так сложно, Игорь!
Недолгие эксперименты показали, что это - кодировка DOS, а перекодировать её следует в WIN. Опознать текст удалось с помощью программы Штирлиц. Также мне удалось найти небольшой пример перекодировки строк. См. его в приложении. Надеюсь, что вам всё удастся. Удачи!

Приложение:

Оценка за ответ: 4.
Комментарий: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов.

2. [Отвечает: Помфюк Владимир Степанович (статус: 5-ый класс), 29.05.2006, 16:29]:

Какая-то логика в том, что программы изначально писаны по ДОС сохранают обратную совместимость и, соответственно, кодировку, есть. Пример от Dron'а Вам понадобится если попадутся архивы со специфическими буквами, например украинские і,ї,є. Если имена только русские Вам достаточно воспользоватся функцией OEMToANSI

Приложение:

Оценка за ответ: 4.
Комментарий: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов. В общем, проблема решена.



Вопрос № 28

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

Можно ли мне в своей процедуре использовать (Sender: TObject). Просто дописать - не прокатывает. Если можно, то как?

Вопрос задал участник: Иванов Сергей
Дата и время отправки вопроса: 29.05.2006, 16:13
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: Помфюк Владимир Степанович (статус: 5-ый класс), 29.05.2006, 16:40]:

Почему "не прокатывает"? Такой код(см. приложение) должен работать. Если же речь идет о обработчика события, в котором параметр Sender не предусмотрен - тут сложнее. При желании можно переписать компонент с обработчиком, который содержит Sender'a, но обычно по параметрам, которые передаются в обработку события можно определить компонент, который сгенерировал событие через свойства .Parent (возможно несколько раз: .Parent.Parent или как-то еще).


Приложение:

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

2. [Отвечает: Darya Ermakova (статус: 8-ой класс), 29.05.2006, 17:38]:

Да можно использовать, если под своей вы имели в виду обычную процедуру. Вот процедура, которая выводит текст Sender-а, если это кнопка (для примера просто).

Приложение:

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

3. [Отвечает: Матвеев Игорь Владимирович (статус: 7-ой класс), 30.05.2006, 02:18]:

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

Просто в своей процедуре Вы, конечно, можите его использовать, никто не запрещает.

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



Вопрос № 29

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

Помогите пожалуста. Уже не первый день парюсь... 1. искал, но так и не нашел, с помощью чег овставить картинку формата JIG? на сайтах пишут с помощью компонента TGIFImage - где найти? 2. добавляю в МЕМО-поле текст с помощью стандартного кода (приложение). Но он добавляет каждый раз на новую строку. Как сделать, что бы текст в МЕМО-поле дописывался в ту же строку? (а не в новую)

Приложение:

Вопрос задал участник: Aku Demon
Дата и время отправки вопроса: 30.05.2006, 14:00
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: Darya Ermakova (статус: 8-ой класс), 30.05.2006, 14:47]:

1) Тут есть TGIFImage 3.0:
http://www.sulako.com/files/gifimg30.zip
2) очень просто:
Memo1.Lines[0]:=Memo1.Lines[0]+'hello';

2. [Отвечает: Евгений В (статус: 1-ый класс), 30.05.2006, 15:37]:

Здравствуйте!
Всё просто, насчёт строки.
Смотри пример в приложении.

Просто нужно сначало удалить старую строку, а потом на её место вставить новую с помощью метода Insert.

Приложение:

3. [Отвечает: min@y™ (статус: 1-ый класс), 30.05.2006, 16:48]:

Короче:

1. Альтернатива TGIFImage - TRxGifAnimator из пакета RxLib.

2. Если надо писать текст в конец текста Memo, то проще наверно так (см. ниже).

Приложение:



Вопрос № 30

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

Ув. эксперты, нужна ваша помощь. Есть переменная такого типа: array of array [0..2] of array of integer; Нужно скопировать ее содержимое в другую такую же. Присваиванием динамические массивы не копируются, а Copy в данном случае выдает ошибку. Есть ли еще какой-нибудь способ скопировать такой массив, не используя цикл?

Вопрос задал участник: Darya Ermakova
Дата и время отправки вопроса: 31.05.2006, 15:57
Всего ответов: 4
Страница данного вопроса >>


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

1. [Отвечает: min@y™ (статус: 1-ый класс), 31.05.2006, 16:53]:

Ни разу не работал с 3D-массивами, но попробую подсказать. Это у тебя динамический массив. Если хочешь скопировать его содержимое в такую же переменную (или ваще куда угодно), пользуйся процедурой Move(), только размер массива-получателя (во всех его измерениях) поставь большим или равным размеру данных в 1-м массиве.

Приложение:

Оценка за ответ: 2.
Комментарий: move я пробовала, он к сожалению тоже копирует только ссылку на массив.

2. [Отвечает: mvp (статус: 3-ий класс), 31.05.2006, 19:15]:

Ничего сложного не вижу, попробуйте так, как в приложении (правда такие замысловатые динамические массивы не пробовал, где они в середине не динамические). Где-то так примерно, как в приложении. Если б не фиксированный размер в середине, то работало б точно, а так - попробуйте

Приложение:

Оценка за ответ: 4.
Комментарий: В результате почти так и сделала, только немного короче получилось. Было бы 5, если бы объяснили, почему без циклов нельзя :)

3. [Отвечает: Вадим К (статус: 6-ой класс), 01.06.2006, 11:59]:

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

Оценка за ответ: 5.
Комментарий: Похоже, вы правы. Мне казалось, что Copy копирует и многомерные массивы, но видно что-то перепутала. Спасибо за разьяснения, помогли понять, что там происходит.

4. [Отвечает: Yurchik (статус: 3-ий класс), 02.06.2006, 00:49]:

Мож подкорректируешь оценку mvp? Все таки он код написал, лучше вряд ли что-то придумаешь. Оформи этот код в отдельную процедуру с двумя параметрами (массив-источник и массив-копия) и вызывай эту процедуру сколько хочешь раз :)

Оценка за ответ: 3.
Комментарий: согласна :)



Вопрос № 31

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

Прошу помочь, знающие люди! Как мне из программы свызаться с базой данных в Интернет??? (прошо ответить по-подроднее) :)

Вопрос задал участник: Polyakov Ihor
Дата и время отправки вопроса: 02.06.2006, 19:46
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: 6-ой класс), 03.06.2006, 13:00]:

Базы бывают разные И соответственно, по разному к ним подключаться. Наиболее вероятно вы имеете в виду MySQL. Для них давно придумали комноненты для подключения. Так как MySQL - сервер, то ему абсолютно всё - равно где работать, вы к нему обращаетесь по адрес:порт. Зайдите на torry.ru и найдите подходящие компоненты.

Оценка за ответ: 4.
Комментарий: Все хорошо, только если б еще все было понятно.. :)

2. [Отвечает: Ершов Денис (статус: 4-ый класс), 06.06.2006, 21:58]:

Здраствуйте, Polyakov Ihor.

Классические модели доступа к БД при удаленном доступе малоэффективны. Зачастую мы этому обязаны слишком узким каналам. Поэтому для этих целей испльзуют многозвенные распределенные приложения или, наиболее часто используемы частный случай, трехзвенные. Любая уважающая себя книга по БД для Delphi должна иметь главу посвященную данной модели доступа. Сами, надеюсь, понимаете материал целой главы в ответ не втиснуть.

Конкретней:

Компоненты Delphi7, обеспечивающие разработку данного приложения, объеденены на закладке DataSnap (для Delphi5 - MIDAS). Примеры использования данных компонентов есть у Delphi в Демо.
В общем архитектура многозвенного приложения выглядит следующим образом:
Сервер БД -- LAN -- ПО промежуточного слоя (Сервер приложения) -- Канал удаленного доступа (Интернет) -- Клиентская часть приложения.

Надеюсь достаточно подробно.

Оценка за ответ: 5.
Комментарий: Спасибо! хоть кто-то тут эксперт :))



Вопрос № 32

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

Уважаемые эксперты! Каким образом можно котроллировать набор текста в любом приложении из программы? Требуется получать набираемый на клавиатуре текст и выполнять его обработку... Например, как делает Punto Switcher? То-есть программе неважно, где мы набираем текст: в Word'е, в Блокноте, в Проводнике или ещё где - нужно перехватывать набор и при этом не подавлять его. Заранее благодарю за ответы.

Вопрос задал участник: Dron
Дата и время отправки вопроса: 03.06.2006, 19:14
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 2-ой класс), 03.06.2006, 19:57]:

Здравствуй, Dron!
Тебе придётся использовать DLL и "хуки".
Загрузив эту длл, (LoadLibrary('X:\Files\Delphi6\Bin\PS.dll');) она будет показывать коды нажатых клавиш.

Приложение:

Оценка за ответ: 4.
Комментарий: В принципе, всё работает, только хотел бы узнать, как передать wParam в само приложение? Например, записать в TMemo...

2. [Отвечает: Вадим К (статус: 6-ой класс), 05.06.2006, 10:34]:

А что же здесь передавать? С символами, здесь всё просто - просто делаете так
char(WParam mod 256).
Для функциональных клавиш используются старшие биты. Думаю теперь уже не будет проблем.
Замечу, что многие антивирусы/фаэрволы могут быть не равнодушными к вашему перехватчику клавиш. Это связано с тем, что этот метод используют многие кейлогеры, которые записывют нажатия ваших клавиш, когда вы вводите пароли и передают своим хозяевам.
Поэтому ваш перехвтчик может не работать или работать неустойчиво. Будьте внимательны.

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



Вопрос № 33

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

Я хочу сделать программу которая бы создавала различные компоненты по щелчку пользователя на форме в определённом месте. Мой вопрос: как сделать чтобы эти компоненты не "накладывались" друг на друга или же меняли свое местоположение после щелчка?

Приложение:

Вопрос задал участник: Александр
Дата и время отправки вопроса: 04.06.2006, 19:47
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: 6-ой класс), 05.06.2006, 11:01]:

У компонента контейнера (тоесть компонента, на который вы ставите свой компонент, обычно форма) есть такое свойство как Controls[index:integer]:TControl. При добавлении вы в цикле просматриваете все компоненты и проверяете их координаты с текущим.



Вопрос № 34

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

Здравствуйте уважаемые эксперты. Подскажите пожалуйста как соеденить свое приложение с базой данных на другом компе (база-Paradox7, сеть-локалка) Заранее спасибо.

Вопрос задал участник: Меркулов А.С.
Дата и время отправки вопроса: 06.06.2006, 00:20
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: Помфюк Владимир Степанович (статус: 5-ый класс), 06.06.2006, 09:48]:

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

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



Вопрос № 35

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

Как можно послать сообщение web-серверу без броузера, при этом изменяя свой ip на заданный?

Вопрос задал участник: Павел Томша
Дата и время отправки вопроса: 06.06.2006, 21:52
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 2-ой класс), 07.06.2006, 10:43]:

Здравствуйте, Павел.

Например с помощью компонента TClientSocket.

Приложение:

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



Вопрос № 36

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

Здравствуйте. У меня ворпос как можно с помощю Deplhi сконвертировать png файл в ico. Может кто-то этим интерисовался. В нете рыскал, пока что не могу найти ничего по этому поводу

Вопрос задал участник: ya
Дата и время отправки вопроса: 07.06.2006, 10:51
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: 6-ой класс), 07.06.2006, 13:13]:

Вариант а) Скачать по адресу http://www.winterdrache.de/freeware/png2ico/ прогу и посмотреть как это сделать.
Вариант б)Вначале конвертируем png -> bmp -> ico
правда бмп-шек будет две сама картинка и маска.
по поводу первого преобразования я не знаю, а по поводу второго
www.delphiworld.narod.ru/base\ico_to_bmp2.html
www.delphiworld.narod.ru/base\ico_to_bmp3.html
www.delphiworld.narod.ru/base\ico_to_bmp4.html




Статьи  >>

Работа с форматом M3U

Автор: bruder

Интро.

Поводом для написания этой статьи послужило то, что я в Интернете не нашёл ни одной подобной статьи, описывающей такой формат. Начнём с назначения m3u файлов. Не для кого, думаю, не секрет, что этот тип файлов используется в WinAmp 'е для (со)хранения «плей листа». В этой статье мы рассмотрим запись и чтение m3u файлов.

Ближе к делу. Теория.

Формат этого файла таков: в начале файла есть служебное слово [#EXTM3U], означающее, что выбранный нами файл действительно m3u. Далее идут строки вида:

#EXTINF:120,Вася барабанщик – Kill My
My Music\Kill_My.mp3

Где [#EXTINF:] служебное слово, [120] – длина трека в секундах, [Вася барабанщик – Kill My ] – тэг, а [ My Music\Kill_My.mp3] – путь к файлу. Причём путь к файлу не полный и зависит от места расположения m3u файла. Пример: m3u файл находится в папке X:\ Music, а муз. файлы в X:\Music\My Music\Kill_My.mp3, тогда путь к файлу в плей листе будет My Music\Kill_My.mp3. А если файл музыки и файл плей листа будут на разных дисках, то путь будет полным. К чему такие сложности я не знаю, ведь можно просто писать полный путь и никаких проблем не будет. И ещё, если переместить файл плей листа, то WinAmp (и др. программы) не смогут воспроизвести файл, так как не найдут путь к нему. (При условии, что путь неполный).

Ближе к делу. Практика.

Казалось бы неполный путь к файлу создаёт нам дополнительные проблемы. Это так. Но я написал функцию, которая восстанавливает этот путь. Итак, рассмотрим на примере, как можно загрузить в ListView данные из m3u файла. На форму помещаем ListView с тремя колонками. 1-я колонка – тэг, 2-я – длина трека, 3-я – путь. И добавим OpenDialog, для открытия файла, и кнопочку.

function NotFullPathToFullPath(FM3U, FM: string): string;
(*Из неполного пути -> полный*)
var
  Ress: string;
begin
  Ress := '';
  Result := '';
(*Если 1-й символ ‘\’, то просто добавляем букву диска*)
  if FM[1] = '\' then
  begin
    Result := ExtractFileDrive(FM3U) + FM;
    exit;
  end else
  begin
(*Путь к m3u + неполный путь к файлу*)
    if FileExists(ExtractFilePath(FM3U) + FM) then
    begin
      Result := ExtractFilePath(FM3U) + FM;
      exit;
    end;
(*А вдруг путь уже полный?*)
    if FileExists(FM) then
    begin
      Result := FM;
      exit;
    end;
  end;
end;

procedure ReadM3U(files: string);
(*Чтение m3u*)
(*Думаю всё и так понятно без комментариев ;)*)
var List: TStringList;
  i, n: integer;
  s, a: string;
  ListItem: TListItem;
begin
(*Очищаем ЛистВив*)
  Form1.ListView1.Clear;
  List := TStringList.Create;
  try
    List.LoadFromFile(files);
    for i := 0 to List.Count - 1 do
    begin
(*Первая строка – «#EXTM3U»? Если да, то это файл m3u*)
      if List.Strings[0] = '#EXTM3U' then
      begin
        s := List.Strings[i];
        if s[1] <> '#' then
        begin
          ListItem.SubItems.Add('');
          s := NotFullPathToFullPath(Files, s);
          ListItem.SubItems[1] := s;
        end else
        begin
          if s <> '#EXTM3U' then
          begin
            Delete(S, 1, 8);
            a := '';
            n := 1;
            repeat
              a := a + s[n];
              Inc(n);
            until s[n] = ',';
            Delete(S, 1, Length(a) + 1);
            ListItem := Form1.ListView1.Items.Add;
            ListItem.Caption := s;
            ListItem.SubItems.Add(Format('%d:%.2d', [StrToInt(a) div 60, StrToInt(a) mod 60]));
          end;
        end;
      end;
    end;
  finally
    List.Free;
  end;
end;

А вызывать будем по кнопке:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    ReadM3U(OpenDialog1.FileName) else exit;
end;

Так. Открытие мы сделали. Можете открыть свой плей лист, сохраненный в WinAmp'е и вглянуть на то, что получилось. Перейдём к сохранению. Положите на форму ещё одну кнопку и в путь. Не забудьте подключить модуль StrUtils.

function ExtNotFullPath(FM3U, FM: string): string;
(*Из полного пути в неполный*)
var
  i: integer;
  Ress: string;
begin
  Ress := '';
  Result := '';
  for i := 1 to Length(FM3U) do
  begin
    if FM3U[i] = FM[i] then
    begin
      Ress := Ress + FM3U[i];
      if FM3U[i] = '\' then Result := Ress;
    end else exit;
  end;
end;

function MinToSec(tim: string): string;
(*Это такой компьютерный юмор, функция из минут в секунды, результат String ;)*)
(*Помнишь мы секунды преобразовывали в минуты? Вот теперь всё наоборот*)
var n: integer;
  a: string;
begin
  n := 1;
  a := '';
  repeat
    a := a + tim[n];
    Inc(n);
  until tim[n] = ':';
  Delete(tim, 1, Length(a) + 1);
  result := IntToStr((StrToInt(a) * 60) + StrToInt(tim));
end;

procedure SaveList(SaveFile: string);
(*Сохранение...*)
var List: TStringList;
  i: integer;
  b, s: string;
begin
  List := TStringList.Create;
  List.Add('#EXTM3U');
  for i := 0 to Form1.ListView1.Items.Count - 1 do
  begin
    s := '';
    List.Add('#EXTINF:' + MinToSec(Form1.ListView1.Items.Item[i].SubItems.Strings[0]) + ',' + Form1.ListView1.Items.Item[i].Caption);
    b := ExtNotFullPath(SaveFile, Form1.ListView1.Items.Item[i].SubItems.Strings[1]);
    if Length(b) < Length(ExtractFilePath(SaveFile)) then
    begin
      s := Form1.ListView1.Items.Item[i].SubItems.Strings[1];
      if b<>`` then //проверка, на одинаковых ли дисках?
        Delete(s, 1, 2);
    end else
      s := AnsiReplaceText(Form1.ListView1.Items.Item[i].SubItems.Strings[1], b, '');
    List.Add(s);
  end;
(*Сохраняем в файл*)
  List.SaveToFile(SaveFile);
  List.Free;
end;

А вот и кнопочка пригодилась :-)

procedure TForm1.Button2Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
  begin
    if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then
      SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u');
  end;
end;

The End.

Исходники к статье можно поднять на сайте http://www.delphi.int.ru. Отзывы слать сюда. По возможности отвечу на все вопросы.

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


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

Название
Описание
Категория
Объём
Ссылки
KeyGen
Программа для генерации устойчивых ключей (по 32 символа).
299 Кб
Simple Chat
Простенький чат с возможностью передачи файлов до 3Mb.
252 Кб
MyPasswords
Программа предназначена для людей, использующих в повседневной жизни много паролей. Программа "Мои пароли" обеспечивает следующие функции: генерация сложного пароля длиной до 128 символов, который может включать набор цифр, знаков английского и русского алфавитов, других символов; ведение таблицы паролей, хранящей список логинов, паролей, программ для паролей, а также кратких пояснений; поиск по логину в таблице паролей, копирование логина или пароля в буфер обмена.
398 Кб
Process Killers
Программа для завершения процессов. Показывает абсолютно всё запущеное на компьютере.
19.3 Кб
Graphics
Простенькая программа для построения и отображения графика заданной функции. Имеется возможность построения как по точкам, так и сплошной линией. Также можно выбрать шаг координатной сетки.
28.4 Кб
M3U
Исходники к статье по работе с форматом M3U.
2.16 Кб

Screenshots
KeyGen Screenshot
KeyGen
MyPasswords Screenshot
Simple Chat Screenshot
MyPasswords
Simple Chat

Ссылки  >>

Здесь представлены ссылки на дружественные сайты. Обмен ссылками и баннерами приветствуется для сайтов схожей тематики. Здесь представлены самые последние ссылки:

All for Delphi - Научись правильно писать программы! Программы, компоненты, книги, ссылки.
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
Программирование на Delphi
   
 

Юмор.

Буря в пустыне-2 или WinWars (часть 1)
Ведущий раздела: Bruder.

Компания "Microsoft" подписала контракт с американскими военными на разработку программного обеспечения для новых видов вооружений.

01.04.2002, 4:30. Саудовская Аравия. База ВВС США.

Лейтенант Джон Фолкон в последний раз махнул рукой товарищам и полез в кабину.
Его переполняло чувство гордости. Еще бы, ему доверена такая честь! Он узнал об этом от генерала Брейка, который сказал: "Вам доверена большая честь, лейтенант. Вы совершите первый боевой вылет на новейшем сверхсекретном самолете F-22M." ""M" означает "модифицированный"?" - уточнил Фолкон. ""M" означает "Microsoft", - ответил генерал. -Самолет полностью переоборудован этими ребятами. Они уверяют, что теперь боевые задачи сможет выполнять любой идиот. Но мы для первого раза выбрали вас, как одного из лучших наших пилотов. Вы должны будете уничтожить иракский ядерный центр." "Можете слать соболезнования Саддаму уже сейчас, сэр", - ответил Фолкон.
Лейтенант привычно защелкнул ремни и лишь тут обратил внимание, что приборная панель заметно отличается от стандартной. Приборов стало меньше, зато на освободившемся месте покоилась двухкнопочная мышь, почему-то металлическая.
Фолкон пожал плечами и включил общее питание.
На прозрачном лобовом экране, на фоне открывавшегося из кабины неба с редкими облаками, возникла надпись: Microsoft Winwars 2002. Затем сами собой заработали двигатели, и опустились во взлетное положение закрылки. "Поздравляем вас с приобретением Winwars 2002! - сообщил экран. -Теперь война станет намного более удобной, ваша убиваемость снизится, а поражаемость целей возрастет! Совет дня: перед посадкой выпускайте шасси."
-Орел-1, взлет разрешен, - раздалось в шлемофоне.
-Я еще не запрашивал, - удивился Фолкон.
-А вам и не нужно. Plug"n"Play, - пояснил наземный контроль.

Самолет, стремительно набирая скорость, помчался по полосе и скоро был уже в воздухе. "Сейчас Winwars 2002 произведет инсталляцию вашего боезапаса на выбранную цель, - сообщила система. -Выбранная цель: иракский ядерный центр".
Фолкон ради интереса кликнул по кнопке "изменить" и увидел длинный список, в котором среди прочих объектов по всему миру фигурировали Белый дом и база, с которой он только что вылетел. Фолкон поспешно нажал "отмена".
"Выберите тип инсталляции:
Минимальный - на объект будут сброшены только бомбы
Нормальный - на объект будут сброшены бомбы и ракеты
Полный - на объект будет сброшен самолет целиком"
По умолчанию система предлагала второй вариант, и Фолкон, опасливо покосившись на третий, решил с ней не спорить.
"Сейчас будет проведено тестирование производительности вашей машины. Закройте глаза, чтобы избежать повреждений при смене режимов".
Взревели на форсаже двигатели, и глаза Фолкона действительно едва не выскочили из орбит от чудовищной перегрузки. Начался настоящий ад: самолет швыряло во все стороны, он срывался в крутые пике и закладывал немыслимые виражи... Наконец лейтенант пришел в себя; темнота перед глазами развеялась, и он увидел, как мотавшаяся по всей кабине мышка вновь упала на свое место.
"Вы пользуетесь самолетом Lockheed F-22 с двумя двигателями Пратта-Уитни, -
невозмутимо сообщила система. -Максимальная скорость 1451 миля в час. Совет дня: не повышайте тактовую частоту турбины выше значения, указанного производителем.
Расчетное время инсталляции - 0:34:16."

:))

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

В избранное