Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 3)

Автор: maratea
Дата сообщения: 23.12.2009 10:48
vladman
Прошу прощения, действительно пропустила, ибо обратила внимание только на начало сообщения. Спасибо) тот способ тоже попробую, вдруг получится.

Строчка формируется в OnGetDisplayText, но при попытке выставить AUseNativeFormat = False все вообще повисло, а потом вылетело. К тому же, если я правильно понимаю, это немного не то, поскольку экспортируются всё равно именно Values, а этот параметр просто задает формат, в котором они должны быть представлены в Excel.

Похоже, надо-таки браться за собственный экспорт. =\ все равно пригодится еще...

UPD. первая проблема разрешилась, спасибо огромное!)
правда, это только начало)
Автор: f3ka
Дата сообщения: 23.12.2009 11:03
X11
может все таки if DataSet1.Locate('ID', i2,[] ) then Continue; тормозит? записей дубликатов много?
Автор: vladman
Дата сообщения: 23.12.2009 13:02
maratea

Цитата:
К тому же, если я правильно понимаю, это немного не то, поскольку экспортируются всё равно именно Values, а этот параметр просто задает формат, в котором они должны быть представлены в Excel.

Посмотрите здесь: Export to Excel - Display texts, not actual values
Автор: maratea
Дата сообщения: 23.12.2009 13:07
vladman
хм, там написано именно то, что вы говорили. Значит, буду ловить свою ошибку.

UPD. Сработало! Так и не поняла, в чем была проблема) Спасибо огромное!
Автор: vladman
Дата сообщения: 23.12.2009 13:10
X11

Цитата:
Вот код, может я что-то забыл?

Действительно, зачем if DataSet1.Locate('ID', i2,[] ) then Continue;
Locate - это крайне медленная операция, если еще взять во внимание, что для DataSet1 может быть определен обработчик AfterScroll. Намного быстрее будет очистить весь DataSet1 и заполнить новыми данными без дополнительных проверок.
Автор: X11
Дата сообщения: 23.12.2009 13:27

Цитата:
может все таки if DataSet1.Locate('ID', i2,[] ) then Continue; тормозит? записей дубликатов много?

Записей даже очень мало. До сотни.
Даже на 10 записей заметно медленно работает.

Добавлено:

Цитата:
Действительно, зачем if DataSet1.Locate('ID', i2,[] ) then Continue;

чтобы второй раз не добавлять в таблицу одни и те же записи

Добавлено:

Цитата:
Намного быстрее будет очистить весь DataSet1 и заполнить новыми данными без дополнительных проверок.

Нет, логика отправки во вторую таблицу такова:
Пользователь выполнил поиск записей согласно требуемых параметров, они отобразились в гриде. Он выделил несколько записей и отправил в спец. таблицу, назовём её Таблица отбора. Далее пользователь может выделить ещё отсортировать, отфильтровать грид, затем опять отправить несколько записей в таблицу отбора. Затем указать новые параметры поиска и сделать выборку из базы, не теряя данные в таблице отбора, и опять из новой выборки выделенные записи отправить в таблицу отбора. Чтобы потом с записями в таблице отбора что-то делать: редактировать, печатать, экспортировать и т.д.
Раньше была связка везде MemTable + DBGridEh, а сейчас всё девовское. Работает медленно. Не могу понять в чём дело.
Вот только что проэесперементировал. 10 записей выделил и отправил в таблицу отбора - 7 секунд. А если 100 записей то и думать боюсь. Это при том, что проц двухядерный интел и 2 гига памяти.
Автор: f3ka
Дата сообщения: 23.12.2009 13:38
X11
как я вижу, проверка на уникальность по одному полю, может сделать какой нить TList и туда заносить добавленные записи, а поиск на уникальность делать не по датасету, а по TList... возможно все таки оно спасет от тормозов...
Автор: X11
Дата сообщения: 23.12.2009 14:07
UPD

ПопробуЮ. А что-то типа индексов нет у dxMemData?


Цитата:
может сделать какой нить TList

Попробую с массивом работать, массив легче и быстрее списка.
Автор: f3ka
Дата сообщения: 23.12.2009 14:11
X11
возможно есть, но мне особо не надо было никогда...
и я еще одну вещь заметил в коде... почему не делаете DataSet1.DisableControls? он ведь на сколько я понимаю привязан к гриду? если так, то тормоза именно из-за того что при Locate, а также при Append грид пытается перерисовываться...
Автор: vladman
Дата сообщения: 23.12.2009 14:46
X11 f3ka

Цитата:
DisableControls

Еще лучше использовать <YourcxGridDBTableView>.BeginUpdate/EndUpdate при выполнении "больших" скроллингов/удалений/вставок
Автор: X11
Дата сообщения: 23.12.2009 15:36

Цитата:
почему не делаете DataSet1.DisableControls? он ведь на сколько я понимаю привязан к гриду? если так, то тормоза именно из-за того что при Locate, а также при Append грид пытается перерисовываться...

При отправке данные в таблицу отбора (DataSet1) грид невидим, т.к. два грида лежат на одном и том же PageControl`е, но на разных страничках.

В любом случае спасибо за замечание, обязательно попробую и DisableControls и совет vladman`а

Цитата:
<YourcxGridDBTableView>.BeginUpdate/EndUpdate


Автор: V1s1ter
Дата сообщения: 23.12.2009 15:44
X11
Из всего что говорили другие все имеет место.
Но мне кажется, что на 10 записях все равно не должно тормозить.
Включены ли скины, они тоже неплохо "помогают".
Настоятельно рекомендую "профайлить" проект, ну например с помощью AutomatedQA AQTime. Потому как неприятность может быть в другом, ну например в образовании нескольких скрытых вложенных циклов, Вы думавете что цикл по 10 записям, а оказывается в каждом из десяти еще по 9, в котором еще по 8 и т.д.

Добавлено:

Цитата:
А что-то типа индексов нет у dxMemData

Да имеется.

Цитата:
Попробую с массивом работать, массив легче и быстрее списка.

Может оказаться, что Вы не правы. List и есть массив, плюс реализация "защиты" от дубликатов. Мне кажется что dxMemData наиболее оптимальный вариант с точки зрения объемов написания собственного кода.
Автор: X11
Дата сообщения: 23.12.2009 15:54

Цитата:
Настоятельно рекомендую "профайлить" проект, ну например с помощью AutomatedQA AQTime.

К моему великому сожалению, я не знаю, что такое "профайлить" и про AutomatedQA AQTime только слышал. За то есть к чему стремиться )))


Цитата:
Включены ли скины, они тоже неплохо "помогают".

Нет, всё в NativeStyle. Приложение ужасно тормозит при использовании скинов для грида.


Цитата:
Вы думавете что цикл по 10 записям, а оказывается в каждом из десяти еще по 9, в котором еще по 8 и т.д.

Угу, будем смотреть, спасибо за подсказки и замечания.
Автор: V1s1ter
Дата сообщения: 23.12.2009 15:56
И еще, я пропустил, что за движок ДБ Вы используете, может вместо Locate можно что-то типа "select count(Id) where Id = <параметр>".
Автор: Cryogen2003
Дата сообщения: 23.12.2009 16:00
Чего то понять не могу.
Есть девовский грид, есть в нем уровень один, в котором есть DB TableView, есть второй уровень со своим DB TableView. В датасете первого уровня установлен AfterScroll, при котором обновляется датасет для второго TableView. Данные получаются, но почему-то во втором TableView ничего не показывается. В чем собака зарыта?
Автор: V1s1ter
Дата сообщения: 23.12.2009 16:00
X11

Цитата:
сожалению, я не знаю, что такое "профайлить" и про AutomatedQA AQTime только слышал

AutomatedQA AQTime позволяет получить протокол в котором видно сколько времени уходит на ту или иную операцию, например по по процедурам.
Потратив пару часов на установку и изучение Вы во всех подобных случаях будете иметь инструмент позволяющий оптимизировать прогаму там где это действительно нужно.
Автор: f3ka
Дата сообщения: 23.12.2009 16:12
Cryogen2003
а точно для второго уровня не потеряли DataBinding?
еще возможно что где то используется BeginUpdate/EndUpdate для второго TableView, вроде нельзя так делать (это не точно)
Автор: Cryogen2003
Дата сообщения: 23.12.2009 16:14
f3ka
BeginUpdate для второго TableView убрал, все равно пусто
Автор: f3ka
Дата сообщения: 23.12.2009 16:22
Cryogen2003
то есть хочется сделать Master-Detail средствами cxGrid? тогда наверно не правильно построена логика программы... нет необходимости вручную делать выборку для данных второго уровня...
Автор: Cryogen2003
Дата сообщения: 23.12.2009 16:23
f3ka
АГА, именно так. Но пока еще не понял, где я дурак.

Добавлено:
Объясни, что должен установить для Master и Detail
Автор: X11
Дата сообщения: 23.12.2009 16:26

Цитата:
И еще, я пропустил, что за движок ДБ Вы используете

Firebird + Fibplus.



Цитата:
может вместо Locate можно что-то типа "select count(Id) where Id = <параметр>".

Нет, ведь проверку на дубликаты нужно выполнять в dxMemData, т.к. именно в dxMemData отправляются записи.
Автор: Cryogen2003
Дата сообщения: 23.12.2009 16:33
Эх, хелпы прочитал, понял уже вроде все

Добавлено:
Вот только не понятно, почему скролл во второй таблице не работает. Можно как-нибудь его включить?
Автор: f3ka
Дата сообщения: 23.12.2009 16:38
Cryogen2003
есть хелп то к девкам? если нет то качать отсюда, и там читать про Master-Detail... много букв, пересказывать лень...
Автор: Cryogen2003
Дата сообщения: 23.12.2009 16:48
f3ka
Да прочитал я там все, понял что дурак был, вторая таблица заработала, все ок.
Но я не понял, почему во второй таблице если дергать за скролл-бары, то все работает, но не мышка, не клава во второй табличке просто не работает.

Добавлено:
То есть понять, как включить там бы клаву и мышку
Автор: V1s1ter
Дата сообщения: 23.12.2009 17:31
X11
Обратил внимание, что в моем проекте тоже есть использование dxMemData и я просто тупо вставил пару строк на добавление 1000 записей и Locate 1000 записей по НЕ ключевому полю, все выполнялось менее секунды. Может начать с простой процедуры где просто по циклу добавлять записи, потом по процедурно наращивать функционал и смотреть зде начнет затыкаться?
Автор: afiget
Дата сообщения: 23.12.2009 21:31
X11
Пройдись пошагово хотя бы для 10 записей, может быть сразу увидишь где проблема, если она в этой процедуре.
Автор: V1s1ter
Дата сообщения: 23.12.2009 22:08
afiget

Цитата:
Пройдись пошагово хотя бы для 10 записей, может быть сразу увидишь где проблема,

Навряд ли, 7 секунд на 10 записей это 0.7 секунды на запись. В режиме отладчика визуально этот момент маловероятно выделить IMHO.
Автор: ShamaN
Дата сообщения: 24.12.2009 08:25
Подскажите, как сделать у закладок PageControl многострочный Caption?
Автор: ZalivkoDenis
Дата сообщения: 24.12.2009 09:08
Доброго времени суток!
Есть проблемка: Главная форма TdxRibbonForm со свойством SupportNonClientDrawing=True. Так вот, выполнял и в конструкторе Create и в эвенте OnShow команду WindowState := wsMaximized; а форма ведёт себя как-то странно -- смещается верхний заголовок вниз, да и сама форма как-то внизщ смещается. Но, что касается системы (например, можно определить по пиктограммам в заголовке окна), форма действительно максимизирована. После повторной максимизации (например, клика по пиктограмме или двойного клика на заголовок) форма отображается корректно. Что же я делаю не так? (заманался уже )
Спасибо за помощь!

Добавлено:
Млин, рзаобрался... Только это не совсем правильно на мой взгляд. Поставил свойство формы (главной, естествено) Position = poDefault и всё прокатило. (до этого стояло poDesktopCenter)... М-да...
Спасибо всем.
Автор: afiget
Дата сообщения: 24.12.2009 09:37

Цитата:
это 0.7 секунды на запись. В режиме отладчика визуально этот момент маловероятно выделить

Я обычно могу определить задержки около 300мс. Это заметно визуально. По крайней мере, на фоне быстрого перехода по строкам задержка в 0.5с должна быть заметна глазу.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.