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

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

Автор: victorman2010
Дата сообщения: 13.01.2010 15:01
Два вопроса:
1. Есть ClientDataSet, в нем строковые поля, типа "40152.9424801042". Вывожу в cxGrid. Вопрос как это преобразовать к нормальной дате, отредактировать, а потом обратно.
2. Подскажите как обратиться к определенной колонке cxGrid'a, с целью туда что нибудь записать?
Заранее благодарен.
Автор: afiget
Дата сообщения: 13.01.2010 18:34
victorman2010
1. Я бы приводил к нужному типу в процедуре формирования данных ДатаСет: в запросе, например.
2. Описано в справке: Obtain and Set Cell Values.
Автор: fortezza
Дата сообщения: 14.01.2010 08:23
ещё раз повторю свой вопрос, может кто сталкивался или проверит и скажет, что я делаю не так.
Есть поле cxLookUpComboBox в таблице cxGrid, когда меняю значение в нем, оно возвращается на исходное, при этом в обработчике Change этого поля (либо EditValueChanged) у меня идет ЗАПОЛНЕНИЕ ячейки ДРУГОГО поля. И не важно как это происходит через дата сет или активное поле:

ZQVetArrival.FieldValues['Cost'] := 5;

либо

cxGridDBCost.EditValue := 5;

лукап при этом возвращается в исходное состояние. кто-нибудь знает почему?
либо скажите как у вас это работает
Автор: Cryogen2003
Дата сообщения: 14.01.2010 10:46
Добрый день. Еще раз про поиск с cxGrid.
Что-то я не могу понять, почему при обычном Locate в датасете запускаются внутренние методы для полного обновления датасета внутри грида. При 10-20 записях locate отрабатывает доли секунды, а когда в выборке 1000 записей, то при каждом locate приложение замирает секунд на 5

Смотрел исходники девок на эту тему, есть мини непонятка.
В настройках у меня стоит DataController.DataModeController.SmartRefresh = true, но для обновления только части, а не всех данных, она не использовалась.
Но для того, чтобы обновлялось только нужная часть, нужно чтоб в DataController private переменная SmartRefresh была установлена в true, но она всегда установлена в False.
Как сделать, чтобы при locate тупо все данные не обновлял cxGrid? Ну или как сделать так, чтобы эта private переменная была установленна в true. Где она меняется я по их исходникам не нашел.

в принципе часть кода я переписал, для полного соответствия можно использовать что-то типа:

Код:
Temp1 := Grid.DataController.KeyFieldNames;
Try
Grid.DataController.KeyFieldNames := FieldName;
Grid.DataController.BeginLocate;
Try
Grid.DataController.LocateByKey(Temp);
Finally
Grid.DataController.EndLocate;
End;
Finally
Grid.DataController.KeyFieldNames := Temp1;
End;
Автор: X11
Дата сообщения: 14.01.2010 11:07

Цитата:
Но ведь хочется искать и не по полному соответствию, и не только по начальным буквам

Посмотри мои сообщения в третьей части (ближе к концу, несколько страниц)
http://forum.ru-board.com/topic.cgi?forum=33&topic=10123

Автор: Cryogen2003
Дата сообщения: 14.01.2010 11:13
X11
Это я читал конечно, но не знаю, с моей точки зрения могли бы уж они сделать так, чтобы программеры пользовали не их функционалом, а все-таки старым добрым Locate например или конструкцией типа

Код:
While Not MyTable.Eof Do
Begin
...
MyTable.Next;
End;
Автор: JohnSilver182
Дата сообщения: 14.01.2010 11:27

Цитата:
Это я читал конечно, но не знаю, с моей точки зрения могли бы уж они сделать так, чтобы программеры пользовали не их функционалом, а все-таки старым добрым Locate например или конструкцией типа


Я так понял CxGrid сделан как бы по типу EXEL. У него работают по типу , загрузил Датасет и забыл .

З.Ы. А можно используя Дезайн -тайм сделать что бы после ПЕРЕОТКРЫТИЯ Датасета , сxGrid возвращал запись где была до Обновления .

Автор: asi81
Дата сообщения: 14.01.2010 11:31
Добрый день!
Возможно вопрос не по теме, но стало интересно. Я кроме внутренних компонентов билдера использую еще только DEvExpress компоненты. О них у меня достаточно хорошее представление. Других наборов компонентов не пробовал. Сегодня взглянул на описание TMS. Как я понимаю, это конкурирующий пакет для DevExpress. Поэтому захотелось узнать есть ли в нем какие то преимущества, по сравнению с девкспрессом, какая то функциональность, которой нет в девэкспресс. Стоит ли вообще тратить время на поверхностное изучение этого пакета?
Автор: Cryogen2003
Дата сообщения: 14.01.2010 11:40
JohnSilver182
Да переоткрывает датасет он для тебя не заметно, так как просто перечитывает из dataset в свой внутренний dataset. Как бы проблем с этим нет, когда он маленький, но когда начитывается хотя бы 1000 строчек, то дико напрягает
Автор: JohnSilver182
Дата сообщения: 14.01.2010 11:54

Цитата:
Да переоткрывает датасет он для тебя не заметно

Заметно У меня после переоткрытия фокус текущей строки сбивается
Делаю изврат

Код:
l_MR:= cxGrid1DBTableViewMoika.DataController.FocusedRowIndex ;

self.pFIBDataSet1.Close;
pFIBDataSet1.SelectSQL.Text :='бла еб';
pFIBDataSet1.Open;
self.pFIBDataSet_BRON.Open;

if l_MR>=0 then cxGrid1DBTableViewMoika.DataController.FocusedRowIndex :=l_MR ;
Автор: Cryogen2003
Дата сообщения: 14.01.2010 11:56
JohnSilver182
ААА, ты про это. Я думал что ты говоришь про мой случай
Автор: victorman2010
Дата сообщения: 15.01.2010 08:35
Доброго времени суток. Свой вопрос я уже задавал, но конкретного ответа так и не получил. Попробую описать ситуацию более подробно:
По нету приходят xml файлы. Моя программа открывает его (вывожу в cxGrid), редактирует и потом обратно записывает в xml. xmlMapper'om созданы два транспорт файла (.xtr). Использую компоненты: xmlTransform, xmlTransformProvider, ClientDataSet, DataSourse, cxGrid. Суть проблемы: колонка с датой в xml файле имеет вид 40152.9238028009 (xmlMapper'om никак не преобразуеш), если преобразовать в delphi (cxDateEdit1.Date := FloatToDateTime(StrToFloat(ClientDataSet2.FieldByName('datetime').AsString));) то получится 05.12.2009 22:10:16, но это если в cxDateEdit, в грид никак не получается. Подскажить пож что делать? Заранее благодарен.
Читаю файл:
ClientDataSet1.Close;
XMLTransform1.SourceXmlFile := 'C:\_zx.xml';
XMLTransform1.TransformationFile := 'OXtrans.xtr';
ClientDataSet1.XMLData := XMLTransform1.data;
ClientDataSet1.Open;
Сохраняю файл:
XMLTransformProvider1.XMLDataFile := 'C:\_zx.xml';
XMLTransformProvider1.TransformRead.TransformationFile := 'OXtrans.xtr';
XMLTransformProvider1.TransformWrite.TransformationFile := 'toxml.xtr';
ClientDataSet1.ApplyUpdates(-1);
Автор: jonikDk
Дата сообщения: 15.01.2010 09:37
victorman2010
может добавить дополнительное поле в сxgrid, которое будет равно FloatToDateTime(StrToFloat(ClientDataSet2.FieldByName('datetime').AsString)) и по OnChange менять исходное поле.
Автор: X11
Дата сообщения: 15.01.2010 09:57
Что-то не могу понять. Подскажите.
Нужно в цикле проверить значения всех строк вертикальной сетки (cxVerticalGrid)

Код:
for I := 0 to vgTrans.Rows.Count - 1 do
begin
if not (vgTrans.Rows[i] as TcxCategoryRow) then
if vgTrans.Rows[i]. <как добраться до значения>?

end;
Автор: victorman2010
Дата сообщения: 15.01.2010 10:20
Может я чего то не понимаю или не знаю, пробовал создать поле в самом гриде и записывать в него:

procedure TfrmMain.cxGrid2DBTableView1DateTimeGetDataText(
Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
сxGrid2DBTableView1dn.EditValue := FloatToDateTime(StrToFloat(ClientDataSet2.FieldByName('datetime').AsString));
end;

В дата сете создал поле вычисляемое fieldkind - fkCalculated. При загрузке файла поле остается пустым. Может как то я не правильно запись делаю? Коммит для грида может нужно какой то сделать?

Поле создано как fkCalculated и в гриде отображается, запись не происходит...А еще только что заметил, что ручками там ничего не напишеш. Не в нем не в просто текстовым, созданном в самом гриде. Получается дополнительные поля что то блокирует для записи, потому что в тех что загружаются из файла писать (корректировать) можно.
Автор: volser
Дата сообщения: 15.01.2010 10:56
victorman2010
Калькулируемые поля нельзя редактировать. Данные для этого поля нужно менять в событии.
Автор: victorman2010
Дата сообщения: 15.01.2010 11:14
Подскажите тогда пож как это реализовать, потому что ClientDataSet2.FieldByName есть, а
ClientDataSet2.ParamByName нету?

Добавлено:
И какой тогда мне смысл делать калькулируемое поле, т.к. мне нужно записать, отредактировать, а потом снова время преобразовать (напр. 40152.9238028009 )

Добавлено:
volser
Файлы приходят с таким форматом, при конвертации из xml все поля строковые получаются.
Дату отобразил:

procedure TfrmMain.ClientDataSet2CalcFields(DataSet: TDataSet);
begin
ClientDataSet2.FieldByName('dn').AsDateTime := FloatToDateTime(StrToFloat(ClientDataSet2.FieldByName('datetime').AsString));
end;

Только поле калькулируемое, я его редактировать не могу, может есть возможность по другому сделать?
Автор: afiget
Дата сообщения: 15.01.2010 19:26
victorman2010
После импорта заводите в ClientDataSet2 еще одно поле типа DateTime и заполняете это поле по данным "строкового" поля:
ClientDataSet2.FieldByName('dn').AsDateTime := FloatToDateTime(StrToFloat(ClientDataSet2.FieldByName('datetime').AsString));

Вешаете обработчик на OnChange, в котором делаете обратную конвертацию в строку:
ClientDataSet2.FieldByName('datetime').AsString:=FloatToStr(ClientDataSet2.FieldByName('dn').AsDateTime);

Перед сохранением удаляете вспомогательное поле типа DateTime.
Автор: X11
Дата сообщения: 16.01.2010 21:09
Кто знает, TdxMemData можно сохранить в файл? И восстановить потом.
А то в сохранять в поток и восстанавливать из потока как-то не кошерно.
Автор: data man
Дата сообщения: 16.01.2010 21:26
X11

procedure LoadFromTextFile(FileName : String); dynamic;
procedure SaveToTextFile(FileName : String); dynamic;

procedure LoadFromBinaryFile(FileName : String);
procedure SaveToBinaryFile(FileName : String);

procedure LoadFromStream(Stream : TStream);
procedure SaveToStream(Stream : TStream);
Автор: afiget
Дата сообщения: 16.01.2010 23:43
X11
А какая разница? Делаешь поток в файл (TFileStream) и все.
Автор: X11
Дата сообщения: 17.01.2010 00:12
Ну я с потоками и работаю. Подумал просто, что может быть есть что-то типа экспорта в разные форматы у dxMemData
Автор: AvGSoft
Дата сообщения: 18.01.2010 09:44
Установил 48 девок, пробую поиск FindNodeByText(...) курсор переходит на найденую запись но если она находиться за областью видимости дерево не скролится к этому месту автоматом, если ручками протянуть то курсор видно. Такая же ситуация и в 47 девках была, но там еще и с клавиатуры не скролилось, сейчас скролиться, но поиск не скролит. Где копнуть? Вроде говорили, что в 48 должны были исправить, может что не так я делаю.
Автор: Cryogen2003
Дата сообщения: 18.01.2010 12:47
Добрый день. Есть грид в нем какие-то данные. Есть проблема с фильтром по столбцам с датой и временем
Как сделать так, чтобы фильтр по столбцам или настраиваемый фильтр могли нормально фильтровать по датам, но в поле показывалось и дата, и время???
Автор: vladman
Дата сообщения: 18.01.2010 13:39
AvGSoft

Цитата:
пробую поиск FindNodeByText(...) курсор переходит на найденую запись но если она находиться за областью видимости дерево не скролится к этому месту автоматом, если ручками протянуть то курсор видно

Попробуйте после успешного результата поиска выполнить

Код: <Your>cxTreeList.FocusedNode.MakeVisible;
Автор: AvGSoft
Дата сообщения: 18.01.2010 13:44
vladman
Пробывал не помогает. Уже не знаю что и делать. На обычном cxTreeList работает и работоло на 47 версии, а cxDBTreeList не хочет
Автор: asi81
Дата сообщения: 18.01.2010 13:44
Cryogen2003
Навверно можно создать 3 столбца, 1- дата 2- время 3 - дата+время. Показывать в таблице только последний столбец. А в настраиваемом фильтре разрешить фильтрацию по 1ым двум столбцам. В отдельном от грида фильтре можно указывать какие именно столбцы могут учавствовать в фильтре. Что касается втроенного в грид фильтра - то не знаю, не пробовал.
Автор: Cryogen2003
Дата сообщения: 18.01.2010 13:46
asi81
Нееее, без лишних полей надо
Автор: vladman
Дата сообщения: 18.01.2010 13:52
Cryogen2003

Цитата:
Как сделать так, чтобы фильтр по столбцам или настраиваемый фильтр могли нормально фильтровать по датам, но в поле показывалось и дата, и время???

Для понимания фразы "нормально фильтровать по датам" привели бы скин как у вас получается фильтровать "ненормально".
Автор: Cryogen2003
Дата сообщения: 18.01.2010 14:25
vladman
Да это легче описать просто
Нету никакой фильтрации, если присутствует в дате еще и время
То есть в фильтре колонки выбираешь выбор и попадаешь в "настройку фильтра", там выбираешь "равно" и дату, например 17.01.2010. Итог, не одной записи. Хотя за вчерашнее число таких записей пять.

http://img18.imageshack.us/i/image1km.gif/
http://img687.imageshack.us/i/image2f.gif/
http://img25.imageshack.us/i/image3rr.gif/

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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