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

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

Автор: marser
Дата сообщения: 01.02.2011 20:40
X11

Код: procedure TfmDopAttributeEdit.vgDopAttribEditKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'н', 'Н': Key := 'N';
'а', 'А': Key := 'A';
'л', 'Л': Key := 'L';
......
end;
end;
Автор: X11
Дата сообщения: 02.02.2011 10:22
Лыжи, всё таки едут, это я ...
Я перепутал поле colField_Name и colTable_Name
Приношу извинения за отнятое время

Добавлено:
О! А куда делись 100 страниц? О_о
Автор: tanaseduard
Дата сообщения: 02.02.2011 14:11
Забавная фигнся c cxDBVerticalGrid.

Если в DataSet нету записи то он все равно показывает пустой набор данных.
Если начать его редактировать то появиться новая строка(смортю через другой грид), хотя запрещенно этому гриду создавать новую запись.
http://s47.radikal.ru/i118/1102/ce/9b6ae24a9986.png
http://s54.radikal.ru/i145/1102/11/417d9f5ef15a.jpg
http://s50.radikal.ru/i128/1102/6c/ecad3d8ca4b9.jpg
Автор: tupi2
Дата сообщения: 02.02.2011 14:28
Приветствую всех!
Помогите разобратьсяс cxPopupEdit. Есть TcxVirtualVerticalGrid, где редактируютя различные свойства с различными типами. Появилась задача реализации лукапа из древовидного списка. Использую в качестве EditProperties для свойств такого типа TcxPopupEdit, в попап окне отображаю дерево. тут никаких проблем нету. Проблема у меня со значениями. В частности мне нужно хранить не текст, а очевидно id'шники из этого дерева. Так вот, если в качестве EditValue использовать id, а в обработчике GetDisplayText делать преобразование из Id в нормальный текст, то на первый взгляд все работает, но не тут-то было. При клике на эдит появляется курсор, и на краткое мгновение появляется id'шник вместо текста. потом при отображении поп-апа я уже меняю текст на нормальный. очень некрасиво выглядит это моргание.
Ладно бы выбор этот нужен был для одного значения - выкрутился бы как-нить передал бы значение. так ведь бывает и мультивыбор.
На данный момент запретил неуникальные значения в дереве и передаю туда-сюда StringList.CommaText. После редактирования получаю idшники через Integer(StringList.Objects[Stringlist.IndexOf(str_value)]) - idшники в Objects хранятся...

В общем есть ли какой-нить правильный метод работы с подтановками такими? А то уже запарился выкручиваться, если честно...

ЗЫ поледних 40 страниц и правда жаль, дочитал только до 64...
Автор: X11
Дата сообщения: 02.02.2011 14:35
tupi2
Я для ID использую глобальную переменную. А в строке грида сам по себе хранится текст
Автор: tanaseduard
Дата сообщения: 02.02.2011 14:39
tupi2

Я обычно храню 2 поля, 1 - текс, 2 -ID. Popup вешаю на текст, при вызове скармливаю ему то что нужно из соседнего столбца.
Автор: tupi2
Дата сообщения: 02.02.2011 14:48
X11 tanaseduard У меня VirtualVerticalGrid т.е. связи между столбцами и прочими глобальными переменными нету. все отстраивается в рантайме через CustomDatsource. Для мультивыбора из простого списка использую cxCheckComboboxProperties с EditValueFormat:=cvfStatesString, полностью удовлетворяет, вот если б с деревом такой же механизм повторить. Исходники смотрел, но там не для моих слабых мозгов...
Автор: marser
Дата сообщения: 02.02.2011 15:37
tupi2

Цитата:
Появилась задача реализации лукапа из древовидного списка. Использую в качестве EditProperties для свойств такого типа TcxPopupEdit, в попап окне отображаю дерево.

Если хотите получить полный аналог cxLookupComboBox с древовидным списком, то нужно написать классы (компоненты) наследники TcxCustomLookupEditLookupData,
TcxCustomLookupEditProperties, TcxCustomLookupEdit. Между прочем, не очень сложно пишется. Делаете копии модулей cxDBLookupEdit.pas и cxDBLookupComboBox.раs, переименовываете их, переименовываете классы, и пытаетесь заменить Grid на TreeList. Помучится придётся, но результат того стоит.
Автор: kvazars
Дата сообщения: 02.02.2011 15:43
marser, а не могли бы выложить готовый ваш вариант?
Автор: marser
Дата сообщения: 02.02.2011 15:56
kvazars

Цитата:
marser, а не могли бы выложить готовый ваш вариант?

В принципе могу, не жалко. Но только завтра (рабочий день заканчивается, да и подготовить товарный вид надо). Компоненты написаны под Delphi XE и DevExpress 54. Если устраивает, то выложу.
Автор: tupi2
Дата сообщения: 02.02.2011 16:07
marser
Свой компонент это конечно хорошо и полезно, но в данномслучае считаю его overkill. вариант с дополнительной колонкой. хранящей id, который предложил tanaseduard выглядит более простым, учитывая то, что функцинал не ограничивается db или не db, мульти выбор или нет.
На самом деле просто интересовало можно ли напрочь скрыть от пользователя id в popupedit'е. или popupedit предназначен для работы с непосредственными значениями или же вообще без оных...
Автор: X11
Дата сообщения: 02.02.2011 16:20

Цитата:
У меня VirtualVerticalGrid т.е. связи между столбцами и прочими глобальными переменными нету. все отстраивается в рантайме через CustomDatsource.

Неужели в узел нет места, куда можно записать ID?

или может быть Сlass Helpers?

Цитата:
Это классы ассоциированные с каким либо классом и содержащем методы которые могут быть использованы при работе с основным классом. Это своеобразный способ расширить функциональность базового класса не прибегая к наследованию.
Автор: tupi2
Дата сообщения: 02.02.2011 17:49
X11 да, очень интересный вариант с ClassHelpers. Подумаю в этом направлении, спасиб.
Автор: iliak87
Дата сообщения: 02.02.2011 18:30
marser

Ваш способ не помог, но натолкнул на верный путь:

cxGrid1DBTableView1.GetColumnByFieldName( ) - возвращает nil если такой не найдено.

Спасибо
Автор: marser
Дата сообщения: 02.02.2011 20:53
iliak87

Цитата:
Ваш способ не помог, но натолкнул на верный путь:

Так нужно было использовать способ не с криком УРА, а разобратся, что написано. В коде банальная ошибка: вместо " if CompareText(cxGrid1DBTableView1.Columns[I].DataBinding.FieldName, AFieldName) = 1 then", нужно " if CompareText(cxGrid1DBTableView1.Columns[I].DataBinding.FieldName, AFieldName) = 0 then". А cxGrid1DBTableView1.GetColumnByFieldName( ) я не заметил, когда искал что-то подходящее. Поэтому и предложил самописную функцию.
Автор: Kniaz2011
Дата сообщения: 03.02.2011 08:48
Всем привет, кто нить знает как решить такую проблему.
Как получить выделенный текст из ячейки cxGrid?
Использую expressquantumgrid 6.42.
Искал в интернете, внятных ответов нету...
Автор: dimm78
Дата сообщения: 03.02.2011 09:21

Цитата:
Как получить выделенный текст из ячейки cxGrid?
Использую expressquantumgrid 6.42.


В общем случае если для колонки в которой находится ячейчка установлено Properies TcxTextEditProperties то

(<AGrid>.<AView>.Controller.EditingController.Edit as TcxTextEdit).SelText

Соответственно если для колонки назначены любой из других типов редакторов то для них получать в зависимости от класса.
Автор: marser
Дата сообщения: 03.02.2011 09:59

Цитата:
Если хотите получить полный аналог cxLookupComboBox с древовидным списком, то нужно написать классы (компоненты) наследники TcxCustomLookupEditLookupData,
TcxCustomLookupEditProperties, TcxCustomLookupEdit. Между прочем, не очень сложно пишется. Делаете копии модулей cxDBLookupEdit.pas и cxDBLookupComboBox.раs, переименовываете их, переименовываете классы, и пытаетесь заменить Grid на TreeList. Помучится придётся, но результат того стоит.

kvazars

Цитата:
marser, а не могли бы выложить готовый ваш вариант?

Демонстрационный проект: http://rghost.ru/4185236
Компонент TdxMemData должен быть установлен.
Автор: Kniaz2011
Дата сообщения: 03.02.2011 11:51
dimm 78, спасибо за совет, а как отловить событие на отпускание левой кнопкой мышки вверх, когда выделил текст в ячейке...

Автор: marser
Дата сообщения: 03.02.2011 12:14
Kniaz2011

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

Можно попробывать в сxGridTableView.ОnInitEdit на AEdit.OnMouseUp повесить обработчик события
Автор: Kniaz2011
Дата сообщения: 03.02.2011 13:19

Цитата:
Можно попробывать в сxGridTableView.ОnInitEdit на AEdit.OnMouseUp повесить обработчик события


А как для тупого можно пояснить? или пример хотя бы.....
Автор: marser
Дата сообщения: 03.02.2011 13:43
Kniaz2011

Код: type
TForm1 = class(TForm)
....
procedure cxGrid1TableView1InitEdit(Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);
private
procedure EditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
....
implementation
....
procedure TForm1.cxGrid1TableView1InitEdit(Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);
begin
AEdit.OnMouseUp := EditMouseUp;
end;

procedure TForm1.EditMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Отпустили кнопку мышки');
end;
Автор: X11
Дата сообщения: 03.02.2011 14:00
Девы невозможно будет установить на delphi starter
http://community.devexpress.com/blogs/ctodx/archive/2011/02/02/got-delphi-xe-starter-want-to-install-our-controls-tough.aspx

Добавлено:
Имеется ввиду, что если ты купил сразу всю подписку, то одним общим инсталлятором все пакеты не установишь.
Автор: RomanDaemon
Дата сообщения: 04.02.2011 01:45
2 датасета связаны как мастер-детейл.
На форме cxGrid и cxDBMemo.
Грид привязан к мастеру, а мемо к детейлу.
Вот такой момент - если с помощью фильтров колонок грида получится, что в гриде пусто, то в мемо все равно будут данные, так как связка датасетов все равно работает, и у мастера все равно какая-то запись текущая. По моему это не очень правильно, что в мемо остаются какие-то данные.
Что сделать-то можно? Как-то раньше не задумывался...
Автор: Kniaz2011
Дата сообщения: 04.02.2011 07:03

Цитата:
AEdit.OnMouseUp := EditMouseUp;

Огромное спасибо Marser, как раз то что надо)
Автор: tatbesidovska
Дата сообщения: 04.02.2011 10:25

Цитата:
Вопрос такой: Есть gridView(Devexpress овский), с полем в которое нужно добавить документ (Excel, Word или любой другой) и сохранить в базе данных SQL. Как реализовать все это на C#, чтобы потом можно было просмотреть этот документ.

Неужели никто не реализовывал это, может кто-нибудь подскажет!!!!!пожалуйста

private void вставитьToolStripMenuItem1_Click(object sender, EventArgs e)
{
Point p = gridView1.GridControl.PointToClient(Control.MousePosition);
GridHitInfo info = gridView1.CalcHitInfo(p);
if (info.InRowCell && info.Column == coldokum)
{
Stream myStream;
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
if ((myStream = ofd.OpenFile()) != null)
{

SqlConnection myConnection = new SqlConnection(@"Data Source=ODIN;Initial Catalog=BDOC;User ID=sa;Password=123");
String insertCmd = "insert into foto values (@image);";
SqlCommand myCommand = new SqlCommand(insertCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@id_image", SqlDbType.Int));
myCommand.Parameters.Add(new SqlParameter("@image", SqlDbType.Image));
byte[] buf = new byte[myStream.Length];
myStream.Read(buf, 0, (int)myStream.Length);
myStream.Close();
myCommand.Parameters["@id_image"].Value = 1;
myCommand.Parameters["@image"].Value = buf;
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();

gridView1.SetRowCellValue(info.RowHandle-1, info.Column.FieldName, buf);
myCommand.Connection.Close();
MessageBox.Show("Документ добавлен!");

}



}
}
}
событие "вставить" я реализовал, теперь надо реализовать "открыть" , нужно просмотреть файл, который лежит в базе, при нажатии на ячейку в гриде,которая соотв. полю из таблицы в базе данных
Автор: infomSB
Дата сообщения: 04.02.2011 14:18
tatbesidovska
Какие-то у вас вопросы глобальные, и не совсем понятно при чем тут DevExpress .
Для того чтобы просмотреть файл вам надо сделать следующее:
1. Выгрузить данные из Blob поля в файл с правильным расширением (хоть во временную папку)
2. Открыть этот файл через Shell соответствующей программой.
Автор: RomanDaemon
Дата сообщения: 05.02.2011 19:45
Помогите с логикой пожалуйста.

Есть cxGrid. При загрузке приложения, настройки грида грузятся автоматом из реестра. При закрытии автоматом в реестр сохраняются. Пользователи просят кнопку, которая бы делала ресет, т.е. сбрасывала все их настройки грида к первоначальному виду. Как бы это сделать? Надо еще сохранить в какой-то репозиторий во время дизайна все настройки?
Автор: X11
Дата сообщения: 05.02.2011 21:16
Надо сделать так, чтобы при загрузке формы проверялось, удерживается ли кнопка Shift, и если удерживается, то не грузить при старте настройки.

Код:
if (GetKeyState(VK_SHIFT) >= 0) then //если НЕ нажата клавиша Shift, то не загружаем параметры
begin
dbgApart.RestoreFromIniFile(sMyDocAppPath + sGrid + 'dbgApart.ini');
dbgOtbor1.RestoreFromIniFile(sMyDocAppPath + sGrid + 'dbgApart_otbor.ini');
dbgDop.RestoreFromIniFile(sMyDocAppPath + sGrid + 'dbgApart_dop.ini');
dbgClients.RestoreFromIniFile(sMyDocAppPath + sGrid + 'dbgApart_Clients.ini');
dbgCallsHistory.RestoreFromIniFile(sMyDocAppPath + sGrid + 'dbgCallsHistoryApart.ini');

dxBarManager1.LoadFromIniFile(sMyDocAppPath + sGrid + 'BarMainApart.ini');
end;
Автор: RomanDaemon
Дата сообщения: 06.02.2011 21:30
X11

Спасибо. Но как-то это для пользователя не очень. Вот была бы просто кнопка "ресет" на форме, было бы понятнее. Может кто-то делал так?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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