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

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


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

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

Выпуск № 483
от 25.05.2006, 20:05

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


Вопрос № 43606: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, базу статей по C++. Для Delphi есть DelphiWorld. Может, для C++ есть что-нибудь похожее... Вопрос не в тему, но всё же... (В C++ я тоже задал,но решил, вдруг вы мне поможете?). Зар...
Вопрос № 43607: У меня проблема: при развороте формы меняю размеры RichEdit, но проблема не в этом, проблема в том, что если скролбар этого Эдита был внизу, то он так и останется, более того появится много свободного места под тесктом самого Эдита(просто пустые НЕ С...
Вопрос № 43609: ПОДСКАЖИТЕ!!! Здравствуйте эксперты!! Скажите, кто знает-как можно ASCII перевести в двоичную систему счисления, т. е. в нолики и единички??...
Вопрос № 43611: Мир вам, уважаемые эксперты! Объясните убогому, чем конструкция: ---------------------------------------- var Universum:array of TObject; ... SetLength(Universum,0); for i:=0 to 10000 do begin SetLength(Universum,len...
Вопрос № 43636: TreeView с установленной сортировкой stText, к каждому Item должно быть привязано по 2 строки. Рассматривал 2 варианта - через Data и через внешнюю таблицу, связанную по AbsoluteIndex. В чем трудность - невозможность штатными средствами сделать сохра...
Вопрос № 43641: Здравствуйте! У меня возник такой вопрос. Где можо взять описание структуры документов ворда. Хочу написать простенький конвертер (чтобы получить только текст из документа, так как сам ворд уже з!"№;!"№;л!). Очень нужно. Или подскажите, в к...
Вопрос № 43663: Здравствуйте эксперты!! Подскажите кто знает!! Мне нужно сохранить данные полученные программой запущеной отдельно!!Т. е. программа считывает инфу с винта и отображает её в pagecontrol вроде бы!! А закладок там несколько!! Так вот, мн...
Вопрос № 43667: Здравствуйте! Скажите, пожалуйста, что Вы думаете по поводу Borland Developer Studio 2006. Читал много в интернете, но у вес самые разные мнения, а хорошего описания так и не нашёл :(. Будете ставить (или ставили)? Спасибо....
Вопрос № 43668: Здравствуйте! Скажите, пожалуйста, можно ли узнать кол-во памяти, занимаемой процессом (Windows XP). Если можно, то как? Спасибо....
Вопрос № 43687: Здравствуйте, уважаемые эксперты! Во время выполнения программы я создаю объект типа TEdit. Как сделать так, чтобы при изменение текста в этом ЕEdit (OnChange) у меня выполнялась заранее созданная процедура (MyOnChange)? Спасибо....

Вопрос № 43.606
Здравствуйте, уважаемые эксперты!
Подскажите, пожалуйста, базу статей по C++. Для Delphi есть DelphiWorld. Может, для C++ есть что-нибудь похожее...
Вопрос не в тему, но всё же... (В C++ я тоже задал,но решил, вдруг вы мне поможете?).
Заранее спасибо.
Отправлен: 19.05.2006, 19:37
Вопрос задал: Колян (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Николай Б.
Здравствуйте, Колян!
Конечно, есть аналогичная база - World C++! Она даже лучше, чем DelphiWorld (по-моему, последнее время DelphiWorld не обновляется, а World C++ обновляется [цитата] "25-ого числа каждого месяца" [конец цитаты] и количество статей в WorldC++ намного больше!).
Теперь главное - сайт: http://worldcpp.vingrad.ru.
Удачи!
---------
Недавно прошёл тест на IQ. Результат отрицательный.
Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 19.05.2006, 19:41
Оценка за ответ: 5


Вопрос № 43.607
У меня проблема: при развороте формы меняю размеры RichEdit, но проблема не в этом, проблема в том, что если скролбар этого Эдита был внизу, то он так и останется, более того появится много свободного места под тесктом самого Эдита(просто пустые НЕ СУЩЕСТВУЮЩИЕ строки, в смысле по свойству Lines их там нет, просто из-за скролбара они там каким то чудом отображаются) Мне нужен способ изменить положение скролбара!
Заранее спасибо всем кто попытается помочь в моем вопросе!!!

Приложение:

Отправлен: 19.05.2006, 19:53
Вопрос задал: Дмитрий Т. (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Дмитрий Т.!
Попробуйте всё же покрутить со свойством SelStart, только дополнительно активируя поле ввода. Например так:
P: Integer;
...
P:=Text.SelStart;
Text.SetFocus;
Text.SelStart:=0;
Text.Refresh;
Text.SelStart:=P;
Text.SetFocus;
Text.Refresh;

Обычно помогает.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 19.05.2006, 19:57
Оценка за ответ: 4
Комментарий оценки:
Идея неплохая, но все же не работает... :(


Вопрос № 43.609
ПОДСКАЖИТЕ!!!
Здравствуйте эксперты!!
Скажите, кто знает-как можно ASCII перевести в двоичную систему счисления, т. е. в нолики и единички??
Отправлен: 19.05.2006, 20:40
Вопрос задал: F Ruslan R (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгения
Здравствуйте, F Ruslan R!
http://en.wikipedia.org/wiki/ASCII - тут таблица значений двоичного кода ASCII символов...
просто переводите десятичные значения ASCII символов в двоичную систему счистления... как это побыстрее сделать вам может кто-нибудь другой подскажет... извините уж... просто не знаю в чем именно у вас загвоздка...
---------
Я не волшебник, я только учусь... А разве кто-то обещал, что будет легко?
Ответ отправила: Евгения (статус: 5-ый класс)
Ответ отправлен: 19.05.2006, 23:00
Оценка за ответ: 5


Вопрос № 43.611
Мир вам, уважаемые эксперты!
Объясните убогому, чем конструкция:
----------------------------------------
var Universum:array of TObject;
...
SetLength(Universum,0);
for i:=0 to 10000 do
begin
SetLength(Universum,length(Universum)+1);
Universum[i]:=TObject.Create;
end{for i};
----------------------------------------

так отличается от конструкции:
----------------------------------------
var Universum:array of TObject;
...
SetLength(Universum,10001);
for i:=0 to 10000 do
begin
Universum[i]:=TObject.Create;
end{for i};
----------------------------------------

что в первом случае диспетчер задач показывает улетающую в небеса (за 100МБ) потребляемую память (а во втором - нет)
С уважением, Лука.
P.S. Это в некотором роде продолжение вопроса № 43387.
Отправлен: 19.05.2006, 20:55
Вопрос задал: Лука (статус: 3-ий класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: Ерёмин Андрей
Здравствуйте, Luka!
В первом случае для динамического массива явно задаётся количество элементов, поэтому он потребляет ограниченное количество памяти (количество элементов * объём одного элемента). Во втором случае память не ограничивается и занимается равной максимальное_значение_числа_данного_типа_данных * объём одного элемента - вот и улетает высоко вверх. Кроме того, второй способ может выдавать ошибки при выполнении. Первый гораздо надёжнее.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 19.05.2006, 21:01
Оценка за ответ: 4
Комментарий оценки:
Что-то я не очень понял:
SetLength(Universum,10001);
Разве это не явное задание количества элементов ?
Затем, ведь конечное число элементов одинаково в обоих случаях.
И главное - именно в ПЕРВОМ способе память и съедается. Специально перепроверил сейчас. Когда длинна устанавливается разово (и когда статический массив тоже) - всё нормально. А в первом случае диспетчер показывает 120МБ.

Отвечает: Евгения
Здравствуйте, Luka!
Как мне кажется - это, потому что в первом случае у вас функция SetLength выполняется 10002 раза, а во-втором 1 раз...
---------
Я не волшебник, я только учусь... А разве кто-то обещал, что будет легко?
Ответ отправила: Евгения (статус: 5-ый класс)
Ответ отправлен: 19.05.2006, 22:47
Оценка за ответ: 3
Комментарий оценки:
Думаю, анекдот про математика и воздушный шар все помнят...

Отвечает: Злоумышленник
Здравствуйте, Luka!
SetLength - инициализация динамического массива. Т. е. распределение памяти и указание границ индексов или их изменение (индексов). При этом происходит следующее: резервируется для размещения нового массива память; элементы старого массива переносятся в новый; ОСВОБОЖДАЕТСЯ память, выделенная прежнему МАССИВУ.
Почему тогда у Вас утечка памяти в первом случае? Да потому что есть строка
Universum[i]:=TObject.Create;
Здесь Вы создаёте объект с выделением памяти и записью указателя на неё (памяти для объекта) в Universum[i] - он не хранит "память", только указатель. При изменении длины массива происходят действия, описанные выше (SetLength), но память для созданных объектов НЕ ОСВОБОЖДАЕТСЯ. Решается так - Universum[i].Free :
SetLength(Universum,0);
for i:=0 to 10000 do
begin
SetLength(Universum,i+1);
Universum[i]:=TObject.Create;
Universum[i].Free;
end{for i};
---------------------------------------
Или так:
var
Universum:array of TObject;
o: TObject;
i: Integer;
begin
SetLength(Universum,0);
o := TObject.Create;
for i:=0 to 10000 do
begin
SetLength(Universum,i+1);
Universum[i]:=o;//TObject.Create;
//Universum[i].Free;
end{for i};
end;
Ответ отправил: Злоумышленник (статус: 7-ой класс)
Ответ отправлен: 20.05.2006, 07:56
Оценка за ответ: 5
Комментарий оценки:
Наконец что-то разумное.
Но...
Вы сами пишите: "Universum[i] - он не хранит "память", только указатель", логично, что перенос элементов массива будет заключаться в переписывании указателей в новое место. Зачем же тогда освобождать память ОБЪЕКТОВ ? Да и какой в этом смысл - они мне ещё пригодятся. :)

Но кажется я понял в чем дело: не освобождается память самих массивов (там где раньше лежали указатели на объекты) - имеем 10000 участков от 4 до 40тыс байт (как минимум) - в сумме 190 МБ, часть уходит в своп.
Но всё равно, странно это...
Спасибо за участие.

Отвечает: mvp
Здравствуйте, Luka!
В приложении процедура из модуля System, которая вызывается, при установке новых размеров массива. Как видно, освобождение памяти происходит только при установке меньшего размера:

if (newLength < oldLength) and (typeInfo <> nil) then
FinalizeArray(PChar(p) + Sizeof(Longint)*2 + newLength*elSize, typeInfo, oldLength - newLength);

В противном случае идёт копирование (во всяком случае, освобождение памяти не заметил нигде). Следовательно, вы совершенно правы, что память не освобождается.

2Злоумышленник: Для строк вызывается совершенно другая процедура, чем для динамических массивов. И освобождение динамического массива не освобождает указатели. поэтому освободить память можно только с Free, если элементом выступает объект - даже эксперементов не надо.

Приложение:

---------
Моя совесть чиста - не бывшая в употреблении

Ответ отправил: mvp (статус: Студент)
Ответ отправлен: 20.05.2006, 13:07
Оценка за ответ: 5
Комментарий оценки:
Причем, даже если бы память освобождалась, оставалась бы неприятная фрагментация памяти...
Значит пойдем другим путем.
Спасибо.

Отвечает: sir henry
Здравствуйте, Luka!
Я бы Вам не советовал делать то, что у Вас приведено в первом примере. Во-первых, зачем делать 10000 раз то, что можно делать всего 1 раз (SetLength)? Во-вторых, вполне возможно, что те 4 байта, которые тратятся на новую ячейку массива для TObject не освобождаются при увеличении длинны массива. Длинна массива увеличивается довольно идиотским способом - сначала создается новый массив с большим количеством ячеек, а затем удаляется старый. У Вас же получается, что ячейке присвоен указатель на созданый объект и поэтому диспетчер памяти Дельфи старый массив не удаляет и у Вас получилось в результате 10000 массивов со всевозрастающей длиной.
Смешно, правда? :)
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 20.05.2006, 14:06
Оценка за ответ: 5
Комментарий оценки:
Было б смешно, если б не было так грустно.
Беда в том, что я не знаю, сколько у меня будет объектов - они будут создавать друг друга, в том числе рандомно...
Придется увеличивать Universum порциями, ячеек по 300 за раз и держать где-то действительную последнюю ячейку. Спасибо тебе, Borland, за наше счастливое детство!


Вопрос № 43.636
TreeView с установленной сортировкой stText, к каждому Item должно быть привязано по 2 строки. Рассматривал 2 варианта - через Data и через внешнюю таблицу, связанную по AbsoluteIndex. В чем трудность - невозможность штатными средствами сделать сохранение TreeView - в случае с Data - данные не сохраняются, в случае с таблицей - мешает сортировка (меняется AbsoluteIndex), но без нее нельзя никак. Каковы будут предложения и рекомендации по реализации сохранения таких вещей?
Отправлен: 20.05.2006, 06:03
Вопрос задал: Хлызов Алексей (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Полховский Александр Владимирович
Здравствуйте, Хлызов Алексей!
Попробуйте написать обработчик события OnCompare, в котором синхронизуйте изменение строки в таблице с изменением AbsoluteIndex у сортируемого элемента. Подробнее об этом событии найдёте в справке.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 20.05.2006, 19:40


Вопрос № 43.641
Здравствуйте! У меня возник такой вопрос. Где можо взять описание структуры документов ворда. Хочу написать простенький конвертер (чтобы получить только текст из документа, так как сам ворд уже з!"№;!"№;л!). Очень нужно. Или подскажите, в каком направлении искать. Конвертер должен работать без установленного ворда. Спасибо за внимание. Если что-то есть, кидайте на мыло: serg_6667@yahoo.com
Отправлен: 20.05.2006, 10:39
Вопрос задал: Serg_6667 (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Николай Б.
Здравствуйте, Serg_6667!
Его нигде нельзя взять. У документов Word закрытый формат (по нему нет документации).
Это очень большая ошибка microsoft. Говорят, что в новой версии оффиса формат будет открытым, но пока без установленного Word'a ничего не сделаете.
=> конвертера тоже нет.
Удачи!
---------
Недавно прошёл тест на IQ. Результат отрицательный.
Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 20.05.2006, 14:55

Отвечает: Проходящий Мимо
Здравствуйте, Serg_6667!
Возможный вариант вместо документа в формате .DOC использовать открытый .RTF, он читается всеми версиями Word, OpenOffice и многими другими. Спецификацию можна прочитать здесь:
http://delphiworld.narod.ru/base/rtf_format.html
http://delphiworld.narod.ru/base/html_to_rtf.html
http://delphiworld.narod.ru/base/to_rtf.html
Есть способ попроще, достаточно набрать или загрузить текст в RichEdit, потом сохранить в файл RichEdit1.Lines.SaveToFile('c:aaa.rtf').
---------
Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 3-ий класс)
Ответ отправлен: 22.05.2006, 09:52


Вопрос № 43.663
Здравствуйте эксперты!!
Подскажите кто знает!!
Мне нужно сохранить данные полученные программой запущеной отдельно!!Т. е. программа считывает инфу с винта и отображает её в pagecontrol вроде бы!!
А закладок там несколько!!
Так вот, мне нужно за один раз сохранить в текстовый файл информацию
со всех закладок!!
Инфы там не много, примерно несколько строк, если это будет важно!!
Зарание спаси
Отправлен: 20.05.2006, 15:01
Вопрос задал: F Ruslan R (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Татьяна
Здравствуйте, F Ruslan R!
Могу предложить вариант в котором я не уверенна, но по идее должно получиться.
для этого необходимо
1) найти необходимое окно по заголовку
2) проходиться по всем дочерним (getWindow), пока не дойти до необходимого.
Этот вариант теоретически возможен, но, как мне кажется, достаточно сложен в том плане, что я не знаю в каком виде она там хранится.

Более простой вариант, если конечно, программа не должна делать это незаметно, эмулировать движение и клики мыши, кликать по всем страницам и если в этом окне есть возможность копирования нужного текста (ну т.е. его можно выделить и скопировать в буфер), то потом эти данные извлечь из буфера.
Проблем вообще говоря возникнуть не должно. Конечно минус, это скурпулезное высчитывание координат, но определенной сложности в этом способе нет. Опять же, если приложение не должно это делать незаметно и объекты поддаются пользовательскому копированию
---------
Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 20.05.2006, 21:45
Оценка за ответ: 5
Комментарий оценки:
В в том то и дело, что мне нужно незаметно!!
Спасибо!!


Вопрос № 43.667
Здравствуйте!
Скажите, пожалуйста, что Вы думаете по поводу Borland Developer Studio 2006. Читал много в интернете, но у вес самые разные мнения, а хорошего описания так и не нашёл :(.
Будете ставить (или ставили)?
Спасибо.
Отправлен: 20.05.2006, 16:05
Вопрос задал: Колян (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Николай Б.
Здравствуйте, Колян!
Статья о BDS 2006: http://forum.vingrad.ru/index.php?showtopic=75381
Сравнение стандартных компонентов: http://www.delphiplus.org/articles/delphi/migration_d7-d8/delphi_d7d2006.html

Я поставил. Покупал на DVD. На CD, говорят, проблемы с установкой. Очень хорошая программы (набор программ). Очень мощный отладчик (по сравнению с Delphi 7, 2005). В отличие от Delphi 2005 нужно очень постараться, чтобы BDS 2006 вылетела (зависла): мне только один раз удалось её полностью подвесить (когда моя программа съела все ресурсы и пришлось снимать BDS в диспетчере задач).
В общем, отличная программа! Рекомендую!!
Удачи!
---------
Недавно прошёл тест на IQ. Результат отрицательный.
Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 20.05.2006, 16:12
Оценка за ответ: 5

Отвечает: Ерёмин Андрей
Здравствуйте, Колян!
Ставил. И сейчас стоит. Но переходить в ближайшее время полностью на эту среду (сейчас Delphi 7 пользуюсь) не собираюсь. Перенести программы, написанные в Delphi 6-7 практически невозможно - многие компоненты на BDS 2006 не установятся. Да и привыкнуть к новой среде нелегко. В целом, версию хочу похвалить. Она действительно мощная и более надёжная, нежели все предыдущие.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 20.05.2006, 17:00
Оценка за ответ: 5


Вопрос № 43.668
Здравствуйте!
Скажите, пожалуйста, можно ли узнать кол-во памяти, занимаемой процессом (Windows XP). Если можно, то как?
Спасибо.
Отправлен: 20.05.2006, 16:05
Вопрос задал: Колян (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Николай Б.
Здравствуйте, Колян!
Нашёл вот такое (код в приложении). Проверил - всё работает.
Удачи!

Приложение:

---------
Недавно прошёл тест на IQ. Результат отрицательный.

Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 20.05.2006, 16:12
Оценка за ответ: 5


Вопрос № 43.687
Здравствуйте, уважаемые эксперты!
Во время выполнения программы я создаю объект типа TEdit. Как сделать так, чтобы при изменение текста в этом ЕEdit (OnChange) у меня выполнялась заранее созданная процедура (MyOnChange)?
Спасибо.
Отправлен: 20.05.2006, 19:15
Вопрос задал: Граур Василий Олегович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Полховский Александр Владимирович
Здравствуйте, Граур Василий Олегович!
Присвойте вновь созданному объекту свойство OnChange:=MyOnChange;
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 20.05.2006, 19:42


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

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

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

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

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

В избранное