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

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


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

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

Выпуск № 481
от 23.05.2006, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 346, Экспертов: 68
В номере:Вопросов: 9, Ответов: 17


Вопрос № 43384: Как в Delphi организовать задержку на несколько микросекунд?...
Вопрос № 43387: Мир вам, уважаемые эксперты! Взялся тут поиграться с ООП и к своему неудовольствию обнаружил, что 1000 экземпляров класса TObject занимает в памяти целых 2 МБ, а 10000 экземпляров - больше 100МБ ! Отсюда вопросы: 1. Почему так много ...
Вопрос № 43408: Здраствуйте эксперты!!! Если среди вас те кто пишет или писал с использованием OpenGL или DirectX?!Откликнитесь плиз!!! Мой вопрос такой на чём лучше писать прогу, она сначала будет чертить 2Д контур модели,а потом выдавливать из неё 3Д и сам...
Вопрос № 43409: Здраствуйте ещё раз! Вопрос для тех кто знаком с c++ и ms visual c++ 6.0! В ms vc 6.0 при создании консольного приложения у главной функции main есть входящие параметры (int argc,char* argv[]) скажите пожалуйста что это за данные и где мне их...
Вопрос № 43452: Добрый день! Вопрос такой- как сортировать список файлов в ListView при OwnerData:= true? При OwnerData:= false все работает, сортируется по имени, типу, размеру и дате, а при OwnerData:= true почему-то никак.Алгоритм такой - файлы и папки с помощью ...
Вопрос № 43460: Понадобилось поработать с TQReport и вывести форму на печать. Как это сделать? И если можно грамотные доки не подскажите где взять по компоненту? (eng или рус)....
Вопрос № 43468: Доброго времени суток, Уважаемые эксперты! Помогите плз! Разробатываемая мною программа, работает с БД "M.mdb" посредством ADO. Трабл такой: у меня в БД изначально 108 записей (БД создавалась сначало в "Access" ); когда я доба...
Вопрос № 43472: Доброго времени суток, Уважаемые эксперты! Подскажите пожалуйста, как у DBGrid сделать так, чтобы по двойному щелчку мыши на границе полей, они выравнивались по максимальному значению поля или заголовка? Заранее Благодарю!...
Вопрос № 43502: Помогите плз! Написал код (см ниже). Прога компилируется (ошибок не находит), запускается, но при сохранении данных (btnSaveClick) из формы в БД, если остались не заполненные обяз.поля вместо "on EOleException do" работает 'else", ...

Вопрос № 43.384
Как в Delphi организовать задержку на несколько микросекунд?
Отправлен: 17.05.2006, 19:19
Вопрос задал: Jekson (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss

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

Никак. Минимально можно задавать время в милисекундах (функция Sleep библиотеки kernel32 - находится в модулях Windows и SysUtils).
А вообще непонятно зачем нужна задержка на столь малое время - задержка обычно делается для человека, а человек такое малое время физически не может отсчитать.

Удачи!
Ответ отправила: Denisss (статус: Специалист)
Ответ отправлен: 17.05.2006, 20:46

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Jekson!
Неправда, можно, хотя и способ совсем неоптимален. Например, сделав процедуру:

asm
nop
nop
...
nop
end;

nop = 1 такт простоя.

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

Ес-сно, зависит от частоты процессора, которую при желании, можно узнать программно. Но любое переключение контекста убьет эту фишку наповал, т.к. характерное время переключения - 10мс.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 5-ый класс)
Ответ отправлен: 17.05.2006, 21:23

Отвечает: Sarymian
Здравствуйте, Jekson!

Вроде в Делфи так же как и BP работает функиция delay (ms:word) - где MS кол-во милисекунд.
Ответ отправил: Sarymian (статус: 2-ой класс)
Ответ отправлен: 18.05.2006, 06:38

Отвечает: Gh0stik
Здравствуйте, Jekson!

Да по поводу микросекунд скорее всего у вас ничего не получиться.
Но как говорил уважаемый Sarymian можно использовать процедуру Delay. Только такой процедуры в Delphi в отличии от Pascal'я НЕТ сам долгое время искал.

Вот привожу пример процедуры Delay которую вы можете использовать но только задержка в МИЛИСЕКУНДАХ:

Delay(1000); //Задержка на одну секунду

Приложение:

---------
Мыслю - значит существую (Декарт)

Ответ отправил: Gh0stik (статус: 8-ой класс)
Ответ отправлен: 18.05.2006, 13:15


Вопрос № 43.387
Мир вам, уважаемые эксперты!

Взялся тут поиграться с ООП и к своему неудовольствию обнаружил, что 1000 экземпляров класса TObject занимает в памяти целых 2 МБ, а 10000 экземпляров - больше 100МБ !
Отсюда вопросы:
1. Почему так много ?
2. Можно ли как-нибудь уменьшить ?
3. Почему рост не пропорциональный ?

С уважением, Лука.
Отправлен: 17.05.2006, 19:32
Вопрос задал: Luka (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Luka!
В первую очередь встает вопрос, как вы измеряли объем занимаемой памяти.
Я очень сомневаюсь, что по TaskManager-у можно получить реальное значение, которое занимают именно эти объекты.
К тому же, если вы посмотрите описание класса TObject в System.pas, то увидите, что у него больше 20-и методов уже определено и хотя большинство из них представляет из себя не более 10-и ассемблерных инструкций, это все равно уже не 4 байта, которые занимает просто указатель. Насколько я знаю, только статические методы класса хранятся в единственном экземпляре на весь класс.

На 2-ой вопорс ответ, скорее всего, отрицаительный.
На 3-ий - напомню, что вам надо проверить методику измерений.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 5-ый класс)
Ответ отправлен: 17.05.2006, 23:28
Оценка за ответ: 5
Комментарий оценки:
Замечание насчет методики измерений, конечно, совершенно справедливо, хотя по-моему объем потребляемой программой памяти на практике важнее, чем теоретическое отведенное под объекты место. Я же больше говорил о порядке величин.
Ситуация весьма неприятна - мне не нужна никакая функциональность родительского объекта, поэтому взял предком TObject, но даже так получил в нагрузку несколько килобайт/объект. Может перейти обратно на BP7.0 ?
Спасибо за "только статические методы класса хранятся в единственном экземпляре на весь класс".
Буду думать.


Вопрос № 43.408
Здраствуйте эксперты!!!
Если среди вас те кто пишет или писал с использованием OpenGL или DirectX?!Откликнитесь плиз!!!
Мой вопрос такой на чём лучше писать прогу, она сначала будет чертить 2Д контур модели,а потом выдавливать из неё 3Д и самое главное что-бы можно было динамически создавать новые обьекты на примере старых и анимировать их?!
Отправлен: 17.05.2006, 23:38
Вопрос задал: chikanok (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jeka911
Здравствуйте, chikanok!

OpenGL, однозначно.
и 2д и 3д в одном каркасе приложения. Да и примеров по OpenGL много и с хорошими комментариями.
---------
Шахтер - чемпион!!!
Ответ отправил: Jeka911 (статус: 3-ий класс)
Ответ отправлен: 17.05.2006, 23:49

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, chikanok!
OpenGL проще в освоении, но у DirectX больше возможностей. Да, недавно вышел OpenGL 2.0, но по нему еще очень мало примеров. Впрочем, ничего особенно сложного вам не понадобится, так что присоединяюсь.
А если вдруг все-таки возьметесь как-дь, за DirectX, то НЕ ипсользуйте DirectDraw - только сразу Direct3D.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 5-ый класс)
Ответ отправлен: 18.05.2006, 00:27


Вопрос № 43.409
Здраствуйте ещё раз!
Вопрос для тех кто знаком с c++ и ms visual c++ 6.0!
В ms vc 6.0 при создании консольного приложения у главной функции main есть входящие параметры (int argc,char* argv[]) скажите пожалуйста что это за данные и где мне их взять в делфях?!
Нужно для инициализационной функции библиотеки GLUT (а точнее DelphiGLUT)!

Приложение:

Отправлен: 17.05.2006, 23:45
Вопрос задал: chikanok (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, chikanok!
Первый параметр - это кол-во параметров коммандной строки.
Второй - массив строк - они сами. Нулевой элемент, это сам путь к проге.
*1
Два параметра бывает в случаях, например, если отрываете документ какой-дь прогой для этого приспособленной.
*2
Все флаги - это тоже параметры коммандной строки.
*3

Приложение:

Ответ отправил: Сухомлин Кирилл Владимирович (статус: 5-ый класс)
Ответ отправлен: 18.05.2006, 00:24

Отвечает: sir henry
Здравствуйте, chikanok!
Количество входных параметров, т.е. тех, что задаются в командной строке при запуске Вашей программы, можно получить функцией ParamCount.
Переменная CmdLine - это те самы параметры, тип PChar.
Если нужно каждый параметр получить по отдельности, то ParamStr(Index), где с индексом 0 будет название запущеной программы, с индексом 1 и так далее, те параметры, который Вы задаете при запуске.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 18.05.2006, 06:12


Вопрос № 43.452
Добрый день! Вопрос такой- как сортировать список файлов в ListView при OwnerData:= true? При OwnerData:= false все работает, сортируется по имени, типу, размеру и дате, а при OwnerData:= true почему-то никак.Алгоритм такой - файлы и папки с помощью FindFirst - FindNext заносятся в двухмерный динамический массив, а потом из него в ListView. Потом вызываю CustomSort, но сортировки нет. Что не так, помогите , пожалуйста!
Отправлен: 18.05.2006, 11:47
Вопрос задал: Савенко Вадим Иванович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Савенко Вадим Иванович!

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

Т.е. я Вам предлагаю сначало отсортировать Ваш двухмерный динамический массив, а уже отсортированный массив вносить в ListView. Соответственно его не потребуется сортировать непосредственно в ListView так как список уже отсортирован. Надеюсь это поможет.

Удачи!!!

Приложение:

---------
Мыслю - значит существую (Декарт)

Ответ отправил: Gh0stik (статус: 8-ой класс)
Ответ отправлен: 18.05.2006, 12:04
Оценка за ответ: 5
Комментарий оценки:
Спасибо за совет. Есть некоторые трудности с алгоритмом сортировки, а вообще все работает замечательно.


Вопрос № 43.460
Понадобилось поработать с TQReport и вывести форму на печать. Как это сделать?
И если можно грамотные доки не подскажите где взять по компоненту? (eng или рус).
Отправлен: 18.05.2006, 12:42
Вопрос задал: SUPcOZA (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, SUPcOZA!
По QReport русское описание можно взять здесь:
http://chertenok.km.ru/download_php/download.php?tema=doc&action=show&id=73
Отчет, свормированый им, посылается на печать методом Print. В хелпе об этом написано, Вы разве не читали?
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 18.05.2006, 13:28


Вопрос № 43.468
Доброго времени суток, Уважаемые эксперты!
Помогите плз! Разробатываемая мною программа, работает с БД "M.mdb" посредством ADO. Трабл такой: у меня в БД изначально 108 записей (БД создавалась сначало в "Access" ); когда я добавляю новую запись, поле "счётчик" (оно же - ключевое в таблице моей "M.mdb") присваевает ей №109, сохраняю и тут же эту 109-ю запись удоляю, но... при создании новой записи, ей присваивается уже №110, после удаления 110-ой - следующей создаваемой записи присв. №111, хотя 109-ой и 110-ой уже и впомине нет.
Скажите, куда прячутся номера удаляемых записей в сетке, в поле "счётчик" моей программы, и как это починить?
Заранее Благодарю.
Отправлен: 18.05.2006, 13:23
Вопрос задал: Dredd (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Проходящий Мимо
Здравствуйте, Dredd!
Поле "счётчик", как Вы уже заметили, ключевое в таблице. Оно предназначено для однозначной идентификации строк. Такое поле называется ключевым потому, что оно гарантировано всегда уникальное. Соответственно, при удалении записи для номер теряется. Если абстрактно представить, что "дырок" не должно быть, каким сложным должен быть механизм работы с базой. Вы ввели 108 записей, потом удалили, например, 10 запись. Чтобы небыло дырки, нужно было бы запись 11 переименовать в 10, 12 в 11, .... , 108 в 107. А зависимые таблицы, которые ссылаються на Ваш первичный ключ, как их отследить? Потому "дырки" - закономерное явление в работе баз данных, и Вам нужно с этим смирится.
---------
Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 3-ий класс)
Ответ отправлен: 18.05.2006, 14:16
Оценка за ответ: 5

Отвечает: RSV
Здравствуйте, Dredd!
Поле "Счетчик" - автоинкрементальное (см. свойства БД). Применением данного типа поля достигается уникальность записей. Т. к. это поле является ключевым, изменение свойств нежелательно.
Ответ отправил: RSV (статус: 1-ый класс)
Ответ отправлен: 18.05.2006, 14:28
Оценка за ответ: 4

Отвечает: Злоумышленник
Здравствуйте, Dredd!
{сколько у меня в таблице записей ?}количество записей хранится в свойстве таблицы RecordCount:
ADOTable1.RecordCount
<- Это с учётом Вашего сообщения на мини-форуме.

По порядку записи определяются через с-во опять таки таблицы RecNo:
tbProg.Close;
tbProg.Open;
tbProg.First;
for i := 0 to tbProg.RecordCount-1 do
begin
Edit1.Text := IntToStr(tbProg.RecNo);
Sleep(1000);
end;
Данный код по порядку покажет все номера от начала до конца записей таблицы tbProg.
Желаю Вам успеха!
Ответ отправил: Злоумышленник (статус: 7-ой класс)
Ответ отправлен: 18.05.2006, 18:42
Оценка за ответ: 5
Комментарий оценки:
Супер! Спасибо большое!


Вопрос № 43.472
Доброго времени суток, Уважаемые эксперты!
Подскажите пожалуйста, как у DBGrid сделать так, чтобы по двойному щелчку мыши на границе полей, они выравнивались по максимальному значению поля или заголовка?
Заранее Благодарю!
Отправлен: 18.05.2006, 13:55
Вопрос задал: Dredd (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Dredd!
Ф-ия для нахождения ширины текста:
DBGrid.Canvas.TextWidth()

В обработчике события OnDblClick у компонента DBGrid смотрим на тип курсора в момент клика: елси он такой как нам нужно, то выравниваем ячейки.
if (Screen.Cursor=crHSplit) then begin
...
end;

ЗЫ: Стоит делать выравнивание с запасом (TextWidth(s) + 2..4) - чтобы более красиво выглядело.

Приложение:

Ответ отправил: Сухомлин Кирилл Владимирович (статус: 5-ый класс)
Ответ отправлен: 18.05.2006, 14:22
Оценка за ответ: 3
Комментарий оценки:
В строке
DBGrid.Canvas.TextWidth(); пишет:
"Not enough actual parametrs".
Если Вас не затруднит, нельзя ли поподробнее.

Отвечает: Kazakh
Здравствуйте, Dredd!
Оставьте в покое стандартные Grid'ы :-)
Используйте компоненты, в которых это уже реализовано.

Я к примеру использую Девок (DevExpress) и Джедаев.
Вам того же желаю.
---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 8-ой класс)
Ответ отправлен: 18.05.2006, 15:08
Оценка за ответ: 3


Вопрос № 43.502
Помогите плз!
Написал код (см ниже). Прога компилируется (ошибок не находит), запускается, но при сохранении данных (btnSaveClick) из формы в БД, если остались не заполненные обяз.поля вместо "on EOleException do" работает 'else", а вместо "on EConvertError do" при неправельном вводе формата даты вообще запускается "raise" (которое по умолчанию), хм.
Классы "EOleException" и "EConvertError" я взял из сообщений "raise" после соответствующих ошибок, до того, как написал этот код.
Если не трудно, подкорректируйте меня пожалуйста!

Приложение:

Отправлен: 18.05.2006, 18:53
Вопрос задал: Dredd (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Злоумышленник
Здравствуйте, Dredd!
Я бы сделал так:
п.1 приложения - если таблица в режиме вставки или редактирования, то сохраняю запись
п.2 приложения - в обработчике beforePost проверяю на заполненность обязательные поля. Если не заполнено - сохранение запрещено.
Если непревильно введён формат даты, соответствующее сообщение будет выдано и даже по-русски (в случае ADO). Можно также самому проверять поле на наличие даты. Например, путём преобразования в дату с try except и сообщением + поставить маску на поле ввода (я не знаю, какой элемент управления используете).

Приложение:

Ответ отправил: Злоумышленник (статус: 7-ой класс)
Ответ отправлен: 18.05.2006, 22:17
Оценка за ответ: 4
Комментарий оценки:
Спасибо!
Тут есть над чем мне - делитанту поработать.


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное