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

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


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

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

Выпуск № 740
от 18.02.2007, 13:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 441, Экспертов: 78
В номере:Вопросов: 7, Ответов: 12


Вопрос № 75381: Подскажите как прикрутить TrackBar к MediaPlayer соттветственно чтоб и трекбар показывал продвижение и передвигая движок бара можно было курсировать по воспроизводимому файлу? Делаю код в приложении - при воспроизведении рывки - оно и понятно fps и з...
Вопрос № 75471: Доброго времени суток уважаемые эксперты ! у меня такой вопрос как перекинуть в Word значения имеющиеся в DBGrid вместе с названием колонки если можно ответ по подробней потомучто этого неразу неделал и неполучалось когда пробовал....
Вопрос № 75475: Уважаемые эксперты, нужна ваша помощь. Необходимо написать программу расчета максимальной глубины бинарного дерева. Дерево должно состоять из 15 и более узов. Уже неделю копаюсь, не могу ничего понять. Какие будут соображения? За...
Вопрос № 75488: Уважаемые эксперты!!! Как получить список программ, установленных на другой машине?...
Вопрос № 75497: Привет! Пишу ваш код и по истечению врени 6 секунд ничего не, а в StatusBar пишет Connect timed out!что делать делать, помогите Вот код...
Вопрос № 75508: Сздавствуйте проффессионалы! Очень нужна помощь. Нужно переделать простенькие процедуры и кусок программы из "С" в Delphi. У меня с этим проблема, т.к. почти не знаю C! 1. for (i = 0; i < strlen(cryptPw); i++) deskey[i%1...
Вопрос № 75509: Добрый день, уважаемые эксперты! Вопрос мой не по программированию, но все же касающийся Delphi. У нас есть один большой проэкт и необходимо чтобы два человека одновременно с ним работали. Сейчас решили эту проблему таким образом: я соз...

Вопрос № 75.381
Подскажите как прикрутить TrackBar к MediaPlayer соттветственно чтоб и трекбар показывал продвижение и передвигая движок бара можно было курсировать по воспроизводимому файлу? Делаю код в приложении - при воспроизведении рывки - оно и понятно fps и значение таймера разные вещи, мож у pleera есть какое - то событие - при переходе к след кадру? Подскажите хотя-б для известных значений fps видео.

Приложение:

Отправлен: 12.02.2007, 14:59
Вопрос задал: Sync (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Ерёмин Андрей
Здравствуйте, Sync!
На самом деле никаких описанных Вами проблем и уж тем более рывков нет. Просто нужно установить для таймера такой интервал времени, чтобы он срабатывал не медленнее, чем обновляются кадры. Дело в том, что интервал вызова события OnTimer (Interval) задаётся в миллисекундах (1 сек = 1000 мс). В этом и заключается Ваша ошибка. Ваш код абсолютно верен и будет прекрасно работать. Установите для таймера Interval = 10. Это среднее время и ползунок будет двигаться плавно. Если ставить большие интервалы (вроде 500 мс = 0.5 сек), то рывки естественно появятся - пока таймер отсчитает столько времени, сменится несколько десятков кадров. Однако это не всё. Даже при таком подходе есть небольшой подводный камень. Не стоит забывать о количестве делений, т.е. числу возможных позиций ползунка. Если у ползунка будет всего 10 позиций, то таймер ничем ситуацию не спасёт. А посему перед воспроизведением нужно установить для TTrackBar свойство Max в количество кадров текущего открытого файла. Делае тся это так:
TrackBar.Max:=MediaPlayer.Length;

Свойство Length у TMediaPlayer отвечает за количество кадров в файле. А свойство Position - соответственно номер текущего кадра.
Всё остальное в Вашем коде написано верно. Под словом "кадр" здесь условно понимается кадр из видео-файлов, но и с аудио-файлами всё будет работать.
Желаю удачи!
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Всё для программиста. Файловый архив, статьи, помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 13.02.2007, 20:03
Оценка за ответ: 3
Комментарий оценки:
Я знаю что интервалы отчитываются в миллисекундах. Но ведь и при 10 и при 1 в интервале таймера - рывки. Наверное, я чего -то не догоняю все равно, или мои авишки с частотой кадров 200 кГц - нестандартны.


Вопрос № 75.471
Доброго времени суток уважаемые эксперты !
у меня такой вопрос
как перекинуть в Word значения имеющиеся в DBGrid вместе с названием колонки
если можно ответ по подробней потомучто этого неразу неделал и
неполучалось когда пробовал.
Отправлен: 13.02.2007, 03:55
Вопрос задал: Fins (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Fins!
Есть такой компонент EkRTF, он позволяет "выплюнуть" данные в заранее подготовленный в Word шаблон.
Оказался очень удобным.

---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 13.02.2007, 09:13


Вопрос № 75.475
Уважаемые эксперты, нужна ваша помощь.
Необходимо написать программу расчета максимальной глубины бинарного дерева. Дерево должно состоять из 15 и более узов.
Уже неделю копаюсь, не могу ничего понять.

Какие будут соображения?
Заранее благодарен!
Отправлен: 13.02.2007, 05:36
Вопрос задал: Попов Евгений (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Базанов Иван Александрович
Здравствуйте, Попов Евгений!
Алгоритм может быть такой:
Предположим что узел дерева описывается так:
PTreeItem=^TTreeItem;
TTreeItem=record
Data :pointer;
Left, Right : PTreeItem
end;

Функция вычисления высоты (она же максималиная глубина) дерева:
function MaxDeep(pItem : PTreeItem):Integer;
begin
Result := 0;
if pItem=nil then
Exit
else
Result := Max(MaxDeep(pItem^.Left), MaxDeep(pItem^.Right));
end;

Вот собственно и все. Просто рекурсивный вызов функции измерения высоты для поддеревьев и взятие максимума от высот слева и справа.


---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 4-ый класс)
Ответ отправлен: 13.02.2007, 09:14

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Попов Евгений!
Базанов Иван Александрович, конечно, в правильном направлении пошел, но я что-то не вижу, в каких случаях функция вернет отличное от нуля значение.
Исправленная функция:

function MaxDeep(pItem: PTreeItem; depth: integer):Integer;
begin
if pItem=nil then begin
Result := depth; // экономим немного машинного времени.
Exit
end else
Result := Max(MaxDeep(pItem^.Left, depth+1), MaxDeep(pItem^.Right, depth+1));
end;

При вызове функции надо в качестве первого параметра передать вершину дерева, а в качестве второго — нуль.
---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 13.02.2007, 16:50


Вопрос № 75.488
Уважаемые эксперты!!!

Как получить список программ, установленных на другой машине?
Отправлен: 13.02.2007, 08:15
Вопрос задал: Osa87 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Osa87!
Для этого Вам нужно удаленно подключится к реестру той машины. Класс TRegistry это позволяет:
Registry.RegistryConnect("\Имя_компьютера");
Перед этим необходимо указать главный ключ:
Registry.RootKey:=HKEY_LOCAL_MACHINE;
После этого открываете ключ:
SOFTWAREMicrosoftWindowsCurrentVersionUninstall
и после этого начинается самое интересное. :) Перебираете все подключи и если в них находится непустое значение DisplayName, то это именно та программа, которая сидит в списке "Панель управление - Установка и удаление программ".
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 13.02.2007, 09:53
Оценка за ответ: 5
Комментарий оценки:
Спасибо за оперативный ответ, попробую!

Отвечает: Gladiator
Здравствуйте, Osa87!
А ещё существует WMI-технология (2K, XP), где имеется класс Win32_Product.

Например, так:

uses ..., Variants, OleServer, WbemScripting_TLB, ActiveX;

var
WbemLocator: TSWbemLocator;
WbemService: ISWbemServices;
WbemObject: ISWbemObject;
WbemObjectSet: ISWbemObjectSet;
WbemPropertySet: ISWbemPropertySet;
WbemProperty: ISWbemProperty;
Usr: string = '';
Psw: string = 'Administrator';

procedure GetProductNames;
var
PropEnum, Enum: IEnumVariant;
TempObj: OleVariant;
Value: Cardinal;
begin
WbemLocator:=TSWbemLocator.Create(Self);
WbemService:= WbemLocator.ConnectServer(nmMashine, 'rootcimv2', Usr, Psw, '', '', 0 , nil);
WbemObjectSet := WbemService.ExecQuery ('Select * Win32_Product','WQL', wbemFlagReturnImmediately, nil );
Enum:= (WbemObjectSet._NewEnum) as IEnumVariant;
while (Enum.Next(1, TempObj, Value) = S_OK) do
begin
WbemObject:= IUnknown(TempObj) as SWBemObject;
WbemPropertySet:= WbemObject.Properties_;
PropEnum:= (WbemPropertySet._NewEnum) as IEnumVariant;
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
WbemProperty:= IUnknown(TempObj) as SWBemProperty;
if WbemProperty.Name = 'Name' then Memo1.Lines.Add(WbemProperty.Value);
end;
PropEnum:=nil;
WbemProperty:=nil;
WbemPropertySet:=nil;
end;
WbemObjectSet:=nil;
WbemObject:=nil;
WbemService:=nil;
WbemLocator.Free;
end;

Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 13.02.2007, 13:37
Оценка за ответ: 5
Комментарий оценки:
Спасибо за оперативный ответ!


Вопрос № 75.497
Привет! Пишу ваш код и по истечению врени 6 секунд ничего не, а в StatusBar пишет Connect timed out!что делать делать, помогите
Вот код

Приложение:

Отправлен: 13.02.2007, 09:36
Вопрос задал: Павлов Сергей Сергеевич (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gladiator
Здравствуйте, Павлов Сергей Сергеевич!
Не знаю, имеется ли у вас какой-нибудь почтовый клиент, где можно взять данные для своей программы. Host'ом, к примеру, может быть ip-адрес почтового сервера (если он в локальной сети "172.21.2.241") или DNS-имя ( если в интернете "mail.onego.ru"). Имя пользователя и пароль - их вы должны знать назубок. Если вы все данные верно ввели и почтовый сервер реально существует, то всё должно работать, так как у меня это работает и в локальной сети и по диалапу.
А если ваш сервер тупит, то можно увеличить таймаут.
Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 13.02.2007, 13:00
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое! Очень помогло!!!


Вопрос № 75.508
Сздавствуйте проффессионалы!
Очень нужна помощь. Нужно переделать простенькие процедуры и кусок программы из "С" в Delphi.
У меня с этим проблема, т.к. почти не знаю C!

1. for (i = 0; i < strlen(cryptPw); i++) deskey[i%14] ^= cryptPw[i];

2.
typedef enum
{
COMMTYPE_CLIENT,
COMMTYPE_SERVER
} comm_type_t;

typedef struct customData_struct
{
uint16 sid;
} customData_t;

void des_key_parity_adjust(uint8 *key, uint8 len)
{
uint8 i, j, parity;

for (i = 0; i < len; i++)
{
parity = 1;
for (j = 1; j < 8; j++) if ((key[i] >> j) & 0x1) parity = ~parity & 0x01;
key[i] |= parity;
}
}

uint8 *des_key_spread(uint8 *normal)
{
static uint8 spread[16];

spread[ 0] = normal[ 0] & 0xfe;
spread[ 1] = ((normal[ 0] << 7) | (normal[ 1] >> 1)) & 0xfe;
spread[ 2] = ((normal[ 1] << 6) | (normal[ 2] >> 2)) & 0xfe;
spread[ 3] = ((normal[ 2] << 5) | (normal[ 3] >> 3)) & 0xfe;
spread[ 4] = ((normal[ 3] << 4) | (normal[ 4] >> 4)) & 0xfe;
spread[ 5] = ((normal[ 4] << 3) | (normal[ 5] >> 5)) & 0xfe;
spread[ 6] = ((normal[ 5] << 2) | (normal[ 6] >> 6)) & 0xfe;
spread[ 7] = normal[ 6] << 1;
spread[ 8] = normal[ 7] & 0xfe;
spread[ 9] = ((normal[ 7] << 7) | (normal[ 8] >> 1)) & 0xfe;
spread[10] = ((normal[ 8] << 6) | (normal[ 9] >> 2)) & 0xfe;
spread[11] = ((normal[ 9] << 5) | (normal[10] >> 3)) & 0xfe;
spread[12] = ((normal[10] << 4) | (normal[11] >> 4)) & 0xfe;
spread[13] = ((normal[11] << 3) | (normal[12] >> 5)) & 0xfe;
spread[14] = ((normal[12] << 2) | (normal[13] >> 6)) & 0xfe;
spread[15] = normal[13] << 1;

des_key_parity_adjust(spread, 16);
return spread;
}

void des_random_get(uint8 *buffer, uint8 len)
{
uint8 idx = 0;
int randomNo = 0;

for (idx = 0; idx < len; idx++)
{
if (!(idx % 3)) randomNo = rand();
buffer[idx] = (randomNo >> ((idx % 3) << 3)) & 0xff;
}
}
int des_encrypt(uint8 *buffer, int len, uint8 *deskey)
{
uint8 checksum = 0;
uint8 noPadBytes;
uint8 padBytes[7];
char ivec[8];
uint16 i;

if (!deskey) return len;
noPadBytes = (8 - ((len - 1) % 8)) % 8;
if (len + noPadBytes + 1 >= CWS_NETMSGSIZE-8) return -1;
des_random_get(padBytes, noPadBytes);
for (i = 0; i < noPadBytes; i++) buffer[len++] = padBytes[i];
for (i = 2; i < len; i++) checksum ^= buffer[i];
buffer[len++] = checksum;
des_random_get((uint8 *)ivec, 8);
memcpy(buffer+len, ivec, 8);
for (i = 2; i < len; i += 8)
{
cbc_crypt(deskey , (char *) buffer+i, 8, DES_ENCRYPT, ivec);
ecb_crypt(deskey+8, (char *) buffer+i, 8, DES_DECRYPT);
ecb_crypt(deskey , (char *) buffer+i, 8, DES_ENCRYPT);
memcpy(ivec, buffer+i, 8);
}
len += 8;
return len;
}

int des_decrypt(uint8 *buffer, int len, uint8 *deskey)
{
char ivec[8];
char nextIvec[8];
int i;
uint8 checksum = 0;

if (!deskey) return len;
if ((len-2) % 8 || (len-2) < 16) return -1;
len -= 8;
memcpy(nextIvec, buffer+len, 8);
for (i = 2; i < len; i += 8)
{
memcpy(ivec, nextIvec, 8);
memcpy(nextIvec, buffer+i, 8);
ecb_crypt(deskey , (char *) buffer+i, 8, DES_DECRYPT);
ecb_crypt(deskey+8, (char *) buffer+i, 8, DES_ENCRYPT);
cbc_crypt(deskey , (char *) buffer+i, 8, DES_DECRYPT, ivec);
}
for (i = 2; i < len; i++) checksum ^= buffer[i];
if (checksum) return -1;
return len;
}

uint8 *des_login_key_get(uint8 *key1, uint8 *key2)
{
uint8 des14[14];
static uint8 des16[16];
int i;

for (i = 0; i < 14; i++) des14[i] = key1[i] ^ key2[i];
memcpy(des16, des_key_spread(des14), 16);
return des16;
}

ОГРОМНОЕ СПАСИБО, ТОМУ КТО СПРАВИЛСЯ ИЛИ ПОПЫТАЛСЯ!
Отправлен: 13.02.2007, 11:01
Вопрос задал: Мурник Роман (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Мурник Роман!
Часть перевел — дальше вы и сами по аналогии сделаете.
Конструкции типа "if (!deskey)" надо заменять на "if (deskey <> nil) then".

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 13.02.2007, 16:14
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Попробую ))) На самом деле это только половина. Надо-бы заняться изучением С++


Вопрос № 75.509
Добрый день, уважаемые эксперты!

Вопрос мой не по программированию, но все же касающийся Delphi.
У нас есть один большой проэкт и необходимо чтобы два человека одновременно с ним работали. Сейчас решили эту проблему таким образом: я создал другой файл проэкта у себя на компьютере и занес туда ссылки, чтобы файлы проэкта загружались по сети. Но теперь постоянно у нас возникают проблемы с сохранением, сохраняешь модуль, потом открываешь его - а там того что дописал нет. Приходится сначала вспоминать, чего именно там нет, и писать опять. Может кто посоветует, как наладить общую работу над одним проэктом, чтобы меньше проблем?
Отправлен: 13.02.2007, 11:01
Вопрос задал: Leshka (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 3)

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

Попробуйте использовать программу StarTeam (Входит в Delphi) - это управление проектами в команде.
Однако она поддерживает только иерархическую структуру проекта. У меня проект с несколькими головами и она отказалась работать.
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 13.02.2007, 11:08
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за совет!!!
Буду разбираться с StarTeam

Отвечает: Igor_
Здравствуйте, Leshka!

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

Я пользуюсь SVN-ом (раньше работал с CVS, но потом перешел на SVN).
http://subversion.tigris.org - сам SVN (сервер)
http://tortoisesvn.net/ - интерфейс пользователя к нему.
Ответ отправил: Igor_ (статус: 1-ый класс)
Ответ отправлен: 13.02.2007, 12:55
Оценка за ответ: 5
Комментарий оценки:
Спасибо за совет.
Только вот что будет, если несколько разработчиков работают в одно время с одним модулем? или такого нельзя допускать?

Отвечает: Ерёмин Андрей
Здравствуйте, Leshka!
Вопрос на засыпку: как Вы думаете, а как пишут Windows? Тоже вот таким способом - открывают общий доступ к файлам и их одновременно все правят? Конечно же нет! Одновременный доступ к файлам даст сбой. Да что там сбой - даже если и сбоя не будет, то изменения бдут постоянно теряться, потому что каждый будет работать со старой копией, а обновлять файлы в режиме реального времени нельзя. Так вот, а теперь метод решения проблемы. Можно обойтись и без сторонних программ (хотя если StarTeam, про которую упомянули, с этим справиться - это просто отлично). Смысл технологии в том, что всю программу нужно разделить на модули. Проще говоря, распределяя работу, каждый выбирает себе область, которую он будет разрабатывать и делает он её отдельно, в отдельном проекте. Все функции складываются в отдельный модуль. После того, как всё готово, модуль легко подключить к существующему проекту и он будет прекрасно работать. В то же время модуль можно изменять и изменения будут проявляться уже при каждом следующем билде программы. Дополнительный плюс такого метода в том, что каждый отвечает за свой участок кода и может безболезненно с ним экспериментировать и отлаживать его. Это позволяет сразу отлавливать ошибки, которые в большом проекте найти очень сложно, если какая-то из функций написана неверно. Желаю удачи!
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Всё для программиста. Файловый архив, статьи, помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 13.02.2007, 16:35
Оценка за ответ: 3
Комментарий оценки:
Да, это одно из простейших решений этой проблемы, но в данном случае модули связаны между собой настолько, что этот метод к сожалению не подойдет, полюбому нужно чтобы несколько человек могли работать с одним модулем

Отвечает: Химяк Виктор Васильевич
Здравствуйте, Leshka!
Я не ручаюсь за точность, но по моему для этих целей с дистрибутива Delphi нужно установить программу Remotе Debbuger Server.
Ответ отправил: Химяк Виктор Васильевич (статус: 3-ий класс)
Ответ отправлен: 13.02.2007, 20:17
Оценка за ответ: 2
Комментарий оценки:
Не знаю, насколько это правда но за ответ спасибо.
И все же постарайтесь в следующий раз перед тем как отвечать удостовериться в правильности ответа.


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

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

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

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

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


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


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

В избранное