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

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

Автор: brookson
Дата сообщения: 18.11.2009 11:37
Версия х.40
Кусок не смогу - очень много всего.
Настройки вью и правда связаны мастер-деталь. Но оно работало очень долгое время, я там ничего не менял.
Мастер tvServ (смотрит на dxMemServ), деталь TvPrep (смотрит на dxMemPrep).
tvServ.KeyFieldNames=RecId;
tvPrep.KeyFieldNames=RecId;
tvPrep.MasterKeyFieldNames=RecId;
tvPrep.DetailKeyFieldNames=servkey;

dxMemDataPrep.FieldByName('servkey').AsInteger:=dxMemDataServ.FieldByName('RecId').AsInteger;
Остальные настройки стандартные.
Данные в dxMemPrep добавляются не всегда, т.е. деталь не всегда имеет записи. Но глюк всё равно появляется.

Не понимаю даже, в ком проблема: в датасете или во вью. Уже подумываю отказаться от него, сделать в базе таблички....

Автор: f3ka
Дата сообщения: 18.11.2009 11:45
brookson
я бы посоветовал (да и сам бы сделал) отказаться от использования поля RecID, а создал бы поля и писал бы туда значения которые мне нужны...
Автор: brookson
Дата сообщения: 18.11.2009 12:00
f3ka
То есть индексы сделать самому?
Автор: f3ka
Дата сообщения: 18.11.2009 12:19
brookson
ну с индексами тут тоже надо решить, нужны ли они... если объемы данных не большие то зачем?
Автор: sldaac
Дата сообщения: 18.11.2009 12:24
brookson
для начала убери все связи, и проверь добовление данных и обновление их во view
посмотри view - gridmode -? SyncMode- ?
Автор: brookson
Дата сообщения: 18.11.2009 12:31
gridmode = false; syncmode = true

Убрал связи и ключи - всё то же самое, на 3-й раз вылетел. Возвращаю назад, мне же нужно, чтоб к мастер-записи показывалась detail, если есть.
Щас попробую пересоздать оба датасета.
Автор: sldaac
Дата сообщения: 18.11.2009 12:37
brookson

Цитата:
gridmode = false

сделай = true,
будет как простой грид...

а вообще попробуй kbmMemTable, я когда-то смотрел девовские мемдата, не помню что, но проблемы было.
Автор: vladman
Дата сообщения: 18.11.2009 13:52
brookson
Если бы выложили пример, уверен, получили бы решение проблемы намного быстрее.
Автор: neznayka3
Дата сообщения: 18.11.2009 13:55
создаю дерево в run-time:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Node: TcxTreeListNode;
ChildNode: TcxTreeListNode;
begin

Node := cxTreeList1.Add;
Node.Values[tlc_name.Position.ColIndex] := 'Все';
Node.Values[tlc_id.Position.ColIndex] := -1 ;
Node.CheckGroupType:=ncgCheckGroup;
with ADOQuery1 do
begin
open;
while not eof do
begin
ChildNode := Node.AddChild;
ChildNode.Values[tlc_name.Position.ColIndex] :=fieldvalues['groups_name'] ;
ChildNode.Values[tlc_id.Position.ColIndex] := fieldvalues['id_groups'];
ChildNode.CheckGroupType:=ncgCheckGroup;
Next;
end;
close;
end;
end;
Автор: brookson
Дата сообщения: 18.11.2009 14:04
vladman
Да я понимаю. Но не могу вот так ВЕСЬ проект выложить куда-то.
Сейчас попытаюсь как-то "вырезать" эту форму.
Автор: vladman
Дата сообщения: 18.11.2009 14:12
neznayka3

Цитата:
у корня дерева "Все" нет checkbox-a. как его получить?

Попробуйте указать <YourcxTreeList>.OptionsView.CheckGroups := True;

Добавлено:
brookson
Зачем весь проект. Сделайте новое приложение и в нем попытайтесь воспроизвести то что не работает. Если все делается с нуля иногда это помогает более быстро локализовать проблему.
Автор: brookson
Дата сообщения: 18.11.2009 17:32
http://www.speedyshare.com/files/19355627/test.rar
Вот линк.
Суть: добавить в счёт хотя бы одну услугу и сохранить. И так до 3-х раз попробовать.
Автор: vladman
Дата сообщения: 19.11.2009 00:44
brookson

Цитата:
Вот линк.

Честно говоря, достаточно трудно было понять ваш код и всю логику, которую вы на него возложили, но решить проблему именно с

Цитата:
Суть: добавить в счёт хотя бы одну услугу и сохранить. И так до 3-х раз попробовать.

вам поможет очистка dxMemDataPrep перед очисткой dxMemDataServ в процедуре
TF_ORD.AcClearCtrlsExecute. Хотя эти очистки совершенно лишние, исходя из того что вы потом выполняете dxMemDataServ.Close; и dxMemDataPrep.Close;

Мое мнение, что-то вы перемудрили в ваших подходах. Весь видимый функционал явно не стоит 1000 строк кода.
Автор: sldaac
Дата сообщения: 19.11.2009 10:16
brookson

Цитата:
Суть: добавить в счёт хотя бы одну услугу и сохранить. И так до 3-х раз попробовать.

Ну добавляется,... правдя что касается интербйса я выкинкл, по сам код добавленя оставил.... и ни разу ошибки небыло и комбик я один убрал, свой набор значений для номера счета сделал
Автор: brookson
Дата сообщения: 19.11.2009 13:29
vladman
Понимаю Вашу критику. Но всё же - у Вас работал пример?
Я пробовал избавляться от записей просто
dxMemDataPrep.Close;
dxMemDataServ.Close;
Пробовал удалять по одной, начиная с dxMemDataPrep. У меня всё равно на 3-й раз не отображаются записи в гриде.

Добавлено:
Вобщем, закончилось тем, что взял датасеты, смотрящие на таблицы из базы. И всё работает, как надо.
Спасибо за советы и за помощь
Автор: X11
Дата сообщения: 19.11.2009 22:49
Кто знает, есть ли у TcxCheckComboBox свойство или функция, возвращающая количество отмеченных элементов?
Автор: vladman
Дата сообщения: 19.11.2009 23:00
brookson

Цитата:
Понимаю Вашу критику

Да я, собственно, не критиковал, а выражал свое мнение.
Ваш пример у меня вызывал ошибку List index out of bounds при попытке сохранить в счете три услуги. После мелких правок, описанных в прошлом посте, больше ошибок в аналогичном случае не было.

Добавлено:
X11

Цитата:
Кто знает, есть ли у TcxCheckComboBox свойство или функция, возвращающая количество отмеченных элементов?

Насколько мне известно - нет. Но это легко узнать из его свойства Value.
Например

Код: function GetCheckedCount(AValue: Variant): Integer;
var
i: Integer;
begin
Result := 0;
if VarIsNull(AValue) then Exit;
for i := 7 downto 0 do //думаю, больше 256 чекбоксов у вас не будет
if AValue and (1 shl i) <> 0 then Result := Result + 1;
end;
Автор: neznayka3
Дата сообщения: 20.11.2009 06:26
vladman

Цитата:
Попробуйте указать <YourcxTreeList>.OptionsView.CheckGroups := True;

Стоит. если в дизайн-тайм создавать дерево, то работает. а так нет:

Код: procedure TForm1.Button2Click(Sender: TObject);
var
Node: TcxTreeListNode;
ChildNode: TcxTreeListNode;
i: Integer;
begin
Node := cxTreeList2.Add;
Node.Values[cxTreeList2Column1.Position.ColIndex] := 'Все';
Node.CheckGroupType:=ncgCheckGroup;
for i:=0 to 10 do
begin
ChildNode := Node.AddChild;
ChildNode.Values[cxTreeList2Column1.Position.ColIndex] :=inttostr(i) ;
ChildNode.CheckGroupType:=ncgCheckGroup;
end;
end;
Автор: Chukotka
Дата сообщения: 20.11.2009 06:41
vladman

Цитата:
Код:
function GetCheckedCount(AValue: Variant): Integer;
...
for i := 7 downto 0 do //думаю, больше 256 чекбоксов у вас не будет
...

Небольшая неточность - 8, а не 256.
Автор: brookson
Дата сообщения: 20.11.2009 09:02
vladman

Цитата:
Ваш пример у меня вызывал ошибку List index out of bounds при попытке сохранить в счете три услуги. После мелких правок, описанных в прошлом посте, больше ошибок в аналогичном случае не было.

Хм... В программировании чудес не бывает. Если у Вас еще остался этот работающий пример, нетрудно выложить куда-нибудь?
Буду очень признателен.
Автор: vladman
Дата сообщения: 20.11.2009 10:00
Chukotka

Цитата:
Небольшая неточность - 8, а не 256.

Нет, все-таки 256
brookson

Цитата:
Если у Вас еще остался этот работающий пример, нетрудно выложить куда-нибудь?

Нет, не трудно, смотрите ПМ.
Автор: Chukotka
Дата сообщения: 20.11.2009 10:30
vladman

Цитата:
Нет, все-таки 256


Таки 8.
Для отображения состояний 256 checkbox'ов (0\1) по определению требуется 256 бит.
Автор: vladman
Дата сообщения: 20.11.2009 11:38
Chukotka

Цитата:
Таки 8.

Подумав еще раз, соглашаюсь, таки 8 . Вы правы, считать же нужно уметь, этому еще в школе учат .
Тогда моя функция GetCheckedCount не совсем корректна в общем случае. Сейчас что-то придумаю.

Добавлено:
Резюме по вопросу подсчета выбранных Itmes в cxCheckComboBox следующее.
Хотелось сделать универсальную процедуру такого подсчета вне зависимости от значения свойства Properties.EditValueFormat, т.е. основываясь на значение <YourcxCheckComboBox>.Value.
Но, оказывается, <YourcxCheckComboBox>.Value также зависит от Properties.EditValueFormat, а не является всегда целочисленным представлением, как написано в справке.
Более того, если использовать Properties.EditValueFormat = cvfInteger, то количество Items ограничено 64 (больше - не помещается в Int64), об этом просто нужно помнить.
Поэтому, для решения вопроса в общем случае, необходимо анализировать не значение <YourcxCheckComboBox>.Value, а воспользоваться функцией TcxCustomCheckComboBox.GetItemState, например:

Код: function GetCheckedCount(ACheckComboBox: TcxCheckComboBox): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to ACheckComboBox.Properties.Items.Count - 1 do
if ACheckComboBox.GetItemState(i) = cbsChecked then inc(Result);
end;
Автор: brookson
Дата сообщения: 20.11.2009 15:54
vladman
а ПМ - это что?
Автор: vladman
Дата сообщения: 20.11.2009 15:57
brookson

Цитата:
а ПМ - это что?

Personal messanger
http://forum.ru-board.com/messanger.cgi
Автор: SIgor33
Дата сообщения: 21.11.2009 10:39
Подскажтие как оптимизировать ширину колонок "по данным", в этих колонках.
То есть чтобы сразу при запуске был эффект, который мы получаем при двойном клике между header колонок.
нашел только автовыравнивание по всей ширине .. это не то
Автор: afiget
Дата сообщения: 21.11.2009 13:23
ApplyBestFit()
Автор: JDEE
Дата сообщения: 23.11.2009 13:41
TreeList 5.47 глючит. Если поставлен CellSelect=False, то при скролле стрелками клавиатуры фокус переходит по нодам, но сам TreeList не скроллится до фокусного нода.
Кто нибудь сталкивался с этим глюком? Как лечить?

PS: NOde.MAkeVisible в OnFocusedNodeChanged пробовал - не помогает.
Автор: vladman
Дата сообщения: 23.11.2009 14:37
JDEE

Цитата:
TreeList 5.47 глючит. Если поставлен CellSelect=False, то при скролле стрелками клавиатуры фокус переходит по нодам, но сам TreeList не скроллится до фокусного нода.

Исправят в следующей (5.48) версии.
Bug Report Details: Navigating with keyboard up/down does not trigger FocusedNodeChanged event when CellSelect is False
Автор: Zioma
Дата сообщения: 23.11.2009 15:03
Вопрос по одному из примеров, которые идут с DevExpress:
исходник тут - Components\Demos\XtraTreeList\CS\TreeListMainDemo\Modules\ExplorerNew.cs.

Там создается дерево каталогов.
При инциализации создается объект для DataSource


Код: treeList1.DataSource = new object();

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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