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

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

Автор: AvGSoft
Дата сообщения: 11.02.2010 16:20
Добрый день!
Столкнулся с такой проблемой
Есть EditMask следующего вида \d\d '\' .. '; '\d\d'\'.. тип маски emkRegExprEx по идее должно получаться к примеру строка 12256589 -> 12\25; 65\89, при тестовом вводе так и получается, а вот если получить данные из таблицы в cxDBMaskEdit то получается вместо 12256589 -> 12\

Уже не знаю что и делать, может маску задаю не верно?
Автор: afiget
Дата сообщения: 12.02.2010 08:15
xMrSpider
Значения одинаковые, т.к. для грида есть только 1 главный уровень!

Чтобы пройтись по нижним уровням нужно сделать что-то типа:
for I := 0 to cxGrid1.Levels[0].Count - 1 do
cxGrid1.Levels[0].Items[I] --- вот уровень

Можно проверять TcxCustomGridView.Focused (или TcxCustomGrid.FocusedView - зависит от задачи) для определения активного View.
Автор: OwnerZ
Дата сообщения: 12.02.2010 08:34
Добрый день.

У меня такой вопрос можно ли создав колонку где DataBinding FildName содежрит Idшники проставить в Properties этой колонки как CheckBox.

Собственно как изменять значения в CheckBox на True если ID не Null?

Такой способ приемлем?

Или если не подходит есть какая нибудь другая возможность коректно заменить ненужные для просмотра ID?

Спасибо.
Автор: AvGSoft
Дата сообщения: 12.02.2010 09:11
Народ ну подскажите по маске, в cxGrid'е для столбцов где нужна была маска и также не работала реализовал через GetDisplayText() и свой обработчик формата, а как быть с cxDBMaskEdit - подходящего св-ва не нашел.
Автор: OwnerZ
Дата сообщения: 12.02.2010 10:18
Немного разобрался в CheckBox есть свойства DisplayChecked и DisplayUnchecked которые нужно указать как пример. Но у меня же там ID и если выбрать для сравнения значения NULL то как указать в DisplayChecked чтобы он отмечал все значения не равные null.
not si null или <> Null неподходят.
Есть ли универсальное значение не равно null? Для CxGrid. Для пустых значений это автоматом ставится (Null)

Извиняюсь если пишу путано.

Добавлено:
Итак если не замарачиватся то можно воспользоваться BlobEdit он подставит в ненулевые значения картинку с текстом пустые значения будут как белый лист.

То что нужно.
Автор: fortezza
Дата сообщения: 12.02.2010 15:06
Можно сделать так, чтобы сгруппированные записи всегда раскрывались (были раскрыты)?
Автор: tanaseduard
Дата сообщения: 12.02.2010 16:15
После обновления данных вызывай метод
ViewData.Expand(True);
Автор: vladman
Дата сообщения: 13.02.2010 11:34
AvGSoft

Цитата:
Столкнулся с такой проблемой Есть EditMask следующего вида..
при тестовом вводе так и получается, а вот если получить данные из таблицы в cxDBMaskEdit то получается вместо 12256589 -> 12\

В том то и дело, что MaskEdit необходим для ввода значений в нужном формате. При отображении сохраненных значений, они (значения) должны соответствовать формату, т.е. маске. Так как ваше значение 12256589 не соответствует маске, оно и отображается не полностью. Для решения вашей проблемы нужны некоторые уточнения. Если правильно понимаю у вас есть некое поле в БД заполненное значениями вида 12256589. Вы хотите их визуализировать как 12\25; 65\89. Также при редактировании или внесении новых значений в это поле вы хотите давать пользователю вводить значения в MaskEdit. Как вы хотите чтобы введенные значения сохранялись в БД? Так - 12256589, или так 12\25; 65\89?

Добавлено:
OwnerZ

Цитата:
Или если не подходит есть какая нибудь другая возможность коректно заменить ненужные для просмотра ID?

Может его лучше вообще не отображать в гриде.
Если вам обязательно давать пользователю информацию о заполненности поля с ID использую CheckBox, создайте вычисляемое поле значение которого будет 0 при ID = null и 1 при ID <> null, соответственно.
Автор: GladeX
Дата сообщения: 13.02.2010 15:08
Имеется код на Delphi 2010 (за основу взят из справки-примера DevExpress)
//*******************************************
type
TMyPainter = class(TcxSheetPainter)
protected
procedure DrawCells; override;
end;
TForm2 = class(TForm)
cxSpreadSheet1: TcxSpreadSheet;
....
procedure TMyPainter.DrawCells;
...
Canvas.Canvas.TextOut(ViewInfo.Bricks[i, j].DisplayRect.Left, ViewInfo.Bricks[i, j].DisplayRect.Top, '*');
.....
procedure TForm2.cxSpreadSheet1CustomPaint(Sender: TObject; var PainterClass: TcxSheetPainterClass);
begin
PainterClass := TMyPainter;
end;
//*******************************************
Все работает на отлично, но тот же код но на Builder C++ 2010 вываливается в AccessVioletion:
//*******************************************
// --header---------------------------------------------------------------------
class TMyPainter : TcxSheetPainter {
protected:
    virtual void __fastcall DrawCells(void);
};

// ---------------------------------------------------------------------------
class TForm2 : public TForm {
__published: // IDE-managed Components
    TcxSpreadSheet *cxSpreadSheet1;

    void __fastcall cxSpreadSheet1CustomPaint(TObject *Sender, TcxSheetPainterClass &PainterClass);

// -- C++ ------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) {
    cxSpreadSheet1->PainterType = ptCustom;
}
// ---------------------------------------------------------------------------
void __fastcall TForm2::cxSpreadSheet1CustomPaint(TObject *Sender, TcxSheetPainterClass &PainterClass) {
    PainterClass = __classid(TMyPainter);
}
// ---------------------------------------------------------------------------
void __fastcall TMyPainter::DrawCells(void) {
    TRect ARect = ViewInfo.Bricks[1][1].DisplayRect; <<== Ошибка здесь.Структура ViewInfo не инициализирована
}
// ---------------------------------------------------------------------------
Опции и установки проектов установлены по умолчанию, похоже не инициализируется структура ViewInfo.. но почему в Дельфе все проходит успешно?
Автор: AvGSoft
Дата сообщения: 13.02.2010 17:48
vladman

Цитата:
Как вы хотите чтобы введенные значения сохранялись в БД? Так - 12256589, или так 12\25; 65\89?

В БД должно сохраняться как 12256589, а на экране 12\25; 65\89.
Как уже говорил выше для cxGrid
Цитата:
реализовал через GetDisplayText() и свой обработчик формата
, а для визуализации через cxDBPopupEdit подходящего свойства не нашел. (может конечно плохо искал). Нашел только инфу, что нужно копать в направлении DataSet'a, а именно SetFieldValue() и GetFieldValue(), но как то коряво выходит
Автор: vladman
Дата сообщения: 14.02.2010 10:54
AvGSoft

Цитата:
В БД должно сохраняться как 12256589, а на экране 12\25; 65\89.

Попробуйте так
[more=pas, dfm]

Код: unit Unit10;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles, dxSkinsCore, dxSkinMcSkin,
dxSkinsDefaultPainters, dxSkinscxPCPainter, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridLevel, cxClasses, cxGridCustomView, cxGrid,
dxmdaset, cxNavigator, cxDBNavigator, cxMaskEdit;

type
TForm10 = class(TForm)
dxMemData1: TdxMemData;
dxMemData1Filed1: TStringField;
DataSource1: TDataSource;
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1Filed1: TcxGridDBColumn;
cxDBNavigator1: TcxDBNavigator;
procedure dxMemData1Filed1GetText(Sender: TField; var Text: string; DisplayText: Boolean);
procedure dxMemData1Filed1SetText(Sender: TField; const Text: string);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form10: TForm10;

implementation

{$R *.dfm}

procedure TForm10.dxMemData1Filed1GetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
if VarIsNull(Sender.Value) then Exit;
Text := VarToStr(Sender.Value);
Text := copy(Text, 1, 2) + '\' + copy(Text, 3, 2) + '; ' + copy(Text, 5, 2) + '\' + copy(Text, 7, 2);
end;

procedure TForm10.dxMemData1Filed1SetText(Sender: TField; const Text: string);
var
vText: string;
begin
vText := StringReplace(Text, '\', '', [rfReplaceAll]);
vText := StringReplace(vText, ';', '', [rfReplaceAll]);
vText := StringReplace(vText, ' ', '', [rfReplaceAll]);
Sender.Value := vText;
end;

end.
Автор: GladeX
Дата сообщения: 15.02.2010 09:18
Неужели никто не сталкивался с такой проблемой в работе с компонентом TcxSheetPainter?? %)
Автор: AvGSoft
Дата сообщения: 15.02.2010 13:53
vladman
Работает нормально. Спасибо!
Автор: shum44
Дата сообщения: 15.02.2010 22:23
Возник вопросы по dll со скинами которая представлена в заголовке темы. Вообщем скачал я ее попробовал скомпилить представленные в ней демонстрационный пример...и результат ноль...при запуске ругается что не найден ресурс B32X32. в чем может быть проблема? проверял на delphi 2009, DEVEXPRESS .48. Будет ли обновляться бибилиотека и будет ли инструмент для создание dll?
Автор: Senpai07
Дата сообщения: 16.02.2010 10:41
shum44

Цитата:
проверял на delphi 2009, DEVEXPRESS .48

Были и у меня ошибки на D2009
Исправлял так
lpName: PAnsiChar;
на
lpName: PChar;
Автор: shum44
Дата сообщения: 16.02.2010 11:15
Senpai07, а по поводу добавления новых скинов можешь что сказать?
Автор: Senpai07
Дата сообщения: 16.02.2010 14:08
shum44

Цитата:
по поводу добавления новых скинов можешь что сказать?


В версии для печати 3-ей части как-то видел Andrey128 писал
о некоем скрипте make_skins_dll.rar
Автор: shum44
Дата сообщения: 16.02.2010 17:21
Кто скачал архив make_skins_dll.rar с предыдущей части...перевыложите его плиз...ссылка померла...
Автор: X11
Дата сообщения: 17.02.2010 10:02
Вопрос по dxMemData. Хочу выполнить шифрование одного из полей. Затем сохранить набор данных в файл.


Код:

procedure TfmFtpUpdater.tUpdaterPasswordGetText(Sender: TField;
var Text: string; DisplayText: Boolean);
begin
Text := Decrypt(VarToStr(sender.Value), kd);
end;

procedure TfmFtpUpdater.tUpdaterPasswordSetText(Sender: TField;
const Text: string);
begin
sender.Value := Encrypt(text, ke);
end;
Автор: jonikDk
Дата сообщения: 17.02.2010 13:08
X11
у тебя поле не зашифрованное хранится в DataSet поэтому и сохраняется не зашифрованное
Автор: X11
Дата сообщения: 17.02.2010 13:25
Тогда как мне на лету запихать шифрованное значение в поле? Не подскажешь?

В другом проекте я тоже использую события OnSetText, правда, у компонент Fib+ и в базу попадает шифрованное значение.
Автор: jonikDk
Дата сообщения: 17.02.2010 13:28
X11
отпиши подробней, как данные попадают в DataSet через грид или по другому ? что происходит в гриде ?
Автор: X11
Дата сообщения: 17.02.2010 13:46
Пользователь редактирует cxGrid ручками. Всё связано через TDataSource.
Автор: jonikDk
Дата сообщения: 17.02.2010 14:26
X11
вообщем при выгрузке данных из memdataset используется событие OnGetText а так как, у тебя там стоит расшифровка, то соответственно и выгружается расшифрованное
Значит перед сохранением делаем так,
tUpdaterPassword.OnGetText := nil;
после сохранения
tUpdaterPassword.OnGetText := метод который делает расшифровку


Автор: X11
Дата сообщения: 17.02.2010 14:37
Ок, спасибо за совет, но теперь вопрос, что мне указать в качестве параметров для tUpdaterPasswordGetText(что здесь указать);


Код:
tUpdaterPassword.OnGetText := nil;
tUpdater.SaveToTextFile(ExtractFilePath(ParamStr(0)) + sFileNameToSavedxMem);
tUpdaterPassword.OnGetText := tUpdaterPasswordGetText();
Автор: jonikDk
Дата сообщения: 17.02.2010 15:14
X11

Код:
private
{ Private declarations }
procedure PassGetText(Sender: TField; var Text: string; DisplayText:
Boolean);
...

procedure TForm1.PassGetText(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
Text := Decrypt(VarToStr(sender.Value), kd);
end;
...

tUpdaterPassword.OnGetText := nil;
tUpdater.SaveToTextFile(ExtractFilePath(ParamStr(0)) + sFileNameToSavedxMem);
tUpdaterPassword.OnGetText := PassGetText;

Автор: X11
Дата сообщения: 17.02.2010 15:20
Да, спасибо, надо было без скобок - tUpdaterPasswordGetText;

Добавлено:
Всё равно проблема. При загрузке файла поставил бряку в событии
TfmFtpUpdater.tUpdaterPasswordGetText

13 раз событие было вызвано. Может это cxGrid так балуется?
Автор: jonikDk
Дата сообщения: 17.02.2010 15:42
X11
по моему onGet отрабатывает при перерисовке. Я вообще не пользуюсь этими событиями. В хелпе надо посмотреть про это событие.
Попробуй расшифровку сделать с помощью грида.
Автор: Cryogen2003
Дата сообщения: 17.02.2010 19:27
Добрый вечер. Возникла проблема и никак не могу решить ее.
Сегодня обновил все-таки девок с 47 на 48 версию. Вроде все хорошо, но потом заметил глючокс. Не работает popupmenu от tcxspellchecker на edit компонентах. То есть всплывает стандартное окошко с фразами типа вставить, копировать, вырезать и так далее, но не всплывает с данными для замены. Сначала думал, что это глючит вторая версия spellchecker, откомпилил первую версию, глюк остался. Самое интересное, что в демках данная часть работает, а в моем проекте нет.
отличия моего проекта от демки только в несколько вещах:
1) сам компонент стоит на форме датамодуля
2) словари настраиваются и грузяться в рунттайме

Стало быть, что делать и где искать решение проблемы?
Автор: vladman
Дата сообщения: 18.02.2010 00:51
X11

Цитата:
Вопрос по dxMemData. Хочу выполнить шифрование одного из полей. Затем сохранить набор данных в файл.

Если бы вы просматривали сообщения не только касательно ваших проблем, то вы бы нашли решение вашей проблемы без проблем, каламбурчик получился . Недавно, буквально на прошлой странице, AvGSoft интересовался решением подобного вопроса и, предложенное решение, http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=180#12 вроде бы помогло.


Добавлено:
X11

Цитата:
Вопрос по сохранению состояния формы. В частности по WindowState. Если окно свернуть и потом закрыть приложение, то после запуска приложения его нет на панели задач.

Попробуйте так

Код: ...
if fmFtpUpdater.WindowState = wsMaximized then
AStoreComponent.Properties.Add('WindowState')
else
begin
AStoreComponent.Properties.Add('top');
AStoreComponent.Properties.Add('left');
AStoreComponent.Properties.Add('height');
AStoreComponent.Properties.Add('width');
end;
cxPropertiesStore1.StoreTo(false);
...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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