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

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

Автор: X11
Дата сообщения: 13.06.2012 11:41
neznayka3
дык ты почитай в справке что такое DisableControls/EnableControls, а что такое BeginUpdate/EndUpdate и сразу поймёшь разницу
Автор: neznayka3
Дата сообщения: 13.06.2012 12:03
X11
дык поэтому и спрашиваю.

Цитата:
DisableControls
Disables data display in data-aware controls associated with the dataset.

BeginUpdate
Prevents the current View's updates until the EndUpdate or CancelUpdate method is called.

если DisableControls отключил показ данных в компоненте, что view обновлять будет?
Автор: salexn1
Дата сообщения: 13.06.2012 12:13
neznayka3
Так мало ли чего он себе будет делать...
Добавлять строки в гид и т.д. и т.п.

Просто создай DataSet на пару сотен тыс записей и потом поиграй с DisableControls/EnableControls и BeginUpdate/EndUpdate...

Вот тогда все станет ясно
Автор: X11
Дата сообщения: 13.06.2012 12:16
К датасету может быть подключено сколько угодно много DataSource, вот они обрубаются на время DisableControls, чтобы не искать и не отключать всё, что подключено, а BeginUpdate у Dev-компонент касаются только конкретного одного компонента, у которого вызываешь эти методы.
может быть тебе нужно "заблокировать" только cxGrid, а все остальное, что привязано к датасету отрубать ненужно. Ну вот как-то так.
Автор: Cryogen2003
Дата сообщения: 13.06.2012 15:59
Добрый вечер всем.
Как сделать так, чтобы в TcxPageControl при переключении TabSheet, которые расположены в несколько строк, не перелистывались эти самые строки. То есть PageControl пытается, чтобы сама закладка TabSheet всегда была внизу, а пользователям не удобно.
Автор: ant0ni02004
Дата сообщения: 13.06.2012 16:10
neznayka3
BeginUpdate/EndUpdate это чтобы контрол не мельтешил при отрисовке:
если, например, хочется пройтись по всему контролу и что-то поделать с нодами - позакрывать, пооткрывать, поудалять даже, или допустим в колонке во всех check-edit-ах проставить "выбрано" или снять
Автор: X11
Дата сообщения: 13.06.2012 18:37
Cryogen2003
сделай не закладки, а кнопки
Автор: saidumar
Дата сообщения: 14.06.2012 12:46
cxDBimage+UniDac+SQL Server
в базе есть таблица с полями ID: int, Img: varbinary(2048)
cxDbimage.properties.GraphicClassName:=TdxPNGImage
из контекстного меню открываю png файл размером меньше 1 кб
выдает ошибку Invalid variant type or size for field 'Img'
Автор: mdid
Дата сообщения: 14.06.2012 14:43
никогда не юзал дб грид в качестве инструмента для прямого редактирования таблицы...но сей день настал...и чет нифига не пойму как заставить не записывать данные после заполнения только одной колонки....так как есть обязательные поля для заполнения и при наступлении поста меня ругают за null в поле...выставил dcoImmediatePost=false но толку 0
Автор: ant0ni02004
Дата сообщения: 14.06.2012 14:59
mdid
я бы даже и не советовал начинать. именно из-за таких вот приколов. форма списка + форма редактирования - самое то. можна самому проверять все ли поля заполнены (if field.required and isnull) и делать abort beforepost - но это столько мороки... а если юзер нажимает кнопку "вниз/вверх" - то нужно отлавливать текст ошибки и говорить ему что именно он не заполнил.
Автор: X11
Дата сообщения: 14.06.2012 15:10

Цитата:
как заставить не записывать данные после заполнения только одной колонки

никак

Как вариант, я просто включаю свойство OptionsBehavior.FocusNextCellOnTab и тогда можно легко перемещаться TAB`ом по редактируемой строке. И там ещё есть FocusFirstCellOnNewRecord

затем на событие OnEditKeydown вешаешь код:


Код: if (key = vk_return) and (TcxGridTableView(Sender).datacontroller.IsEditing) then
TcxGridTableView(Sender).datacontroller.Post;

if (key = VK_ESCAPE) and (TcxGridTableView(Sender).datacontroller.IsEditing) then
TcxGridTableView(Sender).datacontroller.Cancel;
Автор: salexn1
Дата сообщения: 14.06.2012 15:24
mdid
1) Расставить у полей свойство Required (у тех, у кого нужно) и красиво обрабатывать Exception
2) Я не совсем понял, что значит - ПОСЛЕ ЗАПОЛНЕНИЯ ОДНОЙ КОЛОНКИ? Не срабатывает Post у датасет после заполнения колонки. Только, если не прошел скрол или не вызвали явно Post
3) Обрабатывать событие BeforePost наконец и проверять, все ли заполнено. Если нет - кидать месагу и abort

Добавлено:
ant0ni02004
жутко не удобно ради 2 заполняемых полей показывать доп. форму.
Автор: ant0ni02004
Дата сообщения: 14.06.2012 15:30
salexn1

Цитата:
жутко не удобно ради 2 заполняемых полей показывать доп. форму

если есть базовые классы, в которых всё (ну почти) написано раз и навсегда (один базовый список+один базовый редактор) - то унаследовать форму редактора и кинуть туда два поля (и даже одно) не проблема
а с нуля конечно, влом писать
Автор: mdid
Дата сообщения: 14.06.2012 15:32
пасиба..понял....эта штуковина не для усеров...им я такое вжизнь не доверю...просто у меня есть мини прога по обслуживанию БД...кто работал с 1с тот знает такую гадость как конфигуратор....вот и я се что то подобное делаю...
а редактирование понадобилось что бы нарезать права усерам(что видно(кнопки меню) в самом клиенте а так же права на просмотр или редактирование)...и вот как раз что бы не вызывать каждый раз форму для редактирования одной записи я вывалил в грид наименования всех кнопок и права на каждую кнопку..а так же еще пару дополнительных колонок

ну раз такой штуковины в гриде нет тогда да...придется опять извращаться....всем пасиба
Автор: salexn1
Дата сообщения: 14.06.2012 15:45
mdid

Цитата:
ну раз такой штуковины в гриде нет тогда да

какой штуковины?

ant0ni02004
я не с точки зрения программирования, а с точки зрения юзабилити...
Автор: mdid
Дата сообщения: 14.06.2012 16:09
salexn1
ну я искал что то типа запрета поста до нажатия кнопки на навигаторе...ну как то так..ну да ладно..сделал так..создал переменную типа boolean которая тру только тогда когда нажимается в навигаторе грида пост...после чего она опять не тру( ....а в обработчике OnBeforePost если не тру то тогда аборт...и вроде норм...пока норм)
Автор: reenoip
Дата сообщения: 14.06.2012 17:24
Можно как-то к "cxDBVerticalGrid1" прикрутить выпадающее меню с чекбоксами, чтобы можно было отметить "галочками" несколько значений сразу?



p.s.

Выделил нужную мне ячейку > нажал Properties (TcxDBEditorRowProperties) > в Edit properties выставил "CheckComboBox", но как мне теперь привязать ЧекКомбоБокс к "DataSource1", чтобы вместо "1", "2", "3", "4" и "5" были значения из моей БД?
Автор: ant0ni02004
Дата сообщения: 14.06.2012 18:42
salexn1
юзабилити штука хорошая, но если юзеров приучить работать со списком и редакторами - то может и лучше будет. всё одинаковое, всё понятное. согласен, не факт что самое удобное
Автор: SevereK20
Дата сообщения: 15.06.2012 09:07
reenoip
А в базу как это писаться будет? в одно поле через запятую 1,3,5 к примеру?.....
Автор: reenoip
Дата сообщения: 15.06.2012 09:11
SevereK20
да, хотя бы так.
Автор: SevereK20
Дата сообщения: 15.06.2012 09:13
reenoip
Честно говоря затрудняюсь сказать. Есть специальный компонент cxCheckComboBox. Он позволяет сделать выпадающий список именно такой, какой вам нужен. Но впилить его в грид я думаю не получится.
Автор: X11
Дата сообщения: 15.06.2012 09:23
Очень даже получиться. В грид вообще можно влепить всё, что захочется.
Цитата:
Выделил нужную мне ячейку > нажал Properties (TcxDBEditorRowProperties) > в Edit properties выставил "CheckComboBox", но как мне теперь привязать ЧекКомбоБокс к "DataSource1", чтобы вместо "1", "2", "3", "4" и "5" были значения из моей БД?



заполнять ручками


Код:

function FillCheckComboBox(cxCheckComboBox: TcxCheckComboBoxProperties; tSpr: TpFibDataSet; sChecksList: string; sFieldName: string = 'NAME'; bDoCloseSpr: boolean = true): string;
Var
CheckComboboxItem: TcxCheckComboboxItem;
// State: TcxCheckBoxState;
ACheckStates: TcxCheckStates;
s1: TStringList;
begin
s1 := TStringList.Create;
try
s1.CommaText := sChecksList;
s1.Delimiter := ',';

with tSpr do
begin
if not Active then Open;
First;
FetchAll;
cxCheckComboBox.Items.BeginUpdate;
cxCheckComboBox.Items.Clear;

While not Eof do
begin
CheckComboboxItem := cxCheckComboBox.Items.AddCheckItem(FBN(sFieldName).AsString);
CheckComboboxItem.Tag := FBN('ID').AsInteger;

if sChecksList <> '' then
begin
SetLength(ACheckStates, Length(ACheckStates) + 1);

if IdInStringlist(s1, FBN('ID').AsString) then
ACheckStates[CheckComboboxItem.index] := cbsChecked;
end;

Next;
end;

if bDoCloseSpr then close;

result := cxCheckBox.CalculateCheckStatesValue(ACheckStates,
cxCheckComboBox.Items,
cxCheckComboBox.EditValueFormat);
end;


cxCheckComboBox.Items.EndUpdate;
finally
freeAndNil(s1);
end;//try
end;

Автор: shum44
Дата сообщения: 15.06.2012 09:26
Есть процедура для построения динамического меню.
что-то я совсем запутался...процедура не строит уровень вложения меню 3 и глубже...где ошибка понять не могу помогите плиз.


procedure Tfm_main.CreateSpravMenu;
var
SpravSp:TUniStoredProc;
Button:TdxBarButton;
j:Integer;
ItemLink: TdxBarItemLink;
mnItem: TdxBarSubItem;
Button_tag:integer;
begin
//Создаем меню для конкретного пользователя
CreateSP(main_data.Connection,'sp_create_menu',SpravSp);
SpravSp.ParamByName('f_user').Value:=null;
SpravSp.ExecProc;
SpravSp.First;

while not SpravSp.Eof do
begin
with SpravSp do
begin
if FieldByName('c_c_menu').Value =-1 then //Добавляем в главное меню
begin
mnItem := TdxBarSubItem.Create(MainMenu);
mnItem.Caption:=FieldByName('name').Value;
mnItem.Tag:=FieldByName('c_menu').Value;
with MainMenu,ItemLinks do
begin
BeginUpdate;
with Add do
begin
Item:=mnItem;
BringToTopInRecentList(False);
end;
EndUpdate;
end;
end
else
begin
//Ищем нужный пункт меню
for j := 0 to MainMenu.ItemLinks.Count - 1 do
begin
ItemLink := MainMenu.ItemLinks[j];
if ItemLink.Item.Tag = FieldByName('c_c_menu').Value then
begin
mnItem := TdxBarSubItem(ItemLink.Item);
break;
end;
end;

MainMenu.ItemLinks.BeginUpdate;
ItemLink := mnItem.ItemLinks.Add;
case FieldByName('type').Value of
1: ItemLink.Item := TdxBarSubItem.Create(Self);
2: ItemLink.Item := TdxBarButton.Create(Self)
end;
ItemLink.Item.Caption:=FieldByName('name').Value;
ItemLink.Item.Tag:=FieldByName('c_menu').Value;
ItemLink.BringToTopInRecentList(False);
MainMenu.ItemLinks.EndUpdate;
end;
Next;
end;
end;
SpravSp.Free;
end;
Автор: X11
Дата сообщения: 15.06.2012 09:27
Получаем список выбранных ID, через запятую или другой разделитель


Код: function GetComboChecks(cxCheckComboBoxProperties: TcxCheckComboBoxProperties; vValues: Variant; sDelim: string = ','): string;
Var
i: Integer;
ACheckStates: TcxCheckStates;
begin
with cxCheckComboBoxProperties do
begin
items.BeginUpdate;
try

CalculateCheckStates(vValues, items, EditValueFormat, ACheckStates);

for I := 0 to items.Count - 1 do
if ACheckStates[i] = cbsChecked then
result := IntToStr(items[i].Tag) + sDelim + result;

if result <> '' then //получаем 101,12,1024,
Delete(result, Length(result), 1);//удаляем последнюю запятую

finally
items.EndUpdate;
end;//try
end;//with
//возвращаем список из выбранных ID через запятую: 101,12,1024
end;
Автор: SevereK20
Дата сообщения: 15.06.2012 09:29

Цитата:
function FillCheckComboBox

Это и есть заполнение чекбокса значениями из бд? спасибо.
А вносить как правильно будет?...
Причем к примеру - есть около 6 чисел - 0,1,2,3,4,5. И у каждого изделия может быть свой порядок следования этих чисел (могут быть все 6, может 1 или 2, 3 - т.е. любое количество).
Как правильнее будет организовать хранение этих различных последовательностей?..
Пишу программу, до реализации этого не дошел, но в голове давно прокручиваю как будет правильнее.. А раз уж тут на эту тему беседа попалась - мож кто подскажет?
Автор: X11
Дата сообщения: 15.06.2012 09:32
Текстовое поле создай и в нём храни. Там будут чеканутые ID через запятую
Автор: saidumar
Дата сообщения: 15.06.2012 11:49
Delphi® XE2 Update 4 + DevExpress 2011 2.4
в DataModule нельзя вставить TcxImageList а на Delphi 7 можно что за глюк?


Добавлено:
Разобрался сам может кому поможет TDataModule has changed in XE2

Добавлено:

Цитата:
Как правильнее будет организовать хранение этих различных последовательностей?


если надо до 6 чеков то например текстом в виде 1,0,1,1,0,1 или числом побитно
Автор: reenoip
Дата сообщения: 15.06.2012 17:24
Ок, с чеккомбобоксом разобрался (правда, по-своему, но всё равно не без вашей помощи), всем спасибо, только теперь новый вопрос: cxGrid (из набора "DevExpress 2011 2.5"), в нём 3 колонки (столбца), в первых двух - обычные комбобоксы, в последней - мой многострадальный чеккомбобокс, в котором забито 80 значений. Мне в нём нужно отключить, допустим, 30 пунктов из 80 предустановленных, если в первом столбце cxGrid было выбрано определённое значение.
Но всё, на этом запнулся - я не могу допетрить, как мне это сделать. Выделил в cxGrid заголовок нужной мне колонки, открыл её эвенты, воткнул на событие OnPopup следующее:

Код:
procedure TForm1.cxGrid1DBTableView1thirdPropertiesPopup(Sender: TObject);
begin
if cxGrid1DBTableView1first ...
Автор: SevereK20
Дата сообщения: 15.06.2012 23:43
reenoip
по-моему тут другое событие надо отлавливать, анализируя которое заполнять значения для мульти-комбобокса.
и событие это будет что-то типа drawcolumncell
Автор: saidumar
Дата сообщения: 16.06.2012 12:06
reenoip

Опять возвращаемся к Таблица для просмотра и Форма для редактирования давно написали бы уже.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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