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

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

Автор: linker_2009
Дата сообщения: 30.06.2010 15:55
[b]JohnSilver182[/b]
новый это какой? для класического меню иконки 16*16, для больших кнопок на рибоне 32*32
Автор: vladmal
Дата сообщения: 30.06.2010 21:31
BlackVetal >
Цитата:
Я сделал ручную привязку события изменения текущей строки через BindingContext.


Расскажите, пожалуйста, чуть подробнее.


Добавлено:
BindingContext - это к не к .Net версии относится?

У меня - VCL, если что...
Автор: BlackVetal
Дата сообщения: 01.07.2010 05:48
vladmal
Ну собсна да - BindingContext относиться к .Net. Я пишу на .Net и VCL не пользуюс ...
Здесь примерный код (пока разрабатывается форма) -
[more=читать здесь]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.Data.Filtering;
using DevExpress.Xpo;
using XPO_OMLib;
using XPO_OMLib.XPO;
using XPO_Sbit2010;
using SbitLib;


namespace SbitMain
{
/// <summary>
/// Класс описывает форму резервирования вагонов под суточные задания отгрузки
/// </summary>
public partial class XtraFormСуточноеЗаданиеВагоны : XtraFormOMBase
{
#region Поля

private CurrencyManager _CurrencyManager_СуточноеЗадание;
private CurrencyManager _CurrencyManager_Вагоны;

private СуточноеЗадание_СуточноеЗадание _Current_СуточноеЗадание;
private ТранспортДвижение_ЖурналВагонов _Current_Вагон;


private ТранспортДвижение_ЖурналВагонов _вагон_Поиск = null;

#endregion


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

/// <summary>
/// Конструктор
/// </summary>
public XtraFormСуточноеЗаданиеВагоны()
{
InitializeComponent();

}

#endregion


#region Методы

/// <summary>
/// Метод делает выборку прибытия вагонов за период, переданный в параметрах
/// </summary>
/// <param name="начало"></param>
/// <param name="конец"></param>
private void Get_ПрибытиеВагонов(DateTime начало, DateTime конец)
{
xpCollection_ПрибытиеВагонов.Criteria = new BetweenOperator("ДатаВремяПрибытия", начало.Date, конец.Date.AddDays(1).AddSeconds(-1));
}


/// <summary>
/// Метод инициализирует некоторые компоненты формы.
/// В частности происходит привязка к менеджерам текущих позиций и обработка
/// изменения текущей позиции при первоначальной загрузке.
/// </summary>
private void Init()
{
_CurrencyManager_СуточноеЗадание = this.BindingContext[xpCollection_СуточноеЗадание] as CurrencyManager;
_CurrencyManager_СуточноеЗадание.CurrentChanged += new EventHandler(CurrencyManager_СуточноеЗадание_CurrentChanged);

_CurrencyManager_Вагоны = this.BindingContext[xpCollection_ПрибытиеВагонов] as CurrencyManager;
_CurrencyManager_Вагоны.CurrentChanged += new EventHandler(CurrencyManager_Вагоны_CurrentChanged);


if (_CurrencyManager_СуточноеЗадание.Position >= 0)
{
_Current_СуточноеЗадание = _CurrencyManager_СуточноеЗадание.Current as СуточноеЗадание_СуточноеЗадание;
IXPO_OMObject iXPO_OMObject = _Current_СуточноеЗадание as IXPO_OMObject;
iXPO_OMObject.Changed += Current_СуточноеЗадание_Changed;
}


if (_CurrencyManager_Вагоны.Position >= 0)
{
_Current_Вагон = _CurrencyManager_Вагоны.Current as ТранспортДвижение_ЖурналВагонов;
IXPO_OMObject iXPO_OMObject = _Current_Вагон as IXPO_OMObject;
iXPO_OMObject.Changed += Current_Вагоны_Changed;
}
}


#endregion


#region События

/// <summary>
/// Метод при загрузке форме инициализирует некоторые элементы формы
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void XtraFormСуточноеЗаданиеВагоны_Load(object sender, EventArgs e)
{
Init();
// Присваиваем по умолчанию сегодняшнею дату для выбора суточного задания
dateEdit_СуточноеЗадание.EditValue = DateTime.Today;
// Присваиваем период выбора прибытия вагона за неделю
dateEdit_НачалоПрибытия.EditValue = DateTime.Today.AddDays(-7);
dateEdit_КонецПрибытия.EditValue = DateTime.Today;
}

/// <summary>
/// При изменении даты данного элемента выбираем Суточные задания на новую дату
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dateEdit_СуточноеЗадание_EditValueChanged(object sender, EventArgs e)
{
// устанавливаем период выбора суточных заданий выбранный день
DateTime begin = (DateTime)dateEdit_СуточноеЗадание.EditValue;
DateTime end = (DateTime)dateEdit_СуточноеЗадание.EditValue;
// устанавливаем критерий выбора для суточных заданий
xpCollection_СуточноеЗадание.LoadingEnabled = true;
xpCollection_СуточноеЗадание.Criteria = new BetweenOperator("Дата", begin.Date, end.Date.AddDays(1).AddMinutes(-1));
}

/// <summary>
/// При изменении даты начала периода выбора прибытия вагонов выбираем данные с новыми параметрами.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dateEdit_НачалоПрибытия_EditValueChanged(object sender, EventArgs e)
{
DateTime начало = (DateTime)dateEdit_НачалоПрибытия.EditValue;
DateTime конец = DateTime.Today;

if(dateEdit_КонецПрибытия.EditValue!=null)
конец = (DateTime)dateEdit_КонецПрибытия.EditValue;

if (начало > конец)
конец = начало;

Get_ПрибытиеВагонов(начало, конец);
}

/// <summary>
/// При изменении даты конца периода выбора прибытия вагонов выбираем данные с новыми параметрами.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dateEdit_КонецПрибытия_EditValueChanged(object sender, EventArgs e)
{
DateTime начало = DateTime.Today;

if (dateEdit_НачалоПрибытия.EditValue != null)
начало = (DateTime)dateEdit_НачалоПрибытия.EditValue;

DateTime конец = (DateTime)dateEdit_КонецПрибытия.EditValue;

if (начало > конец)
начало = конец;

xpCollection_ПрибытиеВагонов.LoadingEnabled = true;

Get_ПрибытиеВагонов(начало, конец);
}

/// <summary>
/// При нажатии кнопки данный метод ставит вагон в резерв
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void itemButtonEdit_КнопкаРезервирования_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
{
DevExpress.XtraGrid.Views.Grid.GridView _view_Задание = gridControl_СуточноеЗадание.MainView as DevExpress.XtraGrid.Views.Grid.GridView;
DevExpress.XtraGrid.Views.Grid.GridView _view_Вагон = gridControl_Вагоны.MainView as DevExpress.XtraGrid.Views.Grid.GridView;
ТранспортДвижение_ЖурналВагонов прибытиеВагона = (ТранспортДвижение_ЖурналВагонов)_view_Вагон.GetFocusedRow();
СуточноеЗадание_СуточноеЗадание задание = null;
ТранспортДвижение_СуточноеЗадание_ПрибытиеВагонов резерв = null;

if (прибытиеВагона.ДатаУбытия != DateTime.MinValue)
{
MessageBox.Show("Данный вагон уже убыл со станции!", "Внимание!!!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Plus)
{
задание = (СуточноеЗадание_СуточноеЗадание)_view_Задание.GetFocusedRow();
резерв = xpCollection_ПрибытиеВагонов.Session.FindObject<ТранспортДвижение_СуточноеЗадание_ПрибытиеВагонов>(
new GroupOperator(GroupOperatorType.And, new CriteriaOperator[] {new BinaryOperator("Oid_СуточноеЗадание", задание.Oid),
new BinaryOperator("Oid_Вагона", прибытиеВагона.Oid)}));

if (резерв == null)
{
резерв = new ТранспортДвижение_СуточноеЗадание_ПрибытиеВагонов(прибытиеВагона.Session);
резерв.Oid_Вагона = прибытиеВагона;
резерв.Oid_СуточноеЗадание = задание;
резерв.ДатаВремяСоздания = DateTime.Now;
резерв.Save();
прибытиеВагона.Резерв.Add(резерв);
прибытиеВагона.ДатаРезерва = задание.Дата;
прибытиеВагона.Save();
задание.Резерв.Add(резерв);
задание.Save();
}
}
else if(e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Minus)
{
резерв = xpCollection_ПрибытиеВагонов.Session.FindObject<ТранспортДвижение_СуточноеЗадание_ПрибытиеВагонов>(
new BinaryOperator("Oid_Вагона", прибытиеВагона.Oid));
if (резерв != null)
{
задание = резерв.Oid_СуточноеЗадание;
прибытиеВагона.Резерв.Remove(резерв);
прибытиеВагона.ДатаРезерва = DateTime.MinValue;
прибытиеВагона.Save();
задание.Резерв.Remove(резерв);
задание.Save();
}
}
}

/// <summary>
/// Выделяем желтым строки вагонов поставленные в резерв тукщему суточному заданию.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void view_Вагоны_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
{
DevExpress.XtraGrid.Views.Grid.GridView _view_Задание = gridControl_СуточноеЗадание.MainView as DevExpress.XtraGrid.Views.Grid.GridView;
DevExpress.XtraGrid.Views.Grid.GridView _view_вагоны = gridControl_Вагоны.MainView as DevExpress.XtraGrid.Views.Grid.GridView;
СуточноеЗадание_СуточноеЗадание задание = (СуточноеЗадание_СуточноеЗадание)_view_Задание.GetFocusedRow();
ТранспортДвижение_ЖурналВагонов вагон = (ТранспортДвижение_ЖурналВагонов)_view_вагоны.GetRow(e.RowHandle);
if (_вагон_Поиск != null)
{
try
{
if (вагон == _вагон_Поиск)
{
_view_вагоны.Appearance.OddRow.BackColor = Color.Red;
_view_вагоны.Appearance.EvenRow.BackColor = Color.Red;
}
else
{
_view_вагоны.Appearance.OddRow.BackColor = Color.AliceBlue;
_view_вагоны.Appearance.EvenRow.BackColor = Color.MintCream;
}
}
catch
{
_view_вагоны.Appearance.OddRow.BackColor = Color.AliceBlue;
_view_вагоны.Appearance.EvenRow.BackColor = Color.MintCream;
}
}
else
{
try
{
if (задание.Резерв.BaseIndexOf(вагон.Резерв[0]) >= 0)
{
_view_вагоны.Appearance.OddRow.BackColor = Color.Yellow;
_view_вагоны.Appearance.EvenRow.BackColor = Color.Yellow;
}
else
{
_view_вагоны.Appearance.OddRow.BackColor = Color.AliceBlue;
_view_вагоны.Appearance.EvenRow.BackColor = Color.MintCream;
}
}
catch
{
_view_вагоны.Appearance.OddRow.BackColor = Color.AliceBlue;
_view_вагоны.Appearance.EvenRow.BackColor = Color.MintCream;
}
}

}


#region CurrencyManager


/// <summary>
/// Обработчик события изменения текущей позиции суточного задания отгрузки - привязываем и отвязываем
/// обработку события изменения строки при изменения позиции
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CurrencyManager_СуточноеЗадание_CurrentChanged(object sender, EventArgs e)
{
if (_Current_СуточноеЗадание != null)
{
IXPO_OMObject iXPO_OMObject = _Current_СуточноеЗадание as IXPO_OMObject;
iXPO_OMObject.Changed -= Current_СуточноеЗадание_Changed;
_Current_СуточноеЗадание = null;
}

if (_CurrencyManager_СуточноеЗадание.Position >= 0)
{
_Current_СуточноеЗадание = _CurrencyManager_СуточноеЗадание.Current as СуточноеЗадание_СуточноеЗадание;
IXPO_OMObject iXPO_OMObject = _Current_СуточноеЗадание as IXPO_OMObject;
iXPO_OMObject.Changed += Current_СуточноеЗадание_Changed;
}
gridControl_Вагоны.RefreshDataSource();
}

/// <summary>
/// Обработчик события изменения текущей позиции вагона - привязываем и отвязываем
/// обработку события изменения строки при изменения позиции
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CurrencyManager_Вагоны_CurrentChanged(object sender, EventArgs e)
{
if (_Current_Вагон != null)
{
IXPO_OMObject iXPO_OMObject = _Current_Вагон as IXPO_OMObject;
iXPO_OMObject.Changed -= Current_Вагоны_Changed;
_Current_Вагон = null;
}

if (_CurrencyManager_Вагоны.Position >= 0)
{
_Current_Вагон = _CurrencyManager_Вагоны.Current as ТранспортДвижение_ЖурналВагонов;
IXPO_OMObject iXPO_OMObject = _Current_Вагон as IXPO_OMObject;
iXPO_OMObject.Changed += Current_Вагоны_Changed;
}
}

/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Current_СуточноеЗадание_Changed(object sender, ObjectChangeEventArgs e)
{
gridControl_Вагоны.Refresh();
}

/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Current_Вагоны_Changed(object sender, ObjectChangeEventArgs e)
{
////Отгрузка_ЖДНакладнаяПродукция d;
//if (layoutControlGroup_Уборка.Visible)
//{
// switch (e.PropertyName)
// {
// case @"ПлатаЗаПростойДок":
// //advBandedGridView_Уборка.SetFocusedRowCellValue(colПлатаЗаПростойДок,
// // (decimal)advBandedGridView_Уборка.GetFocusedRowCellValue(colПлатаЗаПростойДок) - (decimal)e.OldValue + (decimal)e.NewValue);
// advBandedGridView_Уборка.RefreshData();
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colПлатаЗаПростойДок);

// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colСтоимость1);
// break;
// case @"ПлатаЗаПростойФакт":
// advBandedGridView_Уборка.RefreshData();
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colПлатаЗаПростойФакт);
// break;
// case @"Штраф":
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colШтраф2);
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colСтоимость1);
// break;
// case @"ПлатаЗаХранение":
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colПлатаЗаХранение2);
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colСтоимость1);
// break;
// case @"ТипДокумента":
// advBandedGridView_Уборка.RefreshRowCell(advBandedGridView_Уборка.FocusedRowHandle, colПростойДок);
// break;
// }
//}
}

#endregion


/// <summary>
/// Метод осуществляет поиск вагона по введеному номеру в textedit
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_SeachVagon_Click(object sender, EventArgs e)
{
SortingCollection _sortingCollection = new SortingCollection();

_sortingCollection.Add(new SortProperty("ДатаВремяПрибытия", DevExpress.Xpo.DB.SortingDirection.Descending));
xpCollection_ПоискВагона.Sorting = _sortingCollection;
_вагон_Поиск = xpCollection_ПоискВагона.Session.FindObject<ТранспортДвижение_ЖурналВагонов>
(new BinaryOperator("НомерВагона", textEdit_SeachVagon.Text.Trim()));

if (_вагон_Поиск != null)
{
//if (_вагон_Поиск.ДатаВремяПрибытия < (DateTime)dateEdit_НачалоПрибытия.EditValue)
dateEdit_НачалоПрибытия.EditValue = _вагон_Поиск.ДатаВремяПрибытия.Date;
//if (_вагон_Поиск.ДатаВремяПрибытия > (DateTime)dateEdit_КонецПрибытия.EditValue)
dateEdit_КонецПрибытия.EditValue = _вагон_Поиск.ДатаВремяПрибытия.Date;
}
else
{
MessageBox.Show("Поиск не дал результатов. Попробуйте с новыми данными.", "Предупреждение!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
gridControl_Вагоны.MainView.RefreshData();
}


/// <summary>
/// Метод очищает строку поиска вагона и внутреннюю переменную _вагон_Поиск
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_Clear_SeachVagon_Click(object sender, EventArgs e)
{
textEdit_SeachVagon.Text = "";
_вагон_Поиск = null;
gridControl_Вагоны.MainView.RefreshData();
}

#endregion


}
}
[/more]
Автор: vladmal
Дата сообщения: 01.07.2010 09:55
1. BlackVetal, спасибо.

2. Хм. А нет ли возможности читать данный форум не "в линию"?

Через NNTP, к примеру, по темам в виде дерева. А то так тоскливо читать 4-ю ветку про DevExpress...
Автор: JohnSilver182
Дата сообщения: 01.07.2010 13:31

Цитата:
новый это какой? для класического меню иконки 16*16, для больших кнопок на рибоне 32*32


А ! Это я в настройках указал LARGE ICON
Автор: jonikDk
Дата сообщения: 04.07.2010 21:46
Мне надо проверить значение в компоненте равно оно пустой строке или нет.
Я использую компоненты TcxMaskEdit. Например, EditMask = "0000.00.00;1; "
Когда в компоненте нет значения, то при обращении к св-ву Text возвращается " . . " а хотелось бы получить пустую строку "".
Есть метод GetEmptyString который возвращает, то что мне хотелось " . . " но этот медод protected.
Может кто знает как решить задачу
Автор: Abdulatipoff
Дата сообщения: 04.07.2010 23:44
Приветствуют всех!
Прошу помочь решить мою ситуацию! Неделю бьюсь над установкой DevExpress x50 под RAD STUDIO 2010, компоненты устанавливаются, но как-то криво... Кроме "UserSkin" в окне Project Skin Options Editor больше нет ничего, хотя все скины лежат на месте...
Устанавливаю автоинсталлируемый пакет с торрента (rutracker.org/forum/viewtopic.php?t=2742350). Все пути прописал, все встает без ошибок. Сначала у меня был установлен только CBuilder 2010, переустановил полную студию, теперь и стоят дельфи и билдер, компоненты ставятся, и проекты компилируются, и скин по умолчанию применяется (даже к основной форме), но список скинов никак не пополняется - только пресловутый "юзерскин".
Что делать?
Автор: BlackVetal
Дата сообщения: 05.07.2010 05:11
jonikDk
Напиши свой метод получения значения - в которром проверяй на пустое значение и возвращай EmptyString.
Автор: Ijin
Дата сообщения: 05.07.2010 07:00
Пытаюсь просуммировать данные второго уровня и запихнуть сумму в первый.
Каждый уровень имеет свой DataSet (cxMemData).

Сейчас это реализовал это через событие AfterPost DataSet'а второго уровня.

Код:
Id1:=DataSet.FieldByName('CORNT_ID').AsInteger;
pmt:=0;
MD_CONTRAGENTS_SERV.DisableControls;
MD_CONTRAGENTS.DisableControls;
MD_CONTRAGENTS_SERV.First;

while not MD_CONTRAGENTS_SERV.Eof do begin
If MD_CONTRAGENTS_SERV.FieldByName('CORNT_ID').AsInteger=Id1 then
pmt:=pmt+MD_CONTRAGENTS_SERV.FieldByName('SRV_SUM').AsFloat;
MD_CONTRAGENTS_SERV.Next;
end;

MD_CONTRAGENTS.Edit;
MD_CONTRAGENTS.FieldByName('CONTR_SUM').AsFloat:=pmt;
MD_CONTRAGENTS.Post;

MD_CONTRAGENTS_SERV.EnableControls;
MD_CONTRAGENTS.EnableControls;
Автор: marser
Дата сообщения: 05.07.2010 07:44
Ijin

Цитата:
как добраться до данных 2-го уровня

cxGrid2DBBandedTableView1.DataController.GetDetailDataController
Автор: jonikDk
Дата сообщения: 05.07.2010 08:47
BlackVetal

Цитата:
Напиши свой метод получения значения - в которром проверяй на пустое значение и возвращай EmptyString.

Так в том и дело, что пустое значение зависит от маски. Если маска "0000.00.00;1; " то пустое значение " . . ". Если маска "0000-00-00T00:00:00;1; " то пустое значение другое = " - - T : : ".
Я пока решил задачу через class helper, может кто знает "чистое" решение. У девэкспресса в KB есть топик где просят их добавить свойство unformattedText. Но пока оно не добавлено
Автор: X11
Дата сообщения: 05.07.2010 10:52
Можно ли что-то подобное (сворачивать/разворачивать) с пом. DevExpress?
Автор: BlackVetal
Дата сообщения: 05.07.2010 12:36
jonikDk
Я так понимаю, что тебе нужно редактировать дату и время?Если не ошибаюс - есть же отдельный компонент для времени и даты. Обычно я им и пользуюс - ставлю маску такую "dd.MM.yyyy HH:mm".
Если все же ты будеш пользоваться TextEdit с маской - то с заданной маской пустую (EmptyString) не получиш. Помоему единственный вариант перегрузить (или добавить) метод который возвращал тебе бы EmptyString.

X11
Помоему тебе нужно использовать Layout. У компонента layout, когда переобразовываеш его в tabbedControlGroup можно вывести ExpandButton.
Еще, я не совсем уверен - но можно покавырять WPF, возможно в этой технологии получиш такие компоненты или что похожее.
Автор: jonikDk
Дата сообщения: 05.07.2010 13:29
BlackVetal

Цитата:
Я так понимаю, что тебе нужно редактировать дату и время?

не только дату и время, у меня разные маски. Это просто пример.

Цитата:
Помоему единственный вариант перегрузить (или добавить) метод который возвращал тебе бы EmptyString

Ну я сказал, что задачу решил с помощью Class Helper, но хотелось бы "правильного решения". Будем ждать когда разработчики добавят очень нужное свойство.
Автор: X11
Дата сообщения: 05.07.2010 14:09
BlackVetal, не могу понять как работать с TdxLayoutControl. Но потихоньку начинаю понимать %)

Добавлено:
Домучал....
Автор: X11
Дата сообщения: 06.07.2010 09:07
Вроде получается неплохо, но при сворачивании всех трёх элементов, получается на мой взгляд не очень красиво


есть методы исправить, чтобы сворачивалось всё вверх?
Автор: Chukotka
Дата сообщения: 06.07.2010 12:09
Для R: TcxDBEditorRow определяю:

Код: (R.Properties.EditProperties as TcxPopupEditProperties).OnCloseUp := WinPropCloseUp;
(R.Properties.EditProperties as TcxPopupEditProperties).OnInitPopup := WinPropInitPopup;
(R.Properties.EditProperties as TcxPopupEditProperties).OnPopup := WinPropPopup;
Автор: jonikDk
Дата сообщения: 06.07.2010 14:11

Цитата:
возможно ли срабатывание WinPropCloseUp

ну да, если ты сам вызовешь его где то в коде, а вот OnCloseUp по идее не должен срабатывать
Автор: linker_2009
Дата сообщения: 06.07.2010 14:27
[b]jonikDk[/b]
[q]а вот OnCloseUp по идее не должен срабатывать[/q]
это почему? или ошиблись?
Автор: jonikDk
Дата сообщения: 06.07.2010 16:13

Цитата:
это почему? или ошиблись?

ну если не отработал OnInitPopup и OnPopup, то OnCloseUp не должен отработать. Потому что OnCloseUp срабатывает при закрытии Popup окна. А раз OnInitPopup и OnPopup не отработали то окна не было и соответственно ничего не закрывалась. Я думаю, что так.
Автор: Chukotka
Дата сообщения: 06.07.2010 16:55
jonikDk

Цитата:
ну если не отработал OnInitPopup и OnPopup, то OnCloseUp не должен отработать.

И я так думал. Но у меня программа вылетает по AV. И в стеке вызовов, отображаемых madExcept, последним стоит OnCloseUp (WinPropCloseUp), но перед этим нет вызовов OnPopup. Вот мне и интересно - каким образом возможно срабатывание на закрытие окна без активизации события на открытие.
AV выскочил у клиента, у меня при тестировании все работает правильно, и все события срабатывают как надо.
WinPropCloseUp присваивается свойству OnCloseUp (как показано выше) и активируется только оттуда - прямых вызовов в коде нет.
Автор: linker_2009
Дата сообщения: 06.07.2010 17:24
[b]jonikDk[/b]
сори, глупый вопрос, не дочитал сообщение
[b]Chukotka[/b]
может у него ошибки в памяти? поставь проверку в WinPropCloseUp
Автор: Chukotka
Дата сообщения: 06.07.2010 18:54
linker_2009

Цитата:
может у него ошибки в памяти? поставь проверку в WinPropCloseUp
Этим сейчас и занимаюсь - пишу тесты. Но просто интересно - почему нет вызова OnPopup? Это нормально с точки зрения логики работы девок?
Автор: Abdulatipoff
Дата сообщения: 06.07.2010 20:41

Цитата:
Прошу помочь решить мою ситуацию! Неделю бьюсь над установкой DevExpress x50 под RAD STUDIO 2010, компоненты устанавливаются, но как-то криво... Кроме "UserSkin" в окне Project Skin Options Editor больше нет ничего, хотя все скины лежат на месте...
Устанавливаю автоинсталлируемый пакет с торрента (rutracker.org/forum/viewtopic.php?t=2742350). Все пути прописал, все встает без ошибок. Сначала у меня был установлен только CBuilder 2010, переустановил полную студию, теперь и стоят дельфи и билдер, компоненты ставятся, и проекты компилируются, и скин по умолчанию применяется (даже к основной форме), но список скинов никак не пополняется - только пресловутый "юзерскин".


Сам разобрался с проблемой. Хочу поделиться решением с теми, кому еще может понадобиться. В просторах инета нашел совет, что скины надо скомпилировать перед использованием, и инсталлировать в IDE. Так оно и есть, но в процессе есть подводные камни, справиться с которыми достаточно просто.

В папке ..\ExpressSkins Library есть редактор скинов dxSkinEditor.exe
Запускаем, открываем из папки ..\ExpressSkins Library\Binary Skin Files нужный скин (.skinres), к примеру AllSkins.skinres, компилируем командой Build (меню Project).
Теперь в папке ..\ExpressSkins Library\Binary Skin Files лежат файлы, ПОЧТИ готовые к инсталлированию.
В папке находим проекты, отдельно для билдера (*C14) и дельфи (*D14). Так как я использую CBuilder 2010, то для дальнейшего действа мне нужен файл AllSkinsC14.cbproj. Когда я пытался загрузить и откомпилировать проект скина, то получил ошибку линковщика, что не найден файл DXCOREC14.BPI, и, заглянув внутрь файлов проекта, удивился глюку разработчиков.
Дело в том, что DevExpress x50 выпущен под RAD STUDIO 2010, т.е. и под дельфи и билдер. И вроде все верно, в папке Library находим единые компилированные пакеты типа *RS14.BPI для всех компонент. Отдельных файлов библиотек под билдер и дельфи не наблюдается. А вот SkinEditor сделал билд по старому образцу, в котором прописаны конкретные библиотеки под билдер или дельфи, не подозревая, что теперь это один файл. В этом то и проблема.
В итоге, я отредактировал полученные от СкинЕдитора файлы AllSkinsC14.hpp, .cpp, .cbproj, заменил в них все "C14.bpi" на "RS14.bpi", затем загрузил AllSkins.cbproj в билдере, в проджект менеджере щелкнул на проекте правой кнопкой и выбрал опцию Install. После сообщения, что типа все хорошо и файлик BPL для меня уже испекли, в меню Component я запустил Install Packages и добавил в систему пакет AllSkins.bpl из папки \Documents and Settings\All Users\Документы\RAD Studio\7.0\BPL.

Из всего этого стоит сделать вывод, что если вдруг не обнаруживаются какие-то файлы, то можно предположить, что причиной могут служить "призраки прошлого" - недописки разработчиков при адаптации предыдущих версий компонент для новой студии.
Автор: linker_2009
Дата сообщения: 06.07.2010 21:47
[b]Abdulatipoff[/b]
а еще можно не париться и грузит скины в RunTime
Автор: Abdulatipoff
Дата сообщения: 06.07.2010 23:05
linker_2009

Как это можно сделать? Может, расскажешь подробнее?
Автор: linker_2009
Дата сообщения: 07.07.2010 00:28
[b]Abdulatipoff[/b]
в dxSkinsDefaultPainters есть функция dxSkinsUserSkinLoadFromStream и dxSkinsUserSkinLoadFromFile
в шапке есть пример "DLL со скинами из библиотеки dxSkins, автор Ziltoid"
З.Ы. в 50 скины таким макаром не грузятся, откатился на 49
Автор: vladman
Дата сообщения: 07.07.2010 14:33
Cryogen2003

Цитата:
Возможно ли в шедулер и его диаграмме ганта сделать так, что бы можно было создать какое-то задание по какому-то клиенту для одного из сотрудников (делать это может только супервизор). Сам сотрудник мог бы отписать по этому заданию какой-то комментарий или комментарии (но при это не мог сделать ничего с самим заданием). Причем можно было раздавать задания нескольким сотрудникам по одному клиенту.
Вообщем, можно ли это сделать стандартным способом в шедулере или как это можно обыграть по другому?

Наконец-то нашел время разобраться с вашим вопросом. В общем, для решения вашей проблемы, если еще актуально ), вам необходимо создать свой SchedulerEventEditor. Как это делается очень хорошо описано в Этой статье.
Автор: Cryogen2003
Дата сообщения: 07.07.2010 14:45
vladman
Да, актуально. Ок, спасибо большое, почитаю.

По поводу вашей помощи с ПивотГридом - большое спасибо, очень помог ваш способ решения. С меня пЫво
Автор: X11
Дата сообщения: 07.07.2010 15:14
Вопрос по принтосистеме. Dev 50 (без сорцов), да этого была версия 48 с сорцами.
При закрытии приложения вот такое AV

Цитата:
Project raised exception class EReadError with message 'Error reading dxComponentPrinter1Link1.PrinterPage.FitToPagesByTall: 28'.

При чём в другом приложении тоже использую принтосистему. Но такой ошибки при закрытии нет.
Это случайно не связано с сохранением/восстановлением свойств компоненты?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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