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

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

Автор: X11
Дата сообщения: 14.05.2012 09:56
Вопрос по поиску.
DataController.Search выполняет поиск на полное совпадение, а можно его заставить искать на частичное совпадение?

Добавлено:
То ли лыжи не едут...


ARecordIndex := grid.DataController.FindRecordIndexByText(grid.DataController.FocusedRecordIndex,
grid.DataController.GetItemByFieldName('TEL').Index,
edSearch.Text,
True, True, True);// включен поиск на частичное совпадение

ARecordIndex всегда -1, хотя в столбце явно есть искомый текст

или FindRecordIndexByText выполняет поиск только по начальным символам, как это реализовано в IncSearch? В справке подробной инфы не нашёл

Добавлено:

Цитата:
The function compares strings without case sensitivity. The APartialCompare parameter allows you to specify whether the text being searched must match the display text of a field partially or entirely


Вернее нет информации о том, что совпадение должно быть именно сначала.

Добавлено:
Ага, нашёл

Цитата:

If APartialCompare is True, the function is successful if the search text matches the starting characters of the field text. If APartialCompare is False, strings to compare must be identical.
Автор: X11
Дата сообщения: 14.05.2012 14:21
На "их" сайте когда-то нашёл пример подсветки текста в ячейках:

В указанном месте проблема:
на второй итерации цикла while появляется сообщение об ошибке: Control '' has no parent window.

Хотя их пример у меня работает. Перепроверил, вроде всё одинаково. Стоkбец типа RichEdit,
событий нет.

Что ещё может быть не так?

Код: procedure TfmEdit.HLText(cxGrid1DBTableView1: TcxGridDBTableView);
var
I, FoundPos, StartPosition: integer;
AColumn : TcxGridDBColumn;
ATextToFind: String;
AEdit : TcxRichEdit;
AFind : Boolean;
begin
ATextToFind := edSearch.Text;

cxGrid1.SetFocus;
with cxGrid1DBTableView1 do
begin
AColumn := GetColumnByFieldName('ID');
for I := 0 to ViewData.RecordCount - 1 do
begin
if ViewData.Rows[I].IsData then
begin
ViewData.Rows[I].Focused := True;
OptionsData.Editing := True;
with Controller.EditingController do
begin
cxGrid1DBTableView1.OptionsData.Editing := True;
ShowEdit(AColumn);
AEdit := TcxRichEdit(Edit);
StartPosition := 0;
AFind := True;

while AFind do
begin


//здесь проблема
FoundPos := AEdit.FindText(ATextToFind, StartPosition, Length(AEdit.Text), []);


if not (FoundPos < 0) then
begin
AEdit.SelStart := FoundPos;
AEdit.SelLength := Length( ATextToFind);
AEdit.SelAttributes.Color:=clRed;
AEdit.SelAttributes.Style := [fsBold, fsItalic, fsUnderline];
AEdit.SelLength := 0;
StartPosition := FoundPos + 1;
end
else
AFind := False;
AColumn.Editing := False;
end; //while

// if i = ViewData.RecordCount - 1 then
// Sleep(2000)
// else
// Sleep(250);

end; //with
end;
end;
OptionsData.Editing := False;
end; //with
end;
Автор: mdid
Дата сообщения: 14.05.2012 16:06
X11
так вам подсветка надо?у меня подсветка реализуется так

Код: var
ps : integer;
rect : Trect;
begin
if cxGrid1Level1.GridView.DataController.RecordCount=0 then
exit;

if (not AViewInfo.Visible) or (FindEdit.EditValue=null) then
exit;
ps:=pos(AnsiLowerCase(vartostr(FindEdit.EditValue)),AnsiLowerCase(vartostr(AViewInfo.Value)));
if ps>0 then begin
rect:=ACanvas.Canvas.ClipRect;
rect.Left:=20;
rect.Right:=-20;
rect.Top:=0;
rect.Bottom:=0;
ACanvas.FillRect(rect,65535);//clYellow
end
else
ACanvas.RestoreClipRegion;
Автор: X11
Дата сообщения: 14.05.2012 16:49
Странно, а почему подсвечивается только 2ая колонка?


Добавлено:
Да и хотелось бы мне так, чтобы пользователь ввёл значение, нажал enter и получил результат
у меня есть функция поиска для cxGrid, самописная, но кривовата она.
Автор: Stephex
Дата сообщения: 14.05.2012 17:18
На чистую Win 7 в Virtual Box установлены: Delphi XE2 Trial, DevExpressVCLProducts 11.2.5 Trial, fibplus 7.3 Trial.

Данные поставляются БД Firebird 2.5: cxScheduler-cxSchedulerDBStorage-DataSource-pFIBDataSet-pFIBDatabase(pFIBTransaction).

При cxSchedulerDBStorage1.ResourceID, заданных 1, 2, 3, записи отображаются и добавляются только ко 2 ресурсу, для других ресурсов событие добавляется на весь день. При смене ResourceID на 0, 2, 4, все становится в порядке. Что за глюк?

Настройка cxSchedulerDBStorage: http://www.delphi.int.ru/code/0c694baa
Автор: mdid
Дата сообщения: 14.05.2012 18:59
X11
так это в моем примере только 2? может вы просто во вторую колонку вставили код? код надо вставить в обработчик CustomDrawCell именно вьюхи а не какой то из колонок
Автор: AlexCoRu
Дата сообщения: 14.05.2012 21:00
Тупиковая ситуция получается.
Понадобилось несколько независимых курсоров на один набор данных. Первым делом пришла мысль использовать ClientDataSet, вторым - dbExpress. Но тутже нарисовались проблемки.
SQLDataSet - однонапрвленный, т.е. только чтение. ClientDataSet - кэширует данные. cxGrid в GridMode не кэширует, иначе кэширует, но это вообще прекрасно:
Цитата:
In Grid mode, the data controller's performance is better, but features such as automatic sorting, filtering and summary calculations are disabled. You have to write appropriate event handlers (OnSortingChanged, Filter.OnBeforeChange, OnAfterSummary) to perform these actions.
И сразу же, мордой об стену
Цитата:
Grid mode is automatically switched off when grouping is applied to a grid view.
А группировка мне нужна. Следовательно, хочешь, не хочешь, а два кеша будет.
Можно использовать cxGrid в unbound mode, но как делать обновления? TSQLUpdateObject нету! Посмотрел в сторону EhLib - связка TDBXDataDriverEh->TMemTableEh->TDataSource->TDBGridEh то, что надо, но грид у них глючный. Как можно что похожее реализовать для dev?
Да, и в unbound mode можно сразу забыть про lookup editы.

Добавлено:
И ещё интересно, как работает связка cxGrid и dxMemDataSet? Тоже гоняет одно и тоже из кэша в кэш?
В EhLib DBGridEh "эксплуатирует" MemTableEh по-полной, в т.ч. и при группировке.
Автор: X11
Дата сообщения: 15.05.2012 09:17

Цитата:
X11
так это в моем примере только 2? может вы просто во вторую колонку вставили код? код надо вставить в обработчик CustomDrawCell именно вьюхи а не какой то из колонок

именно во вьюху и вставляю

полный код:


Код:
procedure TfmEdit.GridDB1CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
Var
ps : integer;
rect : Trect;
begin
if cxGrid1Level1.GridView.DataController.RecordCount = 0 then
exit;

if (checkHighLight.EditValue = false) or (edSearch.Text = '') then
exit;

ps := pos(AnsiLowerCase(edSearch.text), AnsiLowerCase(vartostr(AViewInfo.Value)));

if ps > 0 then
begin
rect := ACanvas.Canvas.ClipRect;
rect.Left := 20;
rect.Right := -20;
rect.Top := 0;
rect.Bottom := 0;
ACanvas.FillRect(rect, $00A3FAF5);//св. желтый
end
else
ACanvas.RestoreClipRegion;

end;

Автор: AlexCoRu
Дата сообщения: 15.05.2012 10:10

Цитата:
а если cxGrid, но там отключить Синхронизацию?
DataController.DataModeController.SyncMode := False
Такой вариант полностью б устороил, но при этом нельзя править в гриде, придётся использовать отдельные формы для редактирования.
Автор: Baklan_vs
Дата сообщения: 15.05.2012 10:48
Уважаемое сообщество, у меня вопрос:
Некто не сталкивался с расположением кнопок в TdxBar справа на форме.
при выставлении свойства у кнопки в Align = iaRight кнопка пристыковывается к правому краю.
Но пристыковать 2,3... и Т.Д. кнопки не получается.
Как можно решить данную проблему?
Автор: mdid
Дата сообщения: 15.05.2012 11:06
Baklan_vs
создаете 2 dxBar на одной строке...у левого UseRestSpace=true....а правый с кнопками
при этом если форму можно растягивать то в событие OnResize формы

Код: ButtonsBar.DockedLeft:=width-15;
Автор: Baklan_vs
Дата сообщения: 15.05.2012 11:36
mdid
Я хочу это сделать на fsMDIForm(MainForm) в MainMenu.
Где Menu где меню строится динамически.
Если использовать предложенный вами метод то при большои кол-ве пунктов, MainMenu будет выглядеть не очень.
Может существует стандартный способ(что-бы DxBar был 1)? который я проглядел?
Автор: mdid
Дата сообщения: 15.05.2012 11:43
Baklan_vs
стандартного не нашел...сам когда то долго искал...а так как я уже давно записал себя в извращенцы то извратился и тут...если найдете стандартный способ запихнуть кнопки справа...писните плиз...хотя не совсем понял вашу проблему..ну и что что динамически?создайте 2 dxBar и динамически добавляйте кнопки в правый...может скрин выложите и покажите что не устраивает?а то я не могу представить вашу проблему и значение "выглядеть не очень"
Автор: Bill_PHO
Дата сообщения: 15.05.2012 12:59
Не подскажет ли кто, каким образом в cxGridDBTableView можно добраться до фильтров, т.е. выяснить, что отфильтровано пользователем, чтобы сформировать другой запрос к таблице, содержащий текущие параметры фильтрации и дополненный еще чем-то?
Автор: X11
Дата сообщения: 15.05.2012 13:10
а в справке нет инфы?

Добавлено:
DataController.Filter
DataController.Filter.Root
Автор: Bill_PHO
Дата сообщения: 15.05.2012 13:13
X11
Спасибо
Автор: 63madman90
Дата сообщения: 18.05.2012 09:42
Здравствуйте, у меня следующая проблема.
Использую PivotGridControl для отображения списка векторов (VectorsList). Сам вектор(Vector) имеет свойства. И я в PivotGridField устанавливаю {FieldName = "Название свойства"}. Но свойство из Vector - public List<VectorKey> VectorKeys не хочет отображаться. Сам VectorKey состоит из 2х свойств (как Dictionary<>). Мне нужно, чтобы в PivotGridField отображался список одного из свойств VectorKey. Наверное как-то запутанно получилось((
Автор: neznayka3
Дата сообщения: 21.05.2012 08:10
как программно скрыть TdxDockPanel, чтобы остался только tab с заголовком? и как проверить, что он закрыт/открыт?
Автор: mdid
Дата сообщения: 21.05.2012 10:47
задача простая как два пальца...но пипец или лыжи не едут или как обычно..
в общем есть TextEdit на dxBar и является он поиском по гриду...задача состоит в том что бы после подтверждения данных и отфильтровки...переместить фокус на грид для передвижения на нем стрелками...и блин хоть убейте не могу
я уже пробовал


Код:
cxGrid1.SetFocus;
BookView.Focused:=true;
BookView.DataController.GotoFirst;
BookView.DataController.SetFocus;
Автор: X11
Дата сообщения: 21.05.2012 11:04
может просто реагировать в самом Edit`е на клавиши стрелок и забить на фокусировку грида?

В OnKeyDown

if key = vk_up then <TcxGridDBTableView>.Datacontroller.Up;
if key = vk_down then <TcxGridDBTableView>.Datacontroller.Down;

ну как-то так
Автор: mdid
Дата сообщения: 21.05.2012 11:08
X11
так это уже дело чести...я второй день над этим долбаюсь...самое ж интересное если самому мышкой жмакануть на вьюхе(то есть вручную поставить фокус) то все отлично двигается...посему затык именно в том как передать фокус вьюхе....наверно придется через sendmessage
Автор: neznayka3
Дата сообщения: 21.05.2012 11:34
mdid
Hide и Visible=false полностью скрывает панель вместе с заголовком.
Автор: mdid
Дата сообщения: 21.05.2012 13:21
в общем дурдом...что бы добиться фокуса на вьюхе делал так(мож у кого то те же проблемы)
в событии OnKeyDown

Код:
if key=13 then begin
RefreshTable;
FindEdit.SetFocus; <=строка поиска..иначе шиш
cxGrid1.SetFocus;
end;
Автор: Baklan_vs
Дата сообщения: 21.05.2012 15:32
mdid
для передачи фокуса гриду попробуй
FocusControl(TcxGridDBTableView);
Автор: mdid
Дата сообщения: 21.05.2012 15:38
Baklan_vs
очень сомневаюсь...у вьюхи нет handle...но ща попробую

попробовал...как и прогнозировалось еррор...а передача фокуса гриду дала тот же эффект что и cxGrid1.SetFocus; то есть никакого...оставил свой извращенный вариант
Автор: Baklan_vs
Дата сообщения: 21.05.2012 15:50
mdid
FocusControl(cxGrid1);
cxGrid1TableView1.DataController.FocusedRecordIndex:=0;
проверил работает =)
Выделяется первая строка.
Автор: mdid
Дата сообщения: 21.05.2012 16:27
Baklan_vs
она то выделяется но фокус на нее не передается...то есть срабатывает селект а не фокус...попробуйте стрелками перемещаться
Автор: Baklan_vs
Дата сообщения: 21.05.2012 16:37
mdid
В том-то и дело, что перемещение работает =)
если использовать обе строки кода, что я написал.
cxGrid1TableView1.DataController.FocusedRecordIndex:=0; // просто ставится в фокус, без первой строки выделение еле заметно на гриде, какбуд-то после выделения он потерял фокус.
а вот с первой строкой фокус нормальный как после клика мышкой =))) срока выделения синенькая.
Автор: X11
Дата сообщения: 21.05.2012 16:45
сделайте потом ещё


Код: with <TcxGridDBTableView> do
if DataController.RecordCount > 0 then
Controller.FocusedRow.Selected := True;
Автор: mdid
Дата сообщения: 21.05.2012 16:47
Baklan_vs
везунчик)) у меня он хрен знает де гуляет
X11
о! как вариант...пасиб

проблема в том что на ранних версия я передавал фокус гриду а потом вьюхе..и все работало..а ща видимо уже приведения завелись в проекте

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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