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

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

Автор: mdid
Дата сообщения: 22.08.2011 10:07
FunCode
поле id первичный уникальный ключ идентификатор...просто может в гриде уже наклацал..
в общем обходными полями вроде уже все сделал
Автор: Graach
Дата сообщения: 23.08.2011 11:41
Вопросик по TcxLookUpComboBox’у, который является строкой в Tcxdbverticalgrid'е.

Свойства у него установлены следующие (естественно есть и ListSource, KeyFieldNames, ListFieldNames):
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).DropDownListStyle := lsEditList;
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).ImmediatePost:=true;
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).ListOptions.SyncMode:=true;
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).UseDisplayFormatWhenEditing := true; //0 эффекта
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).DisplayFormat := '0.00'; //вообще-то формат берется из поля в БД
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).EditFormat := '0.00'; //вообще-то формат берется из поля в БД

Проблема в том, что мне нужно, чтобы данные, которые я ввожу в комбобокс и те, которые выбираются в выпадающем списке были отформатированы в соответствии с какой-то маской, которая задается в БД. Например из БД получаю список: 0.3, 10, 45.46. А выводить мне должно: 0.30, 10.00, 45.46. И при вводе в комбобокс данных типа 0.1 я хочу чтобы он показал 0.10 при смене фокуса, как это делается в TcxMaskEdit’е.

Я ставила DisplayFormat, EditFormat - и 0 результата. А пользователям, видите ли, лень набрать два нолика после запятой. Если использовать
TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).EditMask := [0-9]+\.[0-9]{2};
то естественно происходит валидация и если набрано не два знака после запятой, то выпадает ошибка.
Автор: mdid
Дата сообщения: 23.08.2011 15:15
ну как вариант по событию OnValidate проверяйте количество знаков после запятой..и если не хватает добавьте
точнее даже не так..обрабатывайте событие GetDisplayText и отображайте там дополнительные 0
Автор: Graach
Дата сообщения: 23.08.2011 15:26
mdid
Меня смущает то, что в этом случае он возможно захочет заново провалидировать содержимое поля после того, как я его поменяю. Хотя надо попробовать.
Мне только не совсем понятно каким образом привести значение к форме, указанной в БД: я привела только пример с дробными числами, с таким же успехом это может быть что-то другое (типа какие буквы могут быть, каких не может быть и должны они быть в правильной последовательности...).
Автор: linker_2009
Дата сообщения: 23.08.2011 15:36
Graach

Цитата:
Проблема в том, что мне нужно, чтобы данные, которые я ввожу в комбобокс и те, которые выбираются в выпадающем списке были отформатированы в соответствии с какой-то маской, которая задается в БД.

У поля в Dataset'е, которое выбираете в свойстве DisplayFormat поставьте 0,00. TcxLookUpComboBox сам подтяненет список по формату.

Цитата:
И при вводе в комбобокс данных типа 0.1 я хочу чтобы он показал 0.10 при смене фокуса, как это делается в TcxMaskEdit’е.

Тоже самое если это БД поле, если нет обрабатывайте у колонки OnGetDisplayText. Например, так AText:=Format('%2.2f',[strtofloat(AText)]);
Автор: mdid
Дата сообщения: 23.08.2011 15:43
Graach
а чего ему еще раз делать валидацию?если вы будете пробовать через OnValidate то присваивайте значение не EditValue а DisplayValue...
Автор: Graach
Дата сообщения: 23.08.2011 16:23
linker_2009

Цитата:
У поля в Dataset'е, которое выбираете в свойстве DisplayFormat поставьте 0,00. TcxLookUpComboBox сам подтяненет список по формату.

TNumericField(TcxLookUpComboBoxProperties(GetColumnEditProperty(column)).ListColumns[0].Field).DisplayFormat := '0.00';
Насколько я понимаю это оно. Реакции никакой.

Добавлено:
mdid, linker_2009
С форматом данных, вводимых в поле я разобралась - поставила Format('%2.2f',[strtofloat(DisplayValue)]) в OnValidate. По какой-то причине на событие OnGetDisplayText не цеплялся. Но в общем с этим дело решено.

В крайнем случае, данные, отображаемые в выпадающем списке, можно отформатировать при селекте из БД. Спасибо огромное.
Автор: linker_2009
Дата сообщения: 23.08.2011 16:45
Graach
TNumericField? Я думал что TFloatField
Вот пример, без одной строки кода http://dl.dropbox.com/u/34040596/testDevRuBord_23.rar
Можно еще у поля в датасете обработать событие OnGetText.
Автор: Graach
Дата сообщения: 23.08.2011 17:36
linker_2009
Error (404)
We can't find the page you're looking for. Check out our FAQ or forums for help. Or maybe you should try heading home.

Ему что TNumericField, что TFloatField - абсолютно все равно. А вот OnGetText я попробую, если смогу до него добраться.

Добавлено:
К сожалению, у меня явно проблемы с доступом к событиям филдов в ListSource.DataSet
Автор: X11
Дата сообщения: 24.08.2011 23:31
Есть колонка (Integer) в cxGridDBTavleView типа Combobox. В Combobox добавлено несколько строк. Есть код, который должен присвоить значение индекса выбранной строки Combobox`а.


Код: with GridDB1.DataController do
begin
if IsEditing then
Values[FocusedRecordIndex, GridDB1MED_TYPE.Index] := (GridDB1MED_TYPE.Properties as TcxComboBoxProperties).Items.IndexOf(GridDB1MED_TYPE.EditValue);
end;// with
Автор: linker_2009
Дата сообщения: 25.08.2011 01:45
Для этого есть ТcxImageComboBox, без картинок
Автор: ramis1975
Дата сообщения: 25.08.2011 01:57
Подскажите пож. как лучше реализовать динамическое изменение PropertiesClass в колонке грида. Т.е. в таблице есть текстовое поле значения, и поле тип
В зависимости от поля тип, я хочу присваивать колонке значение PropertiesClass соответствующий.
что то типа
if тип = 'number' then
значение.PropertiesClass := TcxCalcEditProperties
else if тип = 'string' then
значение.PropertiesClass := TcxTextEditProperties
else if тип = 'combo' then
значение.PropertiesClass := TcxComboBoxProperties
и т.д.
Автор: linker_2009
Дата сообщения: 25.08.2011 02:29
У колонки есть событие OnGetProperties - тут выставляете нужный для отображения
На событие OnGetPropertiesForEdit - Выставляется перед редактированием
И прочитайте о них в справке, там подробно с примерами.
Автор: X11
Дата сообщения: 26.08.2011 15:29
Подскажи мне, о великий All, есть ли возможно с помощью компонентов DevExpress организовать на форме что-то вроде горизонтальной полосы прокрутки изображений?
Изображения хранятся на диске. Но их можно загрузить и в TdxMemTable.

Что вроде такого, как здесь:
milovanov.info/demo/scrolled-blocks/
dynamicdrive.com/dynamicindex2/crawler/index.htm
ioncannon.net/examples/slide/example1.html

Хочется сделать что-то вроде случайные картинки и рядом или ниже некоторое небольшое описание каждой картинки.
Автор: xokc
Дата сообщения: 26.08.2011 16:04
X11
А в чём именно фишка то? В плавной прокрутке?
Если нет - то на обычный Grid с CardView похоже.
Автор: X11
Дата сообщения: 26.08.2011 16:08
Ну да, хотелось бы конечно и плавную прокрутку.
С CardView не работал ни разу. Хоть с чего начать?
Автор: X11
Дата сообщения: 26.08.2011 19:55
Хочу вывести картинки в обычном cxGrid.


Код:
if dbgArendaPhoto.Visible then
if AViewInfo.Item.Name = 'dbgArendaPhoto' then
begin
sFN_Photo := fmMain.sPhotoArenda + VarToStr(AViewInfo.GridRecord.Values[dbgArendaID.Index]) + '\thumb\' + VarToStr(AViewInfo.GridRecord.Values[dbgArendaID.Index]) + '.bmp';

if FileExists(sFN_Photo) then
begin
x := AViewInfo.ContentBounds.Left;
y := AViewInfo.ContentBounds.Top;

bm := TPicture.Create;
try
bm.LoadFromFile(sFN_Photo);
ACanvas.Draw(x, y, bm.Bitmap);
//ACanvas.canvas.Draw(x, y, bm.Bitmap);
finally
bm.Free;
end;
end;// if FileExists(sFN_Photo) then
end;
Автор: wasilissk
Дата сообщения: 26.08.2011 20:24

Код:
if FileExists(sFN_Photo) then
begin

bm := TPicture.Create;
try
bm.LoadFromFile(sFN_Photo);
ACanvas.Canvas.Draw(0, 0, bm.Bitmap);
ADone := False;
finally
bm.Free;
end;
end;// if FileExists(sFN_Photo) then
Автор: linker_2009
Дата сообщения: 26.08.2011 20:28
Лучше у колонки в properties выставить Image, настройть формат и способ отображения и работать с ним.
Автор: X11
Дата сообщения: 26.08.2011 20:34

Цитата:
Лучше у колонки в properties выставить Image, настройть формат и способ отображения и работать с ним.


так и сделано, GraphicClassName выставлено в TBitmap, файлы типа bmp



Цитата:
ACanvas.Canvas.Draw(0, 0, bm.Bitmap);

пробовал, та же проблема

Добавлено:

Цитата:
настройть формат и способ отображения и работать с ним.

Что ты имеешь ввиду, можно пример?
Автор: linker_2009
Дата сообщения: 26.08.2011 20:57
X11
В этой же ветке, в начале было
[more=решение в лоб]
var
filename:string;
ss:tstringstream;
begin
filename:='C:\002.jpg';
ss:=tstringstream.Create;
ss.LoadFromFile(filename);
cxGrid1TableView1.DataController.Values[0,0]:=ss.DataString;
ss.Free;
end;
[/more]
Автор: wasilissk
Дата сообщения: 26.08.2011 21:42
X11

Цитата:
пробовал, та же проблема

Там еще есть ADone := False попробуй с ним поиграться (поставить в True, я точно не помню что надо ставить, но он важен - отключает дальнейшую прорисовку), глянь в коде девак.
Делфи под рукой нет...
Автор: X11
Дата сообщения: 26.08.2011 22:13
Done должно быть False, по умолчанию оно имеет именно False, я его и не трогаю.

Добавлено:
linker_2009, ты уверен, что нужно использовать именно tstringstream? Тем более там нет метода LoadFromFile.

Добавлено:
linker_2009, это?


Код:
вот пример загрузки изображения из TcxImage через поток.

var
Row: TcxEditorRow;
...
после
Row.Properties.EditPropertiesClass := TcxImageProperties;

вставь это
stream:=tStringstream.Create('');
cxImage1.Picture.Icon.SaveToStream(stream);// сохранение из имаджа в стреам
Row.Height:=50;
with (Row.Properties.EditProperties as TcxImageProperties) do
begin
GraphicClassName:='TIcon';
Stretch:=true;
end;
stream.Seek(0,0);
Row.Properties.Value:=stream.DataString;
stream.Free;
Автор: X11
Дата сообщения: 27.08.2011 00:17
Посмотрел этот пример
http://www.devexpress.com/Support/Center/p/A2322.aspx

Всё сделал по пунктам, только без событий.
Ошибок нет. Вроде и картинка грузится, но ячейки пустые. Зато код быстрее отрабатывает и не нужно картинку грузить каждый раз при прокрутке. Загрузка выполняется только один раз.
Не могу понять, где прокололся.
Автор: linker_2009
Дата сообщения: 27.08.2011 01:13
X11

Цитата:
И ещё проблема в том, что картинка отрисовывается не полностью

<YouColumn>.Properties.Stretch:=true;

После ASStream.CopyFrom(AFStream, 0);
Попробуй поставить
ASStream.Seek(0,0);
Автор: X11
Дата сообщения: 27.08.2011 09:09

Цитата:
<YouColumn>.Properties.Stretch:=true;

Ну конечно же пробовал.
Но я уверен, что это свойство влияет на ЗАГРУЖЕННУЮ КАРТИНКУ, а мы её просто рисуем. Поэтому картинку ДО отрисовывания нужно сжимать до размеров ячейки.
Автор: X11
Дата сообщения: 28.08.2011 15:42
Не могу понять. Почему TcxGridDBTableView не отображает картинки.

Сделал так.
В Firebird базе создал blob поле в таблице. В датасете тоже создал это поле.
Теперь в событии OnGetText заполняю его.
Идею взял отсюда>>

Вот мой код.


Код: procedure TDM.fibdsArendaSearchDOCGetText(Sender: TField; var Text: string;
DisplayText: Boolean);
Var
sFN_Photo: string;
Stream, DataStream: TStream;
begin
sFN_Photo := fmMain.sPhotoArenda + fibdsArendaSearchId.AsString + '\thumb\' + fibdsArendaSearchId.AsString + '.bmp';
if not FileExists(sFN_Photo) then exit;

Stream := TFileStream.Create(sFN_Photo, fmOpenRead);
DataStream := TStringStream.Create('');
try
DataStream.CopyFrom(stream, 0);
Text := TStringStream(DataStream).DataString;
//DisplayText := true;

// TBlobField(sender).LoadFromStream(stream);

finally
Stream.free;
DataStream.free;
end;
end;
Автор: salexn1
Дата сообщения: 29.08.2011 12:51
X11
Ничего не понимаю... Зачем блоб поле в базе?
Там хранится фото?
Автор: X11
Дата сообщения: 29.08.2011 16:57
Хорошо, подскажи тогда как загрузить картинку с диска в датасет на ходу?
Автор: vladman
Дата сообщения: 29.08.2011 17:27
X11

Цитата:
Хорошо, подскажи тогда как загрузить картинку с диска в датасет на ходу?

что-то не получается понять какова ваша конечная задача с этими картинками.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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