Приветствую вас, уважаемые эксперты. Не подскажите, сильно ли замедляется работа программы при использовании динамических массивов (если вообще замедляется). Например, если в цикле, работающем с массивом, требуется многократно устанавливать длину этого массива с помощью процедуры SetLength(ThisArray, N), то, может быть, целесообразно использовать обычный массив размерности заведомо большей, чем максимально возможное N, а количество реально используемых ячеек хранить в отдельной переменной? Заранее благодарю за море различных ответов. Пуху пух, миру мир. Алексей.
Здравствуйте, Алексей! > целесообразно использовать обычный массив размерности заведомо большей, чем максимально возможное N Да, это точно быстрее. Скорость динамических массивов сильно зависит от реализации, а также от фрагментации памяти (которая в свою очередь зависит от частоты использования динамических массивов :). Лучший вариант - это использовать динамический массив, но расширяемый, т.е. у тебя есть нижняя граница - это количество элементов, которые ты изначально выделяешь. Когда требуемое количество элементов в него укладывается, ты используешь его. Когда же оно превышает это значение, то увеличиваешь массив, но не уменьшаешь его впоследствии. Также, можно к этому добавить верхнюю границу, если максимальный объем массива может стать сравнимым с размером ОП (тогда возникнет своппинг, что уж точно не быстро).
*
EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 04.09.2003, 23:19 Отправитель: Bob Johnson Отвечает Vdr
Доброе время суток, Алексей! А что мешает тебе хранить длинну динамического массива в отдельной переменной? Лично я придерживаюсь того мнения, что когда размерность массива заранее неизвестна лучше использовать динамические массивы, хотя они и жрут больше памяти, но если правильно разработать алгоритмы, то медленнее работать не будут. Удачи! Ответ отправлен: 05.09.2003, 10:31 Отправитель: Vdr Отвечает Marouder
Приветствую Вас, Алексей! Ну, SetLength, конечно, замедляет работу, как и другие функции. Если замедление слишком уж заметно, используй обычный. Ответ отправлен: 05.09.2003, 12:38 Отправитель: Marouder Отвечает Артём Шегеда
Добрый день, Алексей!
А ты никогда не пробовал посмотреть код, генерируемый компилятором? Я посмотрел и остался доволен - практически ничего лишнего: указатель на базу хранится в регистре, элемент массива берётся по адресу [(индекс элемента)*(размер элемента)+база]. Всё достаточно быстро. Длина массива - это двойное слово по адресу [база-4] (значит вычисление размера массива очень быстрое). Никакой дополнительной проверки индексов (за исключением той, что выставляешь в опциях проекта). Вывод: Сама по себе работа с динамическим массивом медленной быть не может. Медленным может быть только изменение размера массива - и решение этой проблемы Bob Johnson пердложил правильное и достаточно простое: перед изменением размера проверь - а нужно ли его менять. Ответ отправлен: 05.09.2003, 13:57 Отправитель: Артём Шегеда Отвечает --- Нет данных ---
Приветствую Вас, Алексей! в зависимости от конкретного случая... производительность может падать в несколько раз, но в обычных программах это обычно незаметно. Второй вариант лучше. Как промежуточный вариант можно и в динамическом масиве длину выделять по максимуму, или например изменять только при необходимости увеличения массива. Ответ отправлен: 05.09.2003, 16:58 Отправитель: --- Нет данных ---
Вопрос № 891
Всем привет! Подскажите пожалуйста можно ли в Delphi навигацию в форме от одного поля к другому(TEdit) осуществлять не только по клавише и мышкой, но и по ? Или хотя бы только по . Может у TEdit или TForm есть какое-то свойство, отвечающее за это?
Добрый день, Владимир! Не понял. Что "по"? Ответ отправлен: 05.09.2003, 12:39 Отправитель: Marouder Отвечает Артём Шегеда
Приветствую Вас, Владимир!
Вся беда в том, что переход между контролами на форме осуществляется не средствами DelphiVCL, а самой Windows. Посему приходится изголяться - писать обработчик. В свойствах формы поставь KeyPreview := true и создай обработчик OnKeyDown По нажатию Del или '.' будет осуществляться переход между элементами управления.
Приложение: Ответ отправлен: 05.09.2003, 13:43 Отправитель: Артём Шегеда Отвечает Bob Johnson
Приветствую Вас, Владимир! Непонятно, что значит осуществлять навигацию по "?"... Если нужно просто осуществлять навигацию по какой-либо дополнительно клавише, то тогда поставь у этой формы свойство KeyPreview в true и в обработчике OnKeyPress при нажатии нужной тебе клавиши сам передавай фокус ввода (что-то.SetFocus). Список дочерних контролов можешь составить сам (только из тех, что нужны) или получить у формы.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 05.09.2003, 14:47 Отправитель: Bob Johnson Отвечает ART_43
Здравствуйте, Владимир! у формы KeyPreview=true procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((Key=vk_tab) or (Key=vk_return)) and (Shift=[]) then FindNextControl(ActiveControl, true, true, true).SetFocus; end; и не пиши в сообщениях знаки больше и меньше (угловатые скобки)
Ответ отправлен: 05.09.2003, 18:02 Отправитель: ART_43
Вопрос № 892
Привет ЭкСпертам! У меня вот такакая ситуация случилась: Решил побаловаться с вордовскими документами. Думал что все будет как в VBA: открыл файл, записали сделал все что хотел, а затем зыкрыл его. Но вот в Дельфях как оказалось все не так: нашел какую-то вкдадку Servers, поставил на форму компонент TWordDocument а дальше ничего не пойму. Вроде как там надо сначало приконнектиться, что-то сделать и отконнектиться. Объясните пожалуйста как там что делать.....
Добрый день, D.M.! Посмотри в приложении текст двух моих процедур. Они для Excel, но у тебя будет, наверно, аналогично. Ex - переменная типа TExelApplication, ExC - TExelChart (здесь не используется, но процедуру дисконнекта я сделал для всех процедур, соединяющихся с Excel) ExB - TExcelWorkbook, ExS - TExcelWorksheet. Ну и начинка тебе не нужна, видимо, если ты просто хочешь вызвать, здесь заполняется из IBQuery.
Приложение: Ответ отправлен: 05.09.2003, 16:50 Отправитель: kvINT
Вопрос № 893
Всем привет! Подскажите пожалуйста можно ли в Delphi навигацию в форме от одного поля к другому(TEdit) осуществлять не только по клавише Tab и мышкой, но и по Enter? Или хотя бы только по Enter. Может у TEdit или TForm есть какое-то свойство, отвечающее за это?
Здравствуйте, Владимир! Конкретно такого события нет, но есть событие формы - OnKeyDown, там можно при нажатии клавиши Enter (key=13) эмулировать нажатие Tab (9).
Ответ отправлен: 06.09.2003, 13:03 Отправитель: URiS Отвечает Cybernetic Creature
Приветствую Вас, Владимир! pishite v OnKeyPress ili OnKeyDown ili OnKeyUp procedure TForm1.Edit1KeyPress(Sender: TObject;Key: Char); begin if Key=#13 then Edit2.SetFocus end; Ответ отправлен: 06.09.2003, 10:03 Отправитель: Cybernetic Creature Отвечает Vdr
Добрый день, Владимир! Можешь обробатывать сообщение OnKeyDown. И проверять - если нажат Enter то меняешь ActiveControl формы. Удачи! Ответ отправлен: 05.09.2003, 15:19 Отправитель: Vdr Отвечает --- Нет данных ---
Доброе время суток, Владимир! Своства нету такого. Надо обрабатывать событие при нажатии клавиши и по "Энтэру" менять фокус ввода. Ответ отправлен: 05.09.2003, 16:45 Отправитель: --- Нет данных --- Отвечает kvINT
Здравствуйте, Владимир! По вопросу 891 - наверно, можно как-нибудь телепатически. По этому вопросу - попробуй использовать событие OnKeyPress и если Enter нажат передавать фокус (не проверял, но ничего больше в голову не пришло). Ответ отправлен: 05.09.2003, 16:50 Отправитель: kvINT
Вопрос № 894
Клавиша Shift. Есть ли у нее код, который можно присвоить переменной Key в обработчике события OnKeyPress? Теперь здравствуйте, ув. эксперты. Пожелание администраторам - чтобы в кратком перечне вопросов пропускалась 1-я строка, если она содержит слова типа "Здравствуйте", думаю, это несложно будет сделать. К вопросу. Для чего нужно - DBGrid заполняется значениями из IBQuery. Требуется нек-рым строкам сделать update (флаг поменять), чтобы только эти строки были видны в другом гриде. Не проблема, если делать по одной строке. Хочу же, чтобы можно было выделить диапазон строк - допустим, нажата клавиша Shift - выделяется первая строка, затем нажатие на Shift на другой строке - выделяется все, что между ними. Короче, как в экселе и др. программах. Если это можно сделать каким-то другим способом, а не в OnKeyPress - плиз, поделитесь.
Здравствуйте, Loko! pishite v OnKeyDown ili OnKeyUp if (ssCtrl in Shift)and (Key='D') then ShowMessage('You press "Ctrl+D"') ssShift - Shift ssCtrl - Ctrl ssAlt - Alt Ответ отправлен: 06.09.2003, 10:03 Отправитель: Cybernetic Creature Отвечает --- Нет данных ---
Добрый день, Loko! Хм... ну там одном из обработчиков событий есть специальный параметр в который передается состояние функциональных клавиш, в том числе и шифта. поищи хорошенько (сорри, под рукой делфи просто нету)
Ответ отправлен: 09.09.2003, 17:30 Отправитель: --- Нет данных ---
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.