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

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

Автор: BlackVetal
Дата сообщения: 19.09.2013 05:22
X11

Цитата:
Так если создано прямо в потоке и для этого самого потока, то кто к нему ещё доступ имеет?

никто и не получит доступ - чтобы иметь доступ к элементам потока нужен спец метод через который и можно будет получать состояние или задавать состояние элемента.
Автор: makz
Дата сообщения: 19.09.2013 09:36
greyserg

Цитата:
Где тут неверность концепции?

с таблицами все в порядке, а вот девекс используете странным образом. Предлагаю сделать стандартный мастер-деталь, с двумя левелами и в детали на поле IS_RIGHT повесить checkbox. Если нужен только один ответ, то гасить лишние галки (это не сложнее, чем вручную набивать радиогруппы )
Автор: greyserg
Дата сообщения: 19.09.2013 09:49

Цитата:
greyserg

Цитата:
Где тут неверность концепции?

с таблицами все в порядке, а вот девекс используете странным образом. Предлагаю сделать стандартный мастер-деталь, с двумя левелами и в детали на поле IS_RIGHT повесить checkbox. Если нужен только один ответ, то гасить лишние галки (это не сложнее, чем вручную набивать радиогруппы )

мастер-деталь с двумя левелами разве будет выглядеть как вопрос-ответы(с 1 выбранным ответом) в 1 строку ? (заказчик хочет именно так)
Автор: makz
Дата сообщения: 19.09.2013 10:32
greyserg
Если только в этом проблема, то мастер-деталь вообще ни к чему; нужен справочник с вопросами и табличка с ответами. В гриде делаем вью только для второй таблички, на поле QUESTION_ID вешается лукапкомбо на НД справочника, и выставляется merge cells.
Автор: greyserg
Дата сообщения: 19.09.2013 10:39

Цитата:
greyserg
Если только в этом проблема, то мастер-деталь вообще ни к чему; нужен справочник с вопросами и табличка с ответами. В гриде делаем вью только для второй таблички, на поле QUESTION_ID вешается лукапкомбо на НД справочника, и выставляется merge cells.

Я понял, имеетcя ввиду CellMerging. Но не совсем красиво будет checkbox в отдельной колонке.
Автор: NatNiM
Дата сообщения: 19.09.2013 11:22
BlackVetal
A_V,
буду копать, спасибо.

А использую C# + DevExpress.
Вот содержание функции, которая вызывается в потоке и отображает данные. Грид создается вручную в конструкторе, если его создавать в этой же функции, то при попытке добавить на форму - та же ошибка.

PrintableComponentLink pcl = new PrintableComponentLink();
PrintingSystem ps = new PrintingSystem();
gridControlcTemt.DataSource = dt;
ps.Links.AddRange(new object[]{pcl});
((GridView)gcTemt.MainView).ClearDocument();
pcl.Component = gridControlcTemt;
pcl.Landscape = true;
pcl.CreateDocument(); //вот здесь ошибка
pcl.ShowPreviewDialog();

Вот, ругается на GridControl стало быть? Или же на компонент PrintableComponentLink.


Автор: BlackVetal
Дата сообщения: 19.09.2013 14:02
NatNiM
У тебя получается что ты обращаешься из потока (ну насколько я понял тебя функция создает поток и потом выполняет этот код в потоке) к компоненту из другого потока.
примерно так (это примитивная контрольная кому-то была)
[more]
public partial class Form_ControlWindow : Form
{
#region Поля

/// <summary>
/// Максимальное значение для генерации случайного останова процесса имитации конвеера
/// </summary>
private int maxValueSleep = 10000;

/// <summary>
/// Максимальное значение для генерации аварийного останова
/// </summary>
private int maxValueАвария = 100000;


/// <summary>
/// Предел - когда считается что ситуация аварийная и нужен останов
/// </summary>
private int PredelАвария = 95000;


/// <summary>
/// Статус конвеера №1
/// </summary>
private Conveer_Status Status1;

/// <summary>
/// Статус конвеера №2
/// </summary>
private Conveer_Status Status2;

/// <summary>
/// Статус конвеера №3
/// </summary>
private Conveer_Status Status3;

/// <summary>
/// Статус конвеера №4
/// </summary>
private Conveer_Status Status4;


#endregion




#region Конструктор

/// <summary>
/// Конструктор данного класса
/// </summary>
public Form_ControlWindow()
{
InitializeComponent();
}

#endregion


#region Методы


/// <summary>
/// Делегат - необходим для создания асинхронных и синхронных потоков
/// имитации работы конвеера
/// </summary>
/// <param name="_status"> Статус конвеера</param>
/// <param name="_TextBox">Контрол - куда нужно выводить статус</param>
delegate void StartConveerDelegate(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl);

/// <summary>
/// Метод Запускает конвеер с переданными параметрами.
/// В переменной _status - передается ссылка на переменную содержащую статус конвеера
/// а в переменной _TextBox - передается контрол - в котором должна выводиться информация
/// о состоянии конвеера и смене стадий обработки
/// </summary>
/// <param name="_status"> Статус конвеера</param>
/// <param name="_TextBox">Контрол - куда нужно выводить статус</param>
private void StartConveer(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl)
{
// создаем объект генератора случайных чисел
Random rnd = new Random();

// цикл имитации конвеера - бесконечный
while (true)
{
// получаем текущий статус конвеера
int Step = (int)Status;
//если статус - последний цикл обработки асбеста, то переходим к первому шагу
if (Step == (int)Conveer_Status.Упаковка_Хризотила)
Step = (int)Conveer_Status.Загрузка_Руды;
else // иначе просто переходим к следующему шагу
Step++;
// присваиваем новый статус конвеера
Status = (Conveer_Status)Step;

// вычисляем аварийную ситуацию
// для этого генерируем число - которое означает вероятность аварии
// затем сравниваем с пределом - который означает допустимое значение
// аварийности
int авария = rnd.Next(maxValueАвария);
if (авария > PredelАвария)
{
// выводим статус что произошла авария
ShowStatus(Conveer_Status.Останов_Авария, _TextBox, _userControl);
// приостанавливаем поток
Thread.Sleep(rnd.Next(maxValueSleep*3));
}
// выводим статус что произошла авария
ShowStatus(Status, _TextBox, _userControl);
// приостанавливаем поток
Thread.Sleep(rnd.Next(maxValueSleep));
}
}

/// <summary>
/// Делегат - необходим для создания синхронных и асинхронных потоков вывода
/// статуса конвеера.
/// ПО сути дела - это объявление шаблона.
/// </summary>
/// <param name="_status"> Статус конвеера который нужно вывести</param>
/// <param name="_TextBox">Контрол - куда нужно вывести статус</param>
delegate void ShowStatusDelegate(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl);


/// <summary>
/// Метод выводит текущий статус конвеера в соответствующее ему окошко.
/// Весь вывод осуществляется асинхронно - если все идет стандартно. Это
/// необходимо для того чтобы не тормозить остальные процессы.
/// </summary>
/// <param name="_status"> Статус конвеера который нужно вывести</param>
/// <param name="_TextBox">Контрол - куда нужно вывести статус</param>
private void ShowStatus(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl)
{
// проверяем - соответствует ли даный контрол текущему потоку
if (_TextBox.InvokeRequired == false)
{
// выводим строку статуса
_TextBox.Text += "" + DateTime.Now.ToString() + " -> " + _status + Environment.NewLine;
_userControl.SetStep(_status);
}
else // создаем вывод статуса в синхронном потоке
{
ShowStatusDelegate _showStatus = new ShowStatusDelegate(ShowStatus);
this.BeginInvoke(_showStatus, new object[] { _status, _TextBox, _userControl });
}
}


#endregion


#region События


/// <summary>
/// Метод Запускает конвеер №1. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer1</param>
/// <param name="e">Аргументы события</param>
private void button_StartConveer1_Click(object sender, EventArgs e)
{
Status1 = Conveer_Status.Останов;
textBox_conveer1.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status1, textBox_conveer1, xtraUserControl1, null, null);
}

/// <summary>
/// Метод Запускает конвеер №2. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer2</param>
/// <param name="e">Аргументы события</param>
private void button__StartConveer2_Click(object sender, EventArgs e)
{
Status2 = Conveer_Status.Останов;
richTextBox_Conveer2.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status2, richTextBox_Conveer2, xtraUserControl2, null, null);
}

/// <summary>
/// Метод Запускает конвеер №3. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer3</param>
/// <param name="e">Аргументы события</param>
private void button__StartConveer3_Click(object sender, EventArgs e)
{
Status3 = Conveer_Status.Останов;
richTextBox_Conveer3.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status3, richTextBox_Conveer3, xtraUserControl3, null, null);
}

/// <summary>
/// Метод Запускает конвеер №4. Сначала запускается инициализация конвера,
/// его тестирование. Затем уже не посредственно работа.
/// </summary>
/// <param name="sender">Источник события - кнопка button_StartConveer4</param>
/// <param name="e">Аргументы события</param>
private void button_StartConveer4_Click(object sender, EventArgs e)
{
Status4 = Conveer_Status.Останов;
richTextBox_Conveer4.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine;
StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer);
_startConveer.BeginInvoke(Status4, richTextBox_Conveer4, xtraUserControl4, null, null);
}

#endregion





}

/// <summary>
/// Статусы конвеера - стадии обработки и возможные остановы.
/// </summary>
public enum Conveer_Status
{
Останов = 0,
Загрузка_Руды = 1,
Дробление_Руды = 2,
Отсев_Волокна = 3,
Распущевание_Волокна = 4,
Прессовка_Волокна = 5,
Упаковка_Хризотила = 6,
Останов_Авария = 10
}

[/more]
Автор: A_V
Дата сообщения: 19.09.2013 16:26
NatNiM
А, думал речь о дельфи. для WinForms это вроде Invoke, уже упомянутый
Автор: makz
Дата сообщения: 20.09.2013 03:44
greyserg
При желании можно стереть перегородку в oncustomdrawcell.
Автор: X11
Дата сообщения: 23.09.2013 13:15
Небольшая проблема с TcxCheckBox.
А точнее с событием OnEditing.
Щёлкаем по переключателю и событие срабатывает.
Щёлкаем теперь сколько угодно раз и событие OnEditing не срабатывает.
Можно переключиться на др. элемент, а затем опять на этот cxCheckBox и событие опять срабатывает.
Есть какой способ заставить срабатывать это событие по каждому щелчку?
Нужно именно это событие.
Автор: A_V
Дата сообщения: 23.09.2013 15:12
X11
OnClick
Автор: X11
Дата сообщения: 23.09.2013 15:44
Не совсем подходит. Тут идёт дискуссия http://www.sql.ru/forum/1048976-1/cxcheckbox-onediting-srabatyvaet-tolko-1-raz
Автор: A_V
Дата сообщения: 23.09.2013 17:28
X11
.

Добавлено:
выставляй EditModified в false на OnClick
Автор: Dmitry
Дата сообщения: 23.09.2013 17:54
X11

OnEditValueChanged не подойдет?
Автор: X11
Дата сообщения: 23.09.2013 20:11

Цитата:
OnEditValueChanged не подойдет?

Если программно менять значение, то срабатывает событие, поэтому нет.

Добавлено:
Есть cxDBPivotGrid. Не соображу, как пройтись циклом по итогам.
Вот здесь: http://f4.s.qip.ru/adNBVmMb.png

Добавлено:
Ещё вопрос по связке cxDBPivotGrid + cxPivotGridDrillDownDataSet.
Требуется циклом программно пройтись по итогам cxDBPivotGrid, при этом внутри цикла требуется пробегаться по записям привязанного cxPivotGridDrillDownDataSet`а и обрабатывать их данные.

Т.е. в цикле нужно выделять записи cxDBPivotGrid`а, чтобы cxPivotGridDrillDownDataSet генерировал набор своих записей?
или есть более простые способы?

С чего начать?

Сейчас пока пытаюсь врубиться в правку, основные понятия и т.д. С cxDBPivotGrid + cxPivotGridDrillDownDataSet не работал до этого момента.
Автор: X11
Дата сообщения: 23.09.2013 22:34
Начало есть


Код:

var
I: Integer;
s: string;
begin
cxDBPivotGrid1.BeginUpdate;
try
for I := 0 to Pred(cxDBPivotGrid1.ViewData.RowCount) do
begin
if s = '' then
s := cxDBPivotGrid1.ViewData.CellsAsText[i, 0]
else
s := s + sLineBreak + cxDBPivotGrid1.ViewData.CellsAsText[i, 0];
end;
ShowMessage(s);
finally
cxDBPivotGrid1.EndUpdate;
end;
end;

Автор: BlackVetal
Дата сообщения: 24.09.2013 05:36
X11
Извини, а в Делфи есть LINQ или это чисто .NET фича ? я бы использовал именно этот инструмент в твоем случае ...
Автор: Raphael92
Дата сообщения: 24.09.2013 08:38
Как установить значение в cxComboBox, например как в стандартном comboBox1.SelectedIndex=0 ?
Автор: X11
Дата сообщения: 24.09.2013 09:41

Цитата:
а в Делфи есть LINQ

нету

Добавлено:

Цитата:
Как установить значение в cxComboBox, например как в стандартном comboBox1.SelectedIndex=0 ?

cxComboBox.ItemIndex := 100;

Добавлено:
и в стандартном так же
.ItemIndex := 100;
Автор: A_V
Дата сообщения: 24.09.2013 22:34
X11

Цитата:
1. Переходим на строку в cxDBPivotGrid
2. Обрабатываем все записи из cxPivotGridDrillDownDataSet

если через сам грид, можно сэмулировать самому движение через
1. (DBPivotGrid as IcxNavigator).DoAction(NBDI_NEXT);
2. обычный проход по DrillDownDataSet, если у него выставлен SynchronizeData
хотя это и коряво конечно..

с EditModified-то помогло?
Автор: X11
Дата сообщения: 24.09.2013 23:06
вот что получилось с циклами
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1049089&msg=14880179
работает
в процессе тестирования


Цитата:
с EditModified-то помогло?

не пробовал, т.к. подсказали др. решения
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1048976&msg=14877301
и
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1048976&msg=14877264
Автор: A_V
Дата сообщения: 24.09.2013 23:12
X11
ага, зачем писать одну строчку, когда можно десять )
ну хозяин-барин, дело твое
Автор: Raphael92
Дата сообщения: 25.09.2013 06:27
В cxGrid я поставил свойства одной колонке ComboBox. Как установить в нее значение типа как cxComboBox.ItemIndex := 100 ?
Автор: jvthegost
Дата сообщения: 25.09.2013 08:05
Добрый день. Подскажите, у меня вопрос по установке DevExpress из исходников. Основная проблема с PageControl. Суть проблемы.
Если ставить DevExpress с EXE файла, то там есть выбор "Use Native look and feel style as default", там я ее не ставлю, и в PageControl закладки меняют нормально цвета и подсвечиваются.
Если собрать DevExpress из исходников, то PageControll на отрез не хочет менять цвета закладок.
Подскажите, как правильно установить его из исходников, что бы он не использовал дефолтовые стили, а те которые у него. Просто я хочу установить DevExpress 12.2.6 на ХЕ4, а на новую что в копилке, не хватает баллов.
Автор: AlexCoRu
Дата сообщения: 25.09.2013 09:15
jvthegost, LookAndFeel.NativeStyle и Properties.HotTrack либо определить USENATIVELOOKANDFEELASDEFAULT.
Автор: A_V
Дата сообщения: 25.09.2013 09:23
Raphael92
GridView.DataController.Values[<row>,<col>]:=
(<column>.Properties as TcxComboBoxProperties).Items[100];
Автор: X11
Дата сообщения: 25.09.2013 09:26

Цитата:
ага, зачем писать одну строчку, когда можно десять )

ну так а где-ж ты был раньше?
Автор: mcdie
Дата сообщения: 03.10.2013 08:25
Можно ли в TdxBarButton разместить текст Caption'а в две строчки?
Автор: xpert999
Дата сообщения: 06.10.2013 00:59

Цитата:
Можно ли в TdxBarButton разместить текст Caption'а в две строчки?

Нельзя: свойства multiline у него нету, переносы строки в Caption удаляются.
Автор: Raphael92
Дата сообщения: 07.10.2013 08:34

Цитата:
В cxGrid я поставил свойства одной колонке ComboBox.

Для первой строки выполняю следующие команды:
(cxGridDBTableView1Column1.Properties as TcxComboBoxProperties).Items.Clear;
(cxGridDBTableView1Column1.Properties as TcxComboBoxProperties).Items.Add(
Query.FieldByName('home').AsString);

Когда делаю то же самое для второй строки, то у первой в комбобоксе те же значения, что и у второй. Как сделать, чтоб для каждой строки был свой combobox ?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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