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

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

Автор: X11
Дата сообщения: 29.08.2011 20:53

Цитата:
загрузить картинку с диска в датасет на ходу

Автор: vladman
Дата сообщения: 29.08.2011 23:27
X11

Цитата:
загрузить картинку с диска в датасет на ходу

В таком случае какой датасет вы используете?
Автор: X11
Дата сообщения: 30.08.2011 00:00
TpFibDataSet
Автор: vladman
Дата сообщения: 30.08.2011 00:48
X11

Цитата:
TpFibDataSet

Если кратко, то в общем случае загрузка картинки из файла в TpFibDataSet может выглядеть так:

Код: uses DB;
...
<YourFibDataSet>.Edit;
TBlobField(<YourFibDataSet>.FieldByName('YourFieldForImage')).LoadFromFile(YourImageFileName);
<YourFibDataSet>.Post;
Автор: X11
Дата сообщения: 30.08.2011 08:42

Цитата:
Если кратко, то в общем случае загрузка картинки из файла в TpFibDataSet может выглядеть так:

Код:
uses DB;
...
<YourFibDataSet>.Edit;
TBlobField(<YourFibDataSet>.FieldByName('YourFieldForImage')).LoadFromFile(YourImageFileName);
<YourFibDataSet>.Post;


Ты не понял. Мне нужно грузить картинку НЕ в базу, а показать в гриде. Но показать так, как будто картинка загружена в датасет.

Рисовать OnCusomDrawCell получилось но криво, т.к. картинка большая, и свойства Stretch и Proportional колонки грида не работают.

Поэтому мне нужно загрузить картинку в датасет, чтобы грид сам нарисовал картинку. Мало того, если выводить на печать, то девовская система печати не обращает внимание на то, что нарисовано через событие OnCusomDrawCell и будет выводить пустую ячейку.

Добавлено:
Вот: http://forum.ru-board.com/topic.cgi?forum=33&topic=12015
более полное описание.
Автор: vladman
Дата сообщения: 30.08.2011 09:02
X11

Цитата:
Ты не понял. Мне нужно грузить картинку НЕ в базу, а показать в гриде. Но показать так, как будто картинка загружена в датасет.

Понял именно так как было написано
Цитата:
загрузить картинку с диска в датасет на ходу
, поэтому и спрашивал о конечной цели. Теперь понятней. Позже постараюсь набросать пример.
Автор: Dima335
Дата сообщения: 30.08.2011 10:22
Всем привет. Как сделать скроллинг с трэкингом в cxGridDBTableView?
И от чего зависит будет выполняться сортировка строк при щелчке на заголовке или нет? У меня не выполняется
Автор: linker_2009
Дата сообщения: 30.08.2011 10:35
трэкингом??? обьясните что имеете в виду.
Автор: salexn1
Дата сообщения: 30.08.2011 10:39
X11
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
aPicture: TPicture;
begin
if AViewInfo.Item.Index = 1 then // это колонка с Image
begin
aPicture := TPicture.Create;
try
aPicture.LoadFromFile(AViewInfo.RecordViewInfo.GridRecord.Values[0]); // Values[0] - путь к картинкам
ACanvas.Draw(AViewInfo.Bounds.Left, AViewInfo.Bounds.Top, aPicture.Graphic);
// тут еще нужно поменять высоту строки
finally
aPicture.Free;
end;
ADone := True;
end;
end;
Автор: Dima335
Дата сообщения: 30.08.2011 10:39

Цитата:
трэкингом??? обьясните что имеете в виду.

С трэкингом - это перемещаешь скролбар и содержимое (таблица в данном случае) тоже перемещается, а без трэкинга - это переместил, а содержимое перемещается только после того как отпустишь кнопку мыши
Автор: linker_2009
Дата сообщения: 30.08.2011 10:52
Dima335
По умолчанию есть такое, в 56 версий. В версиях выше не знаю, там много чего изменилось.
Автор: Dima335
Дата сообщения: 30.08.2011 11:06
linker_2009

Цитата:
По умолчанию есть такое, в 56 версий. В версиях выше не знаю, там много чего изменилось.

Спасибо, разрешилось установкой gridmode в false
Автор: X11
Дата сообщения: 30.08.2011 11:10
salexn1, я же уже давал этот код рисования на канве и уже объяснил проблемы и неудобства. Спасибо, конечно, но это уже самый крайний случай или тогда вообще не выводить картинки.
Автор: salexn1
Дата сообщения: 30.08.2011 13:21
X11
как вариант, использовать вместо датасета, напрямую прикрученного к базе, ClientDataSet или любой другой in-memory датасет. Скопровать туда данные и загрузить картинки при загрузке данных.
Автор: X11
Дата сообщения: 30.08.2011 14:00
это не вариант
Автор: vladman
Дата сообщения: 30.08.2011 14:33
X11

Цитата:
это не вариант

[more=Вот вам рабочий вариант, именно так как вы хотели и без компромиссов )), а то две страницы исписали... ))]

Код:
.pas
interface

type
TForm20 = class(TForm)
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
dxMemData1: TdxMemData;
DataSource1: TDataSource;
dxMemData1Field1: TStringField;
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1Field1: TcxGridDBColumn;
cxGrid1DBTableView1Column1: TcxGridDBColumn;
procedure FormCreate(Sender: TObject);
private
function FileToString(AFileName: string): string;
procedure DoLoadImageForEachRow(ARowIndex: Integer; ARowInfo: TcxRowInfo);
public
end;

implementation

function TForm20.FileToString(AFileName: string): string;
var
vStream: TFileStream;
vString: string;
begin
vStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
try
vStream.Position := 0;
SetLength(vString, vStream.Size);
vStream.ReadBuffer(Pointer(vString)^, vStream.Size);
finally
vStream.Free;
end;
Result := vString;
end;

procedure TForm20.DoLoadImageForEachRow(ARowIndex: Integer; ARowInfo: TcxRowInfo);
begin
cxGrid1DBTableView1.DataController.Values[ARowInfo.RecordIndex, cxGrid1DBTableView1Column1.Index] :=
FileToString(Format('c:\File%d.bmp', [ARowInfo.RecordIndex + 1]));
end;

procedure TForm20.FormCreate(Sender: TObject);
begin
cxGrid1DBTableView1.DataController.ForEachRow(False, DoLoadImageForEachRow);
end;

end.

.dfm
object Form20: TForm20
Left = 0
Top = 0
Caption = 'Form20'
ClientHeight = 290
ClientWidth = 554
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object cxGrid1: TcxGrid
Left = 0
Top = 0
Width = 554
Height = 290
Align = alClient
TabOrder = 0
ExplicitLeft = -8
object cxGrid1DBTableView1: TcxGridDBTableView
NavigatorButtons.ConfirmDelete = False
DataController.DataModeController.SmartRefresh = True
DataController.DataSource = DataSource1
DataController.KeyFieldNames = 'RecId'
DataController.Summary.DefaultGroupSummaryItems = <>
DataController.Summary.FooterSummaryItems = <>
DataController.Summary.SummaryGroups = <>
OptionsCustomize.DataRowSizing = True
OptionsView.CellAutoHeight = True
OptionsView.Indicator = True
object cxGrid1DBTableView1RecId: TcxGridDBColumn
DataBinding.FieldName = 'RecId'
Visible = False
end
object cxGrid1DBTableView1Field1: TcxGridDBColumn
DataBinding.FieldName = 'Field1'
Width = 79
end
object cxGrid1DBTableView1Column1: TcxGridDBColumn
DataBinding.ValueType = 'Variant'
PropertiesClassName = 'TcxImageProperties'
end
end
object cxGrid1Level1: TcxGridLevel
GridView = cxGrid1DBTableView1
end
end
object dxMemData1: TdxMemData
Active = True
Indexes = <>
Persistent.Data = {
5665728FC2F5285C8FFE3F010000000A000000010007004669656C6431000103
000000616161010300000062626201030000006363630103000000646464}
SortOptions = []
Left = 272
Top = 88
object dxMemData1Field1: TStringField
FieldName = 'Field1'
Size = 10
end
end
object DataSource1: TDataSource
DataSet = dxMemData1
Left = 272
Top = 120
end
end
Автор: X11
Дата сообщения: 30.08.2011 21:11
vladman, мне кажется, ты делаешь тоже самое, что и я через StringStream.

Применил твои две процедуры к свой программе - всё равно ячейки пустые

Смотрю в отладчике, что в грид грузятся те же самые данные, что и у меня.

Пытаюсь собрать воедино твой пример.
Автор: vladman
Дата сообщения: 30.08.2011 21:30
X11

Цитата:
vladman, мне кажется, ты делаешь тоже самое, что и я через StringStream.
Применил твои две процедуры к свой программе - всё равно ячейки пустые

Значит не то же самое.

Цитата:
Пытаюсь собрать воедино твой пример.

А чего пытаться, два файла, два раза ctrl+c и ctrl+v - все предельно просто.
Автор: X11
Дата сообщения: 30.08.2011 21:30
Использовал твой код. Получилось. Я обратил внимание, что у колонки грида, DataBinding.ValueType ты установил в Variant.
Колонка при этом не привязана к датасету.

Но у меня было почти так же. DataBinding.ValueType было установлено в Variant. Те же данные поступали в грид от датасета. Но почему не было изображения... ума не приложе.

В общем, спасибо тебе большое!

Добавлено:

Цитата:
А чего пытаться, два файла, два раза ctrl+c и ctrl+v - все предельно просто.


Не, пришлось помучится некоторых мелочей там не хватало.
Автор: vladman
Дата сообщения: 30.08.2011 21:55
X11

Цитата:
Но почему не было изображения... ума не приложе

Скорее всего не было рефреша, либо он был не корректен.

Цитата:
Колонка при этом не привязана к датасету.

В этом и есть главный трик (для конкретно вашего случая), сделать анбаунд (не привязанную к датасету) колонку, а данные сохранять непосредственно в датаконтроллер.
В общем, не за что, рад что смог помочь!
А помучиться с uses - так это всегда полезно )), да и с рефакторингами это не так уж и сложно )).

Автор: X11
Дата сообщения: 30.08.2011 21:56
Теперь ещё один вопрос. Файлы изображений могут быть разнотипные: bmp, png, jpg, jpeg, gif.

Они нормально все отобразятся?
Автор: vladman
Дата сообщения: 30.08.2011 22:08
X11

Цитата:
Файлы изображений могут быть разнотипные: bmp, png, jpg, jpeg, gif. Они нормально все отобразятся?

Ничего не мешает вам это проверить в течении 5 минут и сообщить здесь о результатах. )). Но, по идее, будут корректно отображаться только те форматы, которые поддерживает TcxImage, т.е.
Цитата:
The TcxImage object represents an editor used to display a single image. The displayed image can be of the following types: JPEG image (.jpg and .jpeg), bitmap (.bmp), icon (.ico) and metafile (.emf and .wmf).
Автор: X11
Дата сообщения: 30.08.2011 22:14
GraphicClassName : =TdxSmartImage спасло гиганта мысли

Но на больших фотографиях прокрутка нереально тормозит. Придётся писать программу для создания миникопий изображений

Добавлено:
Для старых версиях DevExpress, TdxSmartImage может не обрабатывать JPG файлы. Решение здесь:
http://www.devexpress.com/Support/Center/p/S137790.aspx

По крайней мере у меня версия 2011.1.5 работает без этого костыля

Добавлено:
Слушайте, а может у дефок есть какой-нибудь класс или компонента, чтобы изменить размер изображения?
Автор: Czechoslovak
Дата сообщения: 31.08.2011 10:15
X11

Цитата:
Слушайте, а может у дефок есть какой-нибудь класс или компонента, чтобы изменить размер изображения?


функцией StretchDraw:
http://www.devexpress.com/Support/Center/p/Q146133.aspx
http://www.devexpress.com/Support/Center/kb/p/K18456.aspx
Автор: sldaac
Дата сообщения: 01.09.2011 08:44
Други, подскажите как можно такое сотворить. Может даже компонент не от девок использовать, а другой, главное возможность такое реализовать



Uploaded with ImageShack.us
Автор: Elena4uDo
Дата сообщения: 01.09.2011 10:07
Здравствуйте.
Помогите плиз.
cxGrid: Level1-cxGridTableView1 у нее есть подуровень Level2-cxGridTableView2
Проблема состоит в том, что я не могу привязать строки подчиненной таблицы к строкам главной....
Автор: X11
Дата сообщения: 01.09.2011 11:12
sldaac, я вижу такой вариант: при выборе радиокнопки, пробегаться по всем записям и отключать все остальные в цикле. Или же просто запросом, так даже проще будет: update table1 set field_r_button = 0 where id <> 102
вот как -то так
Автор: sldaac
Дата сообщения: 01.09.2011 11:17
X11
такой вариант я не исключаю, тогда чекбокс лучше использовать, но немного геморно конечно.
Автор: X11
Дата сообщения: 01.09.2011 11:21

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


Проблема в 17ой строке, это же очевидно

Добавлено:
Чекбокс лучше не использовать, это противоречит может быть не удобству использования, а стандартам. Ведь чекбокс подразумевает под собой множественный выбор.

Добавлено:
Ведь пользователь привык и он знает, что чекбоксом можно выбрать несколько значение, а ридиокнопкой только одно. А ты его собьёшь с пути истинного. Хотя это уже, конечно, не моё дело
Автор: sldaac
Дата сообщения: 01.09.2011 11:57
X11
а ридиокнопка то-же не очень, как она реализуется, получается в каждой строке 2 варианта выбора, и даже если сделать update table1 set field_r_button = 0 where id <> 102 пользователю трудно будет из всех строк искать, где как выбрана радиокнопка. Чекбок кажется лучше, потому как пользователь из группы (развернув "+") должен выбрать только одну запись.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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