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

» Использование DevExpress

Автор: IShIgor
Дата сообщения: 29.07.2005 10:05
Подскажите...
Кто работал с TcxListView под D7.
Столкнулся с такой проблемой. ListView нормально работает до тех пор пока у элементов не используется Object. Как только Object содержит что-то, ListView после 2-3 заполнения перестает отрисовываться на экране - такое ощущение, что где-то внутри себя зацикливается... Проверял на самом простом объекте, содержащем только одно целое значение и при событии OnDelete этот объект освобождается.
И вообще по сравнению со стандартым ListView тормоза жуткие...
Может кто чего-нибудь что сказать, посоветовать?
Автор: golkanavt
Дата сообщения: 29.07.2005 10:39
IShIgor
под D6 такой проблемы нет, может дело именно в твоей комбинации?
Автор: XPSDim
Дата сообщения: 29.07.2005 10:46
To Alex47

Не важно на какой группе стоит фокус. Ищем по всей таблице 3-го уровня. В случае с price_num - результат посика однозначен, поскольку поле - уникальное. Ну да это частный случай.


Вариант с GetDetailDataController - наверное то что нужно, только не понятно что передавать в качестве второго параметра (ARelationIndex)? В справке почему-то описание отсутствует.

Автор: Alex47
Дата сообщения: 29.07.2005 11:43
XPSDim

Цитата:
(ARelationIndex)?

Можно ставить 0
Автор: Case
Дата сообщения: 29.07.2005 12:21
Доброго времени суток.
Такой вопрос: как проще всего зделать в cxGrid некий аналог PickList в EhLib, что бы юзверю упростить ввод уже сущестувующих значений из даного поля?
Автор: XPSDim
Дата сообщения: 29.07.2005 13:06
To Alex47

RecordIndex := TcxGridDBTableView(cxGrid.FocusedView).DataController.FocusedRecordIndex;
RecordId := TcxGridDBTableView(cxGrid.FocusedView).DataController.GetRecordId(RecordIndex);
tmpDataCont2:=TcxGridDBTableView(cxGrid.FocusedView).DataController.GetDetailDataController(RecordIndex,0);
TcxGridDBDataController(tmpDataCont2).LocateByKey(tblItemsDetal.FieldByName('id_master').AsInteger);
tmpDataCont3:=TcxGridDBDataController(tmpDataCont2).GetDetailDataController(???,0);


Нашел контроллер 2-го уровня. А вот как получить контроллер 3-го уровня? Ведь фокус все равно остается на первом уровне, даже после TcxGridDBDataController(tmpDataCont2).LocateByKey(tblItemsDetal.FieldByName('id_master').AsInteger);


Добавлено:
To Alex47

Ураа!! Получилось.

Так все это выглядит.

procedure TfrmMain.tbFindClick(Sender: TObject);
var RecordIndex, RecordId, i: integer;
tmpDataCont2, tmpDataCont3: TcxCustomDataController;
begin
tbCollapse.Click;
With TfrmFind.Create(Application) do
begin
if ShowModal=mrOk then
if cbKind.Text='Ïðàéñîâûé íîìåð' then
begin
if not tblItemsDetal.Locate('price_num',edtText.Text,[])
then
Showmessage('Íè÷åãî íå íàéäåíî')
else
begin
RecordIndex := TcxGridDBTableView(cxGrid.FocusedView).DataController.FocusedRecordIndex;
RecordId := TcxGridDBTableView(cxGrid.FocusedView).DataController.GetRecordId(RecordIndex);
tmpDataCont2:=TcxGridDBTableView(cxGrid.FocusedView).DataController.GetDetailDataController(RecordIndex,0);
for i:=0 to TcxGridDBDataController(tmpDataCont2).GridView.ViewData.RecordCount-1 do
begin
if tblItemsDetal.FieldByName('id_master').AsInteger=
strToInt(TcxGridDBDataController(tmpDataCont2).GridView.ViewData.Records[i].DisplayTexts[2])
then
TcxGridDBDataController(tmpDataCont2).GridView.ViewData.Records[i].Focused:=True;
end;
RecordIndex := TcxGridDBTableView(cxGrid.FocusedView).DataController.FocusedRecordIndex;
RecordId := TcxGridDBTableView(cxGrid.FocusedView).DataController.GetRecordId(RecordIndex);
tmpDataCont3:=TcxGridDBTableView(cxGrid.FocusedView).DataController.GetDetailDataController(RecordIndex,0);
for i:=0 to TcxGridDBDataController(tmpDataCont3).GridView.ViewData.RecordCount-1 do
begin
if tblItemsDetal.FieldByName('price_num').AsInteger=
strToInt(edtText.Text)
then
TcxGridDBDataController(tmpDataCont3).GridView.ViewData.Records[i].Focused:=True;
end;
end;
end;
end;
end;

Только как-то все больно закручено. Неужели нельзя проще?
Автор: golkanavt
Дата сообщения: 29.07.2005 13:39
Case
Имеется ввиду именно использование раннее введенных или выбор из заранее определенного набора или же из датасета?
Автор: Alex47
Дата сообщения: 29.07.2005 13:43
XPSDim
Молодец, что добил!
1. Проще может быть получится, если пойдет какой-то вариант только с locate dataset или с фильтром... Но это надо играть конкретно с твоим проектом.
2. Можно для ускорения убрать циклы на втором и третьем уровнях . Искать запись с помощью locateByKey. Думаю locateByKey ставит фокус на запись. Eсли нет, то поставить его ручками. Строку с Locate тоже можно убрать - она нужна только для выдачи сообщения, его можно выдавать по-другому.
Автор: Case
Дата сообщения: 01.08.2005 09:50
golkanavt
Выборка уникальных значений поля из того же датасета...
Мне вот советовали наделать 20 датасетов (у меня допустим 20 полей текстовых). Но мне такая идея не нравится. Вот оно в фильр вытягивает значеения, как бы их заюзать?
Автор: Virtu
Дата сообщения: 01.08.2005 10:06
Приветствую всех!
Что-то не нравится мне как отражает у меня данные cxDBTreeList...
Может я что-то неправильно делаю?
Есть ли у кого пример использования этого компонента ???
Может кто-то помочь?

Добавлено:
Ребяяятки, дайте плиз пример работы с cxDBTreeList.
Неужели жалко???
Автор: golkanavt
Дата сообщения: 01.08.2005 10:36
Virtu
Не жалко, это форум а не чат, и круглые сутки здесь никто не сидит, умей ждать. А чем стандартные демки из набора не устраивают? Что именно тебе не нравится во внешнем виде?
Автор: Virtu
Дата сообщения: 01.08.2005 10:44
golkanavt

Увы, ждать время не терпит... )
Спасибо, что откликнулся, нет у меня демок с исходниками, единственная, что есть - это уже готовый exe'шник. Там все красиво и нормально, у меня получается ерунда...
Например :
Разработка Петров Вася
Разработка Васечкин Петя
Разработка Иванов Ваня

А нужно :
Разработка
|----Васечкин Петя
|----Петров Вася
Автор: golkanavt
Дата сообщения: 01.08.2005 12:35
Выложил демки сюда. Проверяй свойства, DataController->ParentField, KeyField
Автор: Virtu
Дата сообщения: 01.08.2005 13:19
golkanavt
Спасибо большое, сейчас буду смотреть!

Добавлено:
golkanavt
Блин, все правильно делаю, один хрен рисует не так!
По ссылке картинка с результатом работы...

http://up.spbland.ru/files/05080114/
Автор: Alex1978
Дата сообщения: 01.08.2005 14:35
Virtu
Проверь данные и выставь свойство RootValue
Автор: Virtu
Дата сообщения: 01.08.2005 15:02
Alex1978

Самое интересное, что с одной таблицей все работает правильно... а вот с двумя получается бардак-с.... хм...
Автор: Alexandre
Дата сообщения: 01.08.2005 17:43
Добрый вечер мастерам DevExpress!
Подскажите пожалуйста, как в cxComboBox в выпадающем списке значения раскрасить разными цветами, и в зависимости от другого свойства (принимающего значения true или false) сделать некоторые записи жирным.
Автор: xokc
Дата сообщения: 01.08.2005 19:17
См. событие Properties.OnDrawItem - рисуй, что душе угодно
Автор: Alexandre
Дата сообщения: 02.08.2005 08:47

Цитата:
См. событие Properties.OnDrawItem - рисуй, что душе угодно

А не могли бы вы дать маленький примерчик, а то я все уже попробовал и у меня не получается.
Автор: Alex1978
Дата сообщения: 02.08.2005 09:34
Virtu
Работает с одной но не работает с двумя другими? или же с одной работает а с двумя сразу не работает? Вроде он предназначен для работы с одной таблицей, но имхо забей ты на него. руками строй дерево в обычный TcxTreeList и проблем будет меньше. как хошь так и делаешь.
Автор: xokc
Дата сообщения: 02.08.2005 21:31

Цитата:
А не могли бы вы дать маленький примерчик, а то я все уже попробовал и у меня не получается.

Ну вообще-то в хелпе пример есть. Для начала стоит туда заглядывать.
Ну вот еще немного (четные строки - красные):

procedure TForm3.cxComboBox1PropertiesDrawItem(AControl: TcxCustomComboBox; ACanvas: TcxCanvas; AIndex: Integer;
const ARect: TRect; AState: TOwnerDrawState);
var
ATextRect: TRect;
begin
if odSelected in AState then
begin
ACanvas.Brush.Color := clHighlight;
ACanvas.Font.Color := clWhite;
end else
begin
ACanvas.Brush.Color := clWhite;
ACanvas.Font.Color := clBlack;
end;

ACanvas.FillRect(ARect);
if AIndex mod 2 = 0 then ACanvas.Font.Color := clRed;
ATextRect := ARect;
ATextRect.Left := ATextRect.Left + 3;
ACanvas.DrawText(AControl.Properties.Items[AIndex], ATextRect, cxAlignVCenter);
end;
Автор: Alex47
Дата сообщения: 03.08.2005 08:56
Case

Цитата:
Выборка уникальных значений поля из того же датасета...

Используют приблизительно такой вариант:
with <Column>.Properties as TcxComboBoxProperties do begin
Items.Clear;
for i:=0 to <TheSource>.Recordcount-1 do
if Items.IndexOf(<TheSource>[i])<0 then
Items.Add(<TheSource>[i]);
end;
Автор: Alexandre
Дата сообщения: 03.08.2005 09:45
xokc
Спасибо большое. Работает!!!
Автор: Alex1978
Дата сообщения: 04.08.2005 13:55
Помогите разобраться почему метод CanSelectNode не работает.
Пишу
procedure TMainForm.trlMainCanSelectNode(Sender: TObject;
ANode: TcxTreeListNode; var Allow: Boolean);
begin
if ANode.Level = 0 then
Allow := False;
end;
Без толку.
Автор: Alex47
Дата сообщения: 04.08.2005 14:59
Alex1978

Вопрос: How to prevent a node from being selected? I want the user to see all nodes at level 0 and 1, but to be able to only select nodes at level 0.

Ответ:
try YourTreeList.OnChangeNode:
if (Node<>nil) and (Node.Level>1) then begin
if (OldNode<>nil) then OldNode.Focused := True
else dxTreeList.FocusedNumber := -1;
end;
PS: MultiSelect and CanNodeSelected are for a other task (See Helpfile).

Автор: Alex1978
Дата сообщения: 05.08.2005 08:43
Alex47
То ли лыжи не едут, то ли я ...
у TcxTreeList нет события OnChangeNode, есть OnNodeChanged - но это совсем из другой оперы.
Все что смог пока сделать, так это

procedure TMainForm.trlMainFocusedNodeChanged(Sender: TObject;
APrevFocusedNode, AFocusedNode: TcxTreeListNode);
begin
if APrevFocusedNode<> nil then
if (AFocusedNode <> nil) and (AFocusedNode.Level = 0) then
APrevFocusedNode.Focused := True;
end;

Но это не то, смена текущего узла к этому моменту произошла и я лишь возвращаю фокус, а нужно запретить выбор неугодного узла. Как решить проблему?

Описалова в хелпе CanNodeSelected не нашел.
Автор: Darl
Дата сообщения: 05.08.2005 11:13
Alex1978
Судя по исходникам данный метод работает токо при MultiSelect = true;

P.S. Проверил, работает.
Автор: Alex1978
Дата сообщения: 05.08.2005 11:20
Darl
Да я тоже это видел, но ведь должен же быть какой-то способ без мульселекта.
Автор: Darl
Дата сообщения: 05.08.2005 11:36
Alex1978

function TcxCustomTreeListControl.DoCanSelectNode(ANode: TcxTreeListNode): Boolean;
begin
Result := True;
if IsMultiSelect and (ANode <> nil) and CheckEvent(Assigned(FOnCanSelectNode)) then
FOnCanSelectNode(Self, ANode, Result);
end;
Автор: Alex1978
Дата сообщения: 05.08.2005 11:44
Darl
И че править исходники?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Kylix


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