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

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

Автор: Mzman
Дата сообщения: 27.09.2010 10:18
На форме лежит компонент cxCheckListBox,который заполняется автоматически значениями из базы данных(очень медленный процесс).
Как отключить прорисовку этого компонента для увеличения быстродействия?
Автор: f3ka
Дата сообщения: 27.09.2010 10:34
Mzman
Разве в этом компоненте нет стандартных BeginUpdate/EndUpdate?
Автор: Mzman
Дата сообщения: 27.09.2010 10:39
f3ka
Может и есть...Вы можете привести пример?
Автор: f3ka
Дата сообщения: 27.09.2010 10:56
Mzman

Код:
<cxCheckListBox>.Items.BeginUpdate;
<НАПОЛНЕНИЕ>
<cxCheckListBox>.Items.EndUpdate;
Автор: Mzman
Дата сообщения: 27.09.2010 11:02
f3ka
Изумительно!
Большое спасибо.
Автор: bekturov
Дата сообщения: 27.09.2010 18:21
AvGSoft

дык, несколько раз проверял, на 52 косячит, на 48 нет
Автор: TechnoDreamer
Дата сообщения: 28.09.2010 03:20
cxGrid, есть столбец с properties=LookupComboBox

Необходимо фильтровать выпадающий список на основе вводимого текста. Как это сделать? Пытался в OnChange, но свойство (Sender as TCxLookupComboBox).Text выдает полное имя первого подходящего элемента в списке.

Например список:
Item1
Item2

начинаю вводить It
Text будет равен 'Item1', а вот как узнать именно 'It'?
Автор: marser
Дата сообщения: 28.09.2010 07:53
TechnoDreamer

Цитата:
...Необходимо фильтровать выпадающий список на основе вводимого текста. Как это сделать?...

Properties.IncrementalFiltering := True; Или вы хотите задать свои правила фильтрации?
Автор: X11
Дата сообщения: 28.09.2010 09:06

Цитата:
Text будет равен 'Item1', а вот как узнать именно 'It'?

ничё не понял

Добавлено:

Цитата:
cxGrid, есть столбец с properties=LookupComboBox

Необходимо фильтровать выпадающий список на основе вводимого текста. Как это сделать?

Должен же автоматически фильтроваться.
Но у меня так и не получилось.
Я сделал колонку с типом PopupEdit и вставил туда другой cxGrid с одной колонкой.

в свойстве Onpopup колонки у первого (основного) грида

Код: dbgStreets.DataController.LocateByKey(dbgArenda.DataController.Values[dbgArenda.DataController.FocusedRecordIndex, dbgArendaID_STREET.index]);
Автор: CrazyMan86
Дата сообщения: 28.09.2010 09:53
Добрый день, только начала общение ДевЭкспресс
Скачал у них хелп, но не смог найти там некоторых простых компонент - конкретно интересует TcxGrid. Может кто подсказать, где взять почитать??
Автор: f3ka
Дата сообщения: 28.09.2010 10:13
CrazyMan86
надо уточнять что скачали и откуда... в хелпе который здесь все есть.
Надо читать про QuantumGridSuite
Автор: CrazyMan86
Дата сообщения: 28.09.2010 10:55
Спасибо, просто по КвантумГриду не додумался почитать, нашел блог в нете
http://delphi2010.ru/?p=335
но там в принципе то, что я уже понял. А если у меня к datasource подключен не Table, а Query. Пользуюсь ADO. Не могу вручную добавить столбцы, щас покапаюсь, наверно все найду.
Если есть у кого простенький примерчик для работы TcxGrid - буду оч благодарен за ссылочку.
Автор: TechnoDreamer
Дата сообщения: 28.09.2010 14:39
marser

Цитата:
Properties.IncrementalFiltering := True; Или вы хотите задать свои правила фильтрации?


Да, мне нужна именно фильтрация, а не инкрементный поиск. Нужен фильтр типа:
Name LIKE ''%Текст_из_грида%"
Автор: mdid
Дата сообщения: 28.09.2010 14:48
драсте...можно ли в MemData отфильтровать значения и получить их количество не перебирая?и если можно как?а то я что то мало чего понимаю по фильтрации в MemData..
нарыл пример типа

Код:
dxMemData1.FilterOptions:=[foCaseInsensitive];
dxMemData1.Filter:='sz>1024';
dxMemData1.Filtered:=true;
Автор: TechnoDreamer
Дата сообщения: 28.09.2010 15:43
mdid, RecordCount показывает количество учитывая фильтр. По крайней мере для всех наследников TDataSet что я видел. С dxMemData не работал, но думаю и там так же.
Автор: mmi
Дата сообщения: 28.09.2010 15:49
mdid

Цитата:
но жить легче не стало...хелп плз


Боюсь Вас расстроить, но по-моему, TdxMemData можно отфильтровать только через реализацию обработчика события OnFilterRecord. Свойства Filter и FilterOptions наследуются данным компонентом от TDataSet, но в исходном коде никак не используются.
Автор: TechnoDreamer
Дата сообщения: 28.09.2010 16:04
Да, mmi прав. Этот компонент мертв и более не разрабатывается. Фильтровать надо ручками:
http://www.devexpress.com/Support/Center/KB/p/A999.aspx
Автор: mdid
Дата сообщения: 28.09.2010 16:08
TechnoDreamer
не работает...я продалбался минут 50 перед тем как спрашивать..RecordCount проверил один из первых
mmi
блина...таки расстроили...неимоверно тупо будет вручную фильтровать

ПС
оффтоп
а какой компонент это позволяет?я ща мучаю TJMemoryData там дела по веселей...на фильтр реагирует но нет свойства которое показывало б количество отфильтрованного..там RecordCount это полное количество
Автор: mmi
Дата сообщения: 28.09.2010 17:09
mdid

Цитата:
не работает...я продалбался минут 50 перед тем как спрашивать..RecordCount проверил один из первых


C TJMemoryData к сожалению не работал, но если на TdxMemData фильтрацию сделаете через OnFilterRecord, то RecordCount покажет нужное Вам количество.
Автор: mdid
Дата сообщения: 28.09.2010 20:54
mmi
пасиб..та справку то я читал...просто как то не верилось что сортировка у них ручная или неудобная
ПС
на свой же вопрос
TMemTableEh из ehLib это умеет
Автор: TechnoDreamer
Дата сообщения: 30.09.2010 01:38
Я всё же со своей проблемой более детально:



Вот в данном случае я ввожу символы "la", контрол автоматом добавляет туда полное имя первого элемента. И свойство Text соответственно равно не "la" а полному тексту.
Каким то образом получить только ту часть что введена пользователем можно?

P.S. Вообще цель сделать фильтрацию по всему тексту, а не только по первым символам.
Т.е. к примеру есть две записи: "оранжевый апельсин" и "апельсин оранжевый", пользователь начинает набирать "апельсин" и ему нужно выводить обе записи, а не только вторую. Может я вообще не в ту сторону смотрю и всё намного легче?
Автор: X11
Дата сообщения: 30.09.2010 09:10

Цитата:
P.S. Вообще цель сделать фильтрацию по всему тексту, а не только по первым символам.
Т.е. к примеру есть две записи: "оранжевый апельсин" и "апельсин оранжевый", пользователь начинает набирать "апельсин" и ему нужно выводить обе записи, а не только вторую. Может я вообще не в ту сторону смотрю и всё намного легче?

А мой метод не подошёл?
Автор: Prizzzrak777
Дата сообщения: 30.09.2010 13:42
Может быть немного не по теме, но вопрос в следующем:
есть TMemTableEh или ClientDataSet или dxMemData, т.е. данные хранятся в памяти. Компоненты лежат в DataModule. Данные заполняются в новом потоке. Если формы с cxGrid или DBPivotGrid не отображаются все проходит гладко. Если обновление данных происходит при отображение грида вылетает AccessVioletion, list index bound,invalid pointer operation, access priveligies ошибки 1400 (Недопустимый дескриптор окна) и 5 (отказано в доступе). Каждый раз по разному обычно все сводится к Access Violetion и этим ограничивается.
При заполнении из основного потока все происходит гладко и никакого намека на ошибки.
Может кто пытался делать что то подобное?

Обычный DBGrid отробатывает нормально. Synchronize решает проблему но это не вариант. Для создания потока использую стандартный класс TThread
Автор: f3ka
Дата сообщения: 30.09.2010 13:59
Prizzzrak777
отключить перерисовку контролов при заполнении датасета из потока.
DisableControls/EnableControls. или у самих контролов BeginUpdate/EndUpdate
Автор: Prizzzrak777
Дата сообщения: 30.09.2010 14:01
f3ka
пробовал ничего не менялось. Отключал естественно из созданного потока

Добавлено:
Даже DataSource отрубал на момент загрузки данных. При подключении те же ошибки

Добавлено:
Хотя может не то и не там отключал

Код:
Form3.cxDBPivotGrid1.BeginUpdate;
Form3.cxDBPivotGrid1.DataSource:=nil;

with DataModule2 do
begin
DataSource1.Enabled:=false;
MemTableEh1.EmptyTable;

for I := 0 to 100 do
begin
dxMemData1.Append;
dxMemData1test1.Value:=i*100;
dxMemData1test2.Value:=i*200;
dxMemData1test3.Value:='pos1';

dxMemData1.Post;
dxMemData1.Append;
dxMemData1test1.Value:=i*300;
dxMemData1test2.Value:=i*400;
dxMemData1test3.Value:='pos2';
dxMemData1.Post;
end;
DataSource1.Enabled:=True;
end;
Form3.cxDBPivotGrid1.DataSource:=DataModule2.DataSource1;
Form3.cxDBPivotGrid1.EndUpdate;
Автор: f3ka
Дата сообщения: 30.09.2010 14:20
Prizzzrak777
имхо отключение надо делать не в ПОТОКЕ, а до начала потока... это относиться и к подключению, после потока... или в потоке но только через Synchronize.
Автор: Prizzzrak777
Дата сообщения: 30.09.2010 14:23
f3ka
Спасибо

Добавлено:
C DBPivotGrid понятно, правда запяси исчезают на время обновления и это занимает некоторое время. А вот с cxGrid остается ошибка 5 (Отказано в доступе). На гриде 3 сорса, 2 клона, и того 5 уровней.
Автор: marser
Дата сообщения: 30.09.2010 16:19
Prizzzrak777
Я смутно вспоминаю, что сталкивался с чем-то подобным. Меня спасло явное отключение DataSet от всех DataSource (DataSource.DataSet := nil) до начала потока и подключение DataSet (DataSource.DataSet := DataSet) после завершения потока.
Автор: BlackVetal
Дата сообщения: 01.10.2010 05:15
Prizzzrak777
Не знаю как в Делфях - в .Net есть такой способ запускать поток отдельный - BeginInvoke(). Обычно он переопределяется с указанием нужных параметров (контролы и компопненты, например, передавать). Я таким способом делал 2 потока: один заполнял а другой отображал прогресс выполнения задачи.
Автор: TechnoDreamer
Дата сообщения: 01.10.2010 08:27
X11

Цитата:
P.S. Вообще цель сделать фильтрацию по всему тексту, а не только по первым символам.
Т.е. к примеру есть две записи: "оранжевый апельсин" и "апельсин оранжевый", пользователь начинает набирать "апельсин" и ему нужно выводить обе записи, а не только вторую. Может я вообще не в ту сторону смотрю и всё намного легче?
А мой метод не подошёл?


Ну вы написали как пользоваться PopupEdit - это я и так умею. Только то, что там в Popup будет Grid мне ничего не дает. Как фильтровать грид на основе вводимых символов я тоже не знаю.

P.S. Можно конечно в OnKeyPress строить строку на основе нажатых кнопок, но слишком геморрный способ.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


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