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

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 406
от 07.03.2006, 13:33

Администратор:Калашников О.А.
В рассылке:Подписчиков: 259, Экспертов: 65
В номере:Вопросов: 8, Ответов: 19


Вопрос № 36471: В функции ргб одна из трех состовляющих цвета задается от 0 до 255. А нельзя получить еще более мелкое деление (т. е. чтоб получить значение, которое между целыми единицами)??? ...
Вопрос № 36480: Здравствуйте, господа эксперты! Вопрос такой: на форме размещены SpeedButton с Flat=True, а под ней Image; нужно бы, чтобы при наведении на кнопку она вроде как мигала. Собственно, необходимо чтобы Image под ней менялся и насколько я понял это мо...
Вопрос № 36492: Есть в Delphi функция, обменивающая 2 переменные (integer) значениями? Вроде попадалась мне где-то... Аналог ассемблерного XCHG. Мне надо обменять X и Y без промежуточной переменной, без использования ассемблерной вставки. Сэнкс....
Вопрос № 36503: Здравствуйте эксперты!! У меня опять к вам вопрос!! Подскажите: как осуществить поиск любого файла на ВСЁМ компьютере??...
Вопрос № 36533: <i>Среда C++Builder / Delphi</i> Есть *.doc документ. В нем содержится детализация разговоров. Документ судя по всему сгенерирован биллинговой системой оператора. В документе содержится много страниц, каждая из которых представляет рисуно...
Вопрос № 36537: Требуется определять, есть ли в CD ROM диск или нет. Из того, что я нашёл в Инете, нет правильно работающего с чистыми болванками - не определяются они....
Вопрос № 36538: Здраствуйте. Как програмно перевести фокус или выделить ячейку StringGrid'a? Спасибо....
Вопрос № 36544: Здравствуйте! Первый вопрос, возможно ли создание сайтов посредством среды дельфи? Если возможно то как? Приветствуется всё, ссылки, советы отправка материалов на мой э.п.я. rdo04@bk.ru. Второй вопрос: мой товарищ попросил меня напи...

Вопрос № 36.471
В функции ргб одна из трех состовляющих цвета задается от 0 до 255. А нельзя получить еще более мелкое деление (т. е. чтоб получить значение, которое между целыми единицами)???
Отправлен: 01.03.2006, 13:30
Вопрос задал: ququ1 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: sir henry
Здравствуйте, ququ1!
Вопрос довольно странный. Давайте рассмотрим параметры этой функции:
function RGB(r, g, b: Byte): COLORREF;
Как видите все они типа Byte, который является ЦЕЛЫМ типом.
Может быть Вы что-то другое имели в виду? Тогда поясните...
Ответ отправил: sir henry (статус: Академик)
Отправлен: 01.03.2006, 13:36

Отвечает: Ataman N. N.
Здравствуйте, ququ1!
А как Вы представляете себе, например, красную составляющую 1.5, это то же, что говорить о 1.5 человеках.
Ответ отправил: Ataman N. N. (статус: 8-ой класс)
Отправлен: 01.03.2006, 15:41

Отвечает: Ерёмин Андрей
Здравствуйте, ququ1!
Ваш вопрос противоречит здравому смыслу. RGB - это цвет из трёх составляющих: красного, зелёного и синего. Каждое значение - от 0 до 255, что создаёт всевозможную палитру цветов, состоящую из 16581375 цветов (16+ миллиардов). Как здесь может быть дробное значение цвета? Также посмотрите описание функций RGB(), GetRValue(), GetGValue() и GetBValue() в справке.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 01.03.2006, 16:03

Отвечает: Полховский Александр Владимирович
Здравствуйте, ququ1!
Эксперт sir henry точно подметил. Но даже если тип был бы не целочисленным, не видел я ещё поддержки более, чем 32 битов цвета. По 8 бит на канал и 8 на яркость (если я ничего не напутал). А 8 бит - 256 значений. Так что нет.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 01.03.2006, 16:07


Вопрос № 36.480
Здравствуйте, господа эксперты!
Вопрос такой: на форме размещены SpeedButton с Flat=True, а под ней Image; нужно бы, чтобы при наведении на кнопку она вроде как мигала. Собственно, необходимо чтобы Image под ней менялся и насколько я понял это можно сделать, используя Timer и ImageList. Но вот что-то никак сие чудо не получается реализовать, не пойму как использовать ImageList. Может, кто подскажет или поделится какими-нибудь другими подобными способами.
И ещё. Как в программе с MediaPlayer’ом можно организовать регулировку громкости, баланса? Подскажите где вообще можно подробно узнать о компоненте TMediaPlayer?
Отправлен: 01.03.2006, 15:03
Вопрос задал: UnRe@l (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Полховский Александр Владимирович
Здравствуйте, UnRe@l!
Ну в событии OnMouseMove у кнопки написать
if not(Timer1.Enabled)
then Timer1.Enabled:=true;

А в событии OnTimer

imagelist1.Draw(Image1.Canvas, 0, 0, ImIndex1);
inc(ImIndex1);
ImIndex1:=(ImIndex1)mod(2);

Затем сравнить координаты мыши с координатами кнопки и, если мышь ушла, выключить Timer, прорисовав тем же макаром изображение по умолчанию.
ImIndex1 - глобальная переменная, в которой будет храниться нарисованное изображение. (номер имеется в виду)
2 - количество изображений в ImageList'e.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 01.03.2006, 16:07
Оценка за ответ: 5

Отвечает: Leshiy2006
Здравствуйте, UnRe@l!
По поводу реглировки звука посмотрите статью на http://delphiworld.narod.ru/_multimedia_.html
По Вашему первому вопросу: в событие OnMouseMove включаете таймер, а в Timer'е пишете
if i< n<n-число картинок>then begin
image1.picture.loadfromfile(IntToStr(i)+'bmp');
end
else i:=1;
Удачи!
Ответ отправил: Leshiy2006 (статус: 3-ий класс)
Отправлен: 01.03.2006, 23:21
Оценка за ответ: 5


Вопрос № 36.492
Есть в Delphi функция, обменивающая 2 переменные (integer) значениями? Вроде попадалась мне где-то... Аналог ассемблерного XCHG. Мне надо обменять X и Y без промежуточной переменной, без использования ассемблерной вставки. Сэнкс.
Отправлен: 01.03.2006, 17:24
Вопрос задал: Злоумышленник (статус: 3-ий класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ерёмин Андрей
Здравствуйте, Злоумышленник!
Эту задачу очень любят давать во всяких олимпиадах и конкурсах по программированию :-) Предлагаю своё решение:
X:=Y-X;
Y:=Y-X;
X:=Y+X;
В три хода :-)
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 01.03.2006, 17:32
Оценка за ответ: 5
Комментарий оценки:
Попробую. Однако...

Отвечает: Ataman N. N.
Здравствуйте, Злоумышленник!
Что-то не слыхал я о такой функции в Delphi. Прийдеться Вам все-таки делать ассемблерную вставку.
Ответ отправил: Ataman N. N. (статус: 8-ой класс)
Отправлен: 01.03.2006, 17:49
Оценка за ответ: 4
Комментарий оценки:
Ответ слабоватый

Отвечает: Полховский Александр Владимирович
Здравствуйте, Злоумышленник!
Ещё с оператором XOR можно тоже в 3 действия:
X:=(X)xor(Y);
Y:=(X)xor(Y);
X:=(X)xor(Y);
Не знаю, что быстрее, попробуйте цикл из 2-3 млн. таких манипуляций, и сравните время. Будет видно :)
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 01.03.2006, 18:21
Оценка за ответ: 5


Вопрос № 36.503
Здравствуйте эксперты!!
У меня опять к вам вопрос!!
Подскажите: как осуществить поиск любого файла на ВСЁМ компьютере??
Отправлен: 01.03.2006, 20:48
Вопрос задал: F Ruslan R (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лучников Юрий Владимирович
Здравствуйте, F Ruslan R!

Код функции поиска приведен в приложении...
Чтобы произвести поиск по ВСЕМУ компьютеру, вам нужно будет вызвать эту ф-ю для каждого диска, установленного в системе:
ScanDir('C:', '*.exe'); // поиск всех файлов с раширением exe на диске С.
ScanDir('D:', '*.exe'); // --=--
...

Список нужных дисков можно узнать функцией GetDriveType(RootPath: PAnsiChar).
Она возвращает тип носителя (removable, fixed, CD-ROM, RAM disk, or network drive), адрес которого указан в RootPath.
То есть вызываете эту функцию в цикле для букв A..Z и анализируете возвращаемый ею результат.

Результат функции может иметь вид:
Результат Означает
0 Тип носителя не может быть определен.
1 Носитель по данному адресу не существует.
DRIVE_REMOVABLE Сменный носитель.
DRIVE_FIXED НЕ сменный носитель.
DRIVE_REMOTE Удаленный носитель (сетевой).
DRIVE_CDROM Носитель является CD-ROM приводом.
DRIVE_RAMDISK Носитель является RAM диском.

Подробное описание функции вы моете найти в WinSDK.

Успехов!

Приложение:

Ответ отправил: Лучников Юрий Владимирович (статус: Студент)
Отправлен: 01.03.2006, 22:50
Оценка за ответ: 5
Комментарий оценки:
Спасибо!!!

Отвечает: Злоумышленник
Здравствуйте, F Ruslan R!
Для этой цели могут использоваться процедуры FindFirst, FindNext, FindClose, при участии переменной типа TSearchRec которая хранит информацию о текущем статусе поиска и характеристики последнего найденного файла.

Пример иллюстрирующий поиск всех файлов и каталогов в определенном каталоге:

Var SearchRec:TSearchRec;
...
If FindFirst('c:Windows*.*', faAnyFile, SearchRec)=0 then
repeat


{Вот здесь мы можем делать с найденным файлом что угодно

SearchRec.name - имя файла

ExpandFileName(SearchRec.name) - имя файла с полным путем}


until FindNext(SearchRec) <> 0;


FindClose(SearchRec);

Примечания по приведенному коду:
1) Первыми в список могут попадать файлы с именами "." и ".." - это ДОСовские имена для переходов на "родительский уровень", иногда нужна обработка для их игнорирования.
2) FindFirst в качестве первого параметра принимает шаблон для поиска, так как он был принят для ДОС. Если шаблон не включает путь то файлы будут искаться в текущем каталоге.
3) FindFirst требует задания атрибута для файла - здесь мы искали все файлы, если надо какие-то определенные (например только скрытые, или только каталоги) то надо это указать, список всех атрибутов я уже приводил выше.
4) SearchRec переменная связывает во едино FindFirst и FindNext, но требует ресурсов для своей работы, поэтому желательно ее освободить после поиска процедурой FindClose(SearchRec) - на самом деле утечки памяти небольшие, но если программа работает в цикле и долгое время пожирание ресурсов будет значительным.
5)FindFirst/FindNext - работают не открывая файлы, поэтому они корректно находят даже Swap файлы Windows...

Поиск файлов по дереву каталогов с заходом в подкаталоги разобран в приложении

Приложение:

---------
Почему нет встроенного языка 1С на мордовском? Было бы клёво!

Ответ отправил: Злоумышленник (статус: 3-ий класс)
Отправлен: 02.03.2006, 05:00

Отвечает: sir henry
Здравствуйте, F Ruslan R!
Я Вам подскажу только принцип поиска по всему компьютеру, а уж код Вы пишите сами. :)
1) Необходимо составить список лгических дисков компьютера:
GetLogicalDriveStrings(nBufferLength: DWORD, lpBuffer: PChar);
Заносит в lpBuffer список дисков системы.
2) Составить список каталогов на диске. Сделать это можно с помощью FindFirst()+FindNext(), проверяя результат на наличие в аттрибуте faDirectory.
Для этого дела хорошо подойдет класс TStringList.
3) Далее проверять каждый каталог из списка. Если там нет вложеных подкаталогов - искать файл, если есть - повторение пункта 2.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 02.03.2006, 07:37

Отвечает: Полховский Александр Владимирович
Здравствуйте, F Ruslan R!
Возможно, я не правильно что-то написал с первым примером, но эта функция не ищет в подпапках, ну по крайней мере результат из подпапок не выдаёт.
Ну это ладно. Расскажу лучше о принципе (ещё раз. более (для меня) понятно).
Последовательность такова:
сама функция поиска ищет файлы и папки ТОЛЬКО в 1 директории, но если она наткнулась на папку, то вызывает сама себя для поиска уже в этой самой папке (рекурсивный вызов). Перебирание содержимого папки осуществляется функциями FindFirst, FindNext до тех пор, пока FindNext не выдаст результат, неравный 0. Затем вызывается процедура FindClose("закрывает" поиск). Про игнорирование '.' и '..' Вам уже сказали. Ещё добавлю, что лучше создать глобальную переменную (то есть вне функции поиска) для сбора результатов, либо прописать её в качестве параметра к функции (только не забудьте var). Вызывать процедуру поиска стоит в цикле от А до Z с проверкой наличия данного привода (либо других условий).
Ну вот и всё, собственно. Надеюсь, хоть что-то понятно.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 02.03.2006, 09:39
Оценка за ответ: 4


Вопрос № 36.533
Среда C++Builder / Delphi
Есть *.doc документ. В нем содержится детализация разговоров.
Документ судя по всему сгенерирован биллинговой системой оператора.
В документе содержится много страниц, каждая из которых представляет рисунок. Открыв документ и кликнув по рисунку правой кнопкой мыши можно выбрать пункт "Изменить рисунок". Таким образом рисунок далее можно разгруппировать. Получится большой набор элементов "Надпись".
Дак вот - каким образом можно из своего приложения в автоматическом режиме проделать все вышеописанные действия на каждую страницу, а далее выделить тематические элементы столбцов (номера телефонов, длительность звонков и т.д.)? Задача - анализ данных из детальки.

Ссылка на пример страницы из детализации счета находится в приложении.

Благодарность тем, кто оставил без внимания вопрос;)

Приложение:

Отправлен: 02.03.2006, 06:05
Вопрос задал: Лучников Юрий Владимирович (статус: Студент)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Лучников Юрий Владимирович!

1) Великая глупость была формировать такой документ в таком формате Автоматически его разобрать по косточкам не удастся - картинки могут быть в разном порядке.

2) Вариант:
Преобразовать в графический формат, разпознать FineReader и созранить в Excel - после чего можно делать все что хочешь.
Для преобразования можно использовать программу FinePrint pdfFactory Pro, она чисто переведет в PDF, а из него сохранить как jpeg (TIFF который дает Acrobat не принимается FineReader)
Ответ отправил: Архангельский Андрей Германович (статус: Практикант)
Отправлен: 02.03.2006, 12:08
Оценка за ответ: 5
Комментарий оценки:
1) Тут да, но биллинг не изменишь;) Как уж есть;)

2) Слишком много ручной работы. В этом и состоит проблема - автоматизировать этот процесс. Уже всю голову сломал над вопросом.
Но все равно спасибо;)


Вопрос № 36.537
Требуется определять, есть ли в CD ROM диск или нет. Из того, что я нашёл в Инете, нет правильно работающего с чистыми болванками - не определяются они.
Отправлен: 02.03.2006, 07:54
Вопрос задал: Злоумышленник (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Лучников Юрий Владимирович
Здравствуйте, Злоумышленник!

Все верно. Ваши методы определяют, вставлен ли физически носитель. Причем неважно - пустой он или нет.
А если вам нужно проверять условие, вставлен ли непустой CD, то можно сделать дополнительную проверку по файловой системе вставленного компакта.
Записанный CD может иметь файловую систему CDFS, UDF. Файловая система пустой болванки определяется как правило как RAW.

Узнать файловую систему носителя можно API функцией GetVolumeInformation().

Успехов!
Ответ отправил: Лучников Юрий Владимирович (статус: Студент)
Отправлен: 02.03.2006, 23:37
Оценка за ответ: 4
Комментарий оценки:
Требовалось узнать, есть ли хоть какой-нибудь диск в CD ROM, неважно, записанный или чистый


Вопрос № 36.538
Здраствуйте.
Как програмно перевести фокус или выделить ячейку StringGrid'a?
Спасибо.
Отправлен: 02.03.2006, 07:56
Вопрос задал: Yarking (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Yarking!
Выделять ячейки StringGrid очень легко. При этом, можно выделять как одну ячейку, так и диапазон ячеек. Вот пример:

procedure TForm1.Button1Click(Sender: TObject);
var
myRect: TGridRect;
begin
myRect.Left := 3;
myRect.Top := 1;
myRect.Right := 2;
myRect.Bottom := 4;
stringgrid1.Selection := myRect;
end;


---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессионал)
Отправлен: 02.03.2006, 08:00
Оценка за ответ: 5
Комментарий оценки:
а с Focuse' ом как?

Отвечает: Полищук Владислав Игоревич
Здравствуйте, Yarking!
StringGrid'а есть свойство Selection благодаря которому можно осуществить то что Вам нужно
Например
var
S:TGridRect;
begin
S.Left:=3;
S.Top:=3;
S.Right:=3;
S.Bottom:=3;
StringGrid1.Selection:=s;

P.S. StringGrid1.Selection.Left:=3; - не пройходит
---------
Чтобы вчера не случилось, радуйся новому дню
Ответ отправил: Полищук Владислав Игоревич (статус: 2-ой класс)
Отправлен: 02.03.2006, 10:57
Оценка за ответ: 5

Отвечает: Diman_A
Здравствуйте, Yarking!
Код, выделяющий ячейку [3,3]:
form1.StringGrid1.Row:=3;
form1.StringGrid1.Col:=3;
form1.StringGrid1.SetFocus;
Вообще, у любого компонента есть св-во setfocus. Его и используйте.
Ответ отправил: Diman_A (статус: 6-ой класс)
Отправлен: 02.03.2006, 15:57
Оценка за ответ: 5


Вопрос № 36.544
Здравствуйте!
Первый вопрос, возможно ли создание сайтов посредством среды дельфи? Если возможно то как? Приветствуется всё, ссылки, советы отправка материалов на мой э.п.я. rdo04@bk.ru.

Второй вопрос:
мой товарищ попросил меня написать программу для проверки работы усилителей посредством дельфи(но можно и на другом языке). Т.е. подаём сигнал на вход звуковой платы и при помощи этой программы смотрим все характеристики сигнала. Я думаю должны быть какие-нибудь компоненты для работы со звуком, но какие, вот в чём вопрос?
Отправлен: 02.03.2006, 09:14
Вопрос задал: KuchumHan (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, KuchumHan!

Если ты в совершенстве владеещь HTML, и более менее сносно владеешь Delphi, то без проблем можно создавать сайты в Delphi. Только мо поему ты ищешь "волшебную палочку". Один из моих сайтов формируется из БД с помошью программки, написанной на Delphi за 1 час.

2) специфические компоненты ищи на www.torry.ru, но не все они бесплатные, за некоторые придеться заплатить. Но это самая большая библиотека компонентов
Ответ отправил: Архангельский Андрей Германович (статус: Практикант)
Отправлен: 02.03.2006, 11:38
Оценка за ответ: 4
Комментарий оценки:
Хотелось бы что-нибудь по конкретней, а не "может быть" или "если", "ищи сам" и тому подобное.
P.S. Этот торинет уже все знают. Да не всё там есть, что надо :-)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.17 (beta) от 06.03.2006
Яндекс Rambler's Top100

В избранное