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

» Использование DevExpress

Автор: inigo
Дата сообщения: 23.09.2005 10:50
Добрый день.
Пользовался раньше VirtualTreeView, сейчас нужно перейти на Developer Express.
Пробую разобраться с TcxTreeList. Создаю колонку CheckBox. Хочется, чтобы при "чеканье" менялось состояние дочерних и родительских узлов. В VirtualTreeView это делается автоматом. Как решается проблема в TcxTreeList?
Нужно следующее:
- Если все дочерние элементы помечены, родительский нод тоже должен быть помечен.
- Если все дочерние элементы не помечены, родительский нод тоже должен быть не помечен.
- Если помечены не все дочерние элементы, то родительский нод должен быть помечен "серым".

Можно ли это как-то настроить или только программным путем по обработке событий?

И еще вопрос. CheckBox обязательно должен быть в отдельной колонке или можно у текстовой колонки его установить?
Автор: webpython
Дата сообщения: 24.09.2005 15:31
Alex47
Большое спасибо за совет, но т.к. я не числюсь в клиентской базе DevExpress, то и fix (речь идет об ошибке в TcxDateEdit ) мне никто слать не собирается
Вот если бы кто подсказал, как можно скачать этот преславутый fix без лишних вопросов...
Автор: Alex47
Дата сообщения: 24.09.2005 18:38
webpython
1. Можно попробовать поковырять (cxCalendar.TcxCustomDateEditProperties.PrepareDisplayValue) , сравнив код с предыдущими версиями.
2. У меня эти ошибки в TcxDateEdit не возникают, - нет полей дат в базе в
формате string. Попробуйте поменять формат полей в базе на Date.
Автор: stalker780
Дата сообщения: 27.09.2005 14:34
Товарищи, помогите побороть багу... а может кучерявость моих рук )
Пользуюсь TcxDBExtLookupComboBox.
Если при добавлении в выпадающий комбо строки, запускать модальную форму в которой вбиваются данные, и при открытой форме потерять фокус приложения, комбо закрывается и я так понял теряет связь с датасетом, короче приложение начинает рушиться
Эта бага вот уже год морочит мне мозги но никак не могу с ней ничего сделать.
Автор: Alex47
Дата сообщения: 28.09.2005 07:37
stalker780
Сделай на основе проекта примерчик (желательно из демок DevExpress), чтобы можно было посмотреть предметно.
Автор: stalker780
Дата сообщения: 28.09.2005 16:13
Alex47

Цитата:
Сделай на основе проекта примерчик (желательно из демок DevExpress), чтобы можно было посмотреть предметно.

Мдась на тестовом примере воспроизвести не удалось. Ибо база не FB с обязательными идентификаторами
Я так понял проблема в том, что при потере фокуса, редактируемый грид переходит в состояние Browse или Inactive с постом
Лана, пока порою, бо проблема сейчас встала из-за этого серьезная. если что, накрапаю простенький примерчик с базой, пока времени на него нет.
Автор: Alex1978
Дата сообщения: 29.09.2005 05:41
Может кто-то все ж таки знает как запустить прогу с Экспресами под Windows 95 ?
Автор: Alex47
Дата сообщения: 29.09.2005 12:28
Alex1978

Delphi6 - это последняя версия, которая "официально" работает с win95 (с соответствующими патчами). Многие для win95 используют Delphi5.
Других вариантов не просматривается.
Автор: Alex1978
Дата сообщения: 29.09.2005 14:29
Alex47
Т.е. единственный вариант скомпилировать прогу под Д5 и потестить, никаких обнов от мелкософта для Win95 нет, дабы проги расчитаные на Win98 запускались под 95 нет?

Есть и Д5, а что за соответствующие патчи?
Автор: Alex47
Дата сообщения: 29.09.2005 15:03
Alex1978
1. Delphi6 со всем набором патчей:
D6_upd2_ent, D6_RTL2_ENT, D6_RTL3_ENT.
На Delphi5 не работал, состава патчей не знаю.
2. Microsoft win95 не поддерживает, поэтому обнов ждать не стоит.
Автор: VadimLou
Дата сообщения: 29.09.2005 16:58
Исправления для DevEx от 26 августа 2005 от траблов работы с датами (и немного другого):

"ExpressDataController"

cxVariants.pas

function VarIsSoftNull(const AValue: Variant): Boolean;
begin
{+}
// Result := VarIsNull(AValue) or
// ({(VarType(AValue) = varString)}VarIsStr(AValue) and (AValue = ''));
Result := VarIsEmpty(AValue) or VarIsNull(AValue) or
({(VarType(AValue) = varString)}VarIsStr(AValue) and (Trim(VarToStr(AValue)) = ''));
{+.}
end;

"ExpressEditors Library 5"

cxCalendar.pas

procedure TcxCustomDateEditProperties.PrepareDisplayValue(
const AEditValue: TcxEditValue; var DisplayValue: TcxEditValue;
AEditFocused: Boolean);

function GetDisplayValue: string;
var
AValue: TcxEditValue;
begin
{+}
//if VarIsSoftNull(AEditValue) or (AEditValue = NullDate) then
// Result := GetEmptyDisplayValue(AEditFocused)
if VarIsSoftNull(AEditValue) or ( (VarIsDate(AEditValue) or VarIsNumericEx(AEditValue))
and (AEditValue = NullDate)) then
begin
Result := GetEmptyDisplayValue(AEditFocused);
end
{+.}
else
if not(VarIsStr(AEditValue) or VarIsDate(AEditValue) or VarIsNumericEx(AEditValue)) then

...

cxCurrencyEdit.pas

procedure TcxCustomCurrencyEdit.KeyPress(var Key: Char);
begin
{+}
if not (ActiveProperties.UseThousandSeparator and (Key = ThousandSeparator)) and
{$IFNDEF CLR}(Key in ['.', ',']){$ELSE}((Key = '.') or (Key = ',')){$ENDIF} then
Key := DecimalSeparator{$IFDEF CLR}[1]{$ENDIF};
inherited KeyPress(Key);
{+.}
end;


cxDateUtils.pas

function TextToDateEx(AText: string; var ADate: TDateTime): Boolean;
var
ADay, AMonth, AYear: Word;
{+}
sBaseText: string;
{+.}
begin
try
AText := Trim(AText);
if AText = '' then
Result := False
else
begin
{+}
sBaseText := AText;
{+.}
if not cxFormatController.UseDelphiDateTimeFormats then
CorrectTextForOleDateTimeConversion(AText);
// Smart Date
if not SmartTextToDate(AText, ADate) then
if cxFormatController.UseDelphiDateTimeFormats then
// В режиме cxFormats.pas:TcxFormatController.UseDelphiDateTimeFormats == True
// в Delphi 5 работать не будет, т.к. нужно делать испрвления в системной библиотеке.
// На других Delphi этот режим не проверял. По умолчанию этот режим не используется.
ADate := StrToDateTime(AText)
else
{+}
//ADate := VarToDateTime(AText);
if not cxStrToDateTime(AText, True, ADate) then
ADate := VarToDateTime(sBaseText);
{+.}
Result := (ADate < MaxInt) and (ADate > -MaxInt - 1);
if Result then
begin
DecodeDate(ADate, AYear, AMonth, ADay);
Result := (ADay > 0) and (AYear <= MaxYear);
end;
end;
except
Result := False;
ADate := NullDate;
end;
end;

// Для .NET

function TextToDateEx(AText: string; var ADate: TDateTime): Boolean;
var
ADay, AMonth, AYear: Word;
{+}
sBaseText: string;
{+.}
begin
try
AText := Trim(AText);
if AText = '' then
Result := False
else
begin
{+}
sBaseText := AText;
{+.}
if not cxFormatController.UseDelphiDateTimeFormats then
CorrectTextForOleDateTimeConversion(AText);
// Smart Date
if not SmartTextToDate(AText, ADate) then
if cxFormatController.UseDelphiDateTimeFormats then
ADate := StrToDateTime(AText)
else
{+}
//ADate := TDateTime.Parse(AText);
if not cxStrToDateTime(AText, True, ADate) then
ADate := TDateTime.Parse(AText);
{+.}
Result := True;
if Result then
begin
DecodeDate(ADate, AYear, AMonth, ADay);
Result := (ADay > 0) and (AYear <= MaxYear);
end;
end;
except
Result := False;
ADate := NullDate;
end;
end;

"ExpressLibrary"

cxContainer.pas

procedure TcxCustomPopupWindow.Popup(AFocusedControl: TWinControl);
...
procedure ShowPopupWindow;
var
P: TPoint;
begin
InitPopup;
...
if FFocusedControl = nil then
SetFocus
else {+} if FFocusedControl.CanFocus then {+.}
FFocusedControl.SetFocus;
...

Автор: Alex47
Дата сообщения: 29.09.2005 20:36
VadimLou
Здорово!!!
Только есть просьба. Если это полностью результат собственных изысканий, а не патчи от поддержки, нельзя ли подробнее прокомментировать смысл сделанных изменений.
Автор: VadimLou
Дата сообщения: 29.09.2005 23:35
В основном это:

Для дат основная причина ступора это function GetDisplayValue а именно выражение сравнения:
(AEditValue = NullDate). Тут идёт попытка автоматической конвертиации варианта и когда он строка (а это как правило всегда) - то как резулатат - ступор ...

cxDateUtils.pas:TextToDateEx - применяется при конвертации строки в дату во время проверки текущего значения с разными масками (Standart, regExp).
Дата может быть введена не полностью (без года), тогда проверка должна это учитывать (автоматом подставлять год).

С датами DevEx работает в 2-х режимах:
1) с использованием стандартных дельфовых функций
2) с исп-ем DevEx ф-ций (ПО УМОЛЧАНИЮ)

Это регулируется свойством cxFormats.pas:cxFormatController.UseDelphiDateTimeFormats.

При использовании DevEx -ф-ций не срабатывала ф-ция VarToDateTime. Я не разбирался с ней, а использовал другую(работающую) DevEx ф-цию: cxStrToDateTime.

При использовании 1-го варианта для Delphi 5 нужно или править системный ф-ции Дельфы или вызывать их исправленную копию. ДЛя других версий дельфы я этот вариант не проверял.

cxContainer.pas - прокверка возможности установки фокуса дабы избежать ругательств... это может проявляться в очень редких случаях.



Автор: Alex47
Дата сообщения: 30.09.2005 08:13
VadimLou
Все понятно, Успехов!
Автор: LeXB
Дата сообщения: 30.09.2005 14:40
Всем доброго времени суток.
Может кто сталкивался с такой проблемой. D7+DevExpress 5.0.
Приложение написанно на BPL, все модули написанны с максимальным использованием компонент DevExpress, основной модуль (exe), запускающий остальные, сделан стандартными компонентами и единственный компонент в главном модуле TcxLookAndFeelController. Теперь собственно сама проблема: если я пытаюсь в главном модуле использовать TcxGrid, то при загрузке любого нашего пакета выходит ошибка:
A class named TcxEditRepositoryLookupComboBoxItem already exists.
И это не только с гридом, большинство компонентов выдают подобные ошибки. Это зависит даже не столько от того какие компоненты на форме, а что включенно в раздел Uses.
Когда работали только на стандартных компонентах всё работало как часики. Может кто сталкивался, помогите плз...
Автор: Alex47
Дата сообщения: 01.10.2005 09:51
LeXB
Вот ссылки по runtime packages:
http://www.inquiry.com/techtips/delphi_pro/10min/10min0301-1.asp
http://www.obsof.com/delphi_tips/DL613.html
http://delphi.about.com/library/weekly/aa010901a.htm
http://delphi.about.com/library/weekly/aa012301a.htm
http://bdn.borland.com/article/0,1410,27178,00.html
http://www.obsof.com/delphi_tips/delphi_tips.html
Может помогут решить проблему...
Автор: Alex1978
Дата сообщения: 02.10.2005 12:40
inigo
Присоединяюсь к вопросу (если разобрался подскажи плз решение).
Автор: LeXB
Дата сообщения: 03.10.2005 08:45
Alex47
Спасибо за помошь, только я не нашел то что мне требуется (может плохо искал ), попробую объяснить чуть чуть по другому какая у меня ситуация и свои наблюдения.
Копия VCL в памяти когда работаешь с BPL один у всего проекта. Когда грузится VCL DevExpress-а вместе с exe, по при загрузке моих BPL DevExpress пытается создать ещё одну свою копию VCL и вылетает на ошибку, т.к. все это уже сидит в памяти и соответственно именна всех классов уже заняты. Но когда грузится VCL DevExpress-а вместе с моими BPL то такой ситуации не возникает, даже если я 10 разных своих BPL загружаю которые используют один и тот же VCL.

Добавлено:
Alex47
Ещё раз спасибо за помощь. Решение найдено
Автор: Vitus_Bering
Дата сообщения: 03.10.2005 12:42
Каким образом менять стиль строки или ячейки в QuantumGrid 5.9, в зависимости от значения поля?
Автор: Alex47
Дата сообщения: 03.10.2005 14:25
Vitus_Bering
OnGetContent style event handler:
procedure TForm1.cxGrid1DBTableView1StylesGetContentStyle(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
begin
// use the
// ARecord.Values[ViewColumnName.Index]
// array to get the value.
// Пример:
if ARecord.Values[AItem.Index] < 0 then
AStyle := <StyleRed>
else AStyle := <StyleDefault>;

end;
Автор: Vitus_Bering
Дата сообщения: 03.10.2005 14:36
Alex47
Спасибо большое .


Добавлено:
Alex47

Цитата:
OnGetContent style event handler:
procedure TForm1.cxGrid1DBTableView1StylesGetContentStyle(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
begin
// use the
// ARecord.Values[ViewColumnName.Index]
// array to get the value.
// Пример:
if ARecord.Values[AItem.Index] < 0 then
AStyle := <StyleRed>
else AStyle := <StyleDefault>;

end;


А как проверить текстовое поле на частичное совпадение?


Автор: Alex47
Дата сообщения: 04.10.2005 09:01
Vitus_Bering
А AnsiContainsText function не помогает?
(Indicates whether one string is a (case-insensitive) substring of another.)
Смотри Help, string handling routines.
Автор: Vitus_Bering
Дата сообщения: 04.10.2005 13:06
Alex47
Спасибо за совет.

Есть ли возможность вывести название полей в две колонки в DBCardView?
Автор: Commandos
Дата сообщения: 04.10.2005 13:17
Подскажите, пожалуйста, в какие из пакетов DevExpress входят компоненты:
TdxTabSet
TdxTreeList
TdxBarManager
TcxButton
TcxMemo
TcxButton
TcxVerticalGrid
Автор: Vitus_Bering
Дата сообщения: 04.10.2005 13:21
Commandos
В полном пакете DevExpr_26_08_2005 в варезнике, в обменнике.
Автор: Commandos
Дата сообщения: 04.10.2005 13:24
Vitus_Bering
Спасибо!
Автор: Alex47
Дата сообщения: 04.10.2005 15:12
Vitus_Bering

Цитата:
Есть ли возможность вывести название полей в две колонки в DBCardView

Возможно, для этого будет удобен ExpressVerticalGrid.
Посмотри ExpressVerticalGrid\Demos\Delphi\RowsMultiEditorsDemo.
Автор: VadimLou
Дата сообщения: 04.10.2005 22:09
TdxBarManager - "ExpressBars 5"
cxButton,TcxMemo - "ExpressEditors Library 5"
TcxVerticalGrid - "ExpressVerticalGrid"
TdxTabSet - ???
TdxTreeList - "ExpressQuantumTreeList 3" - чтобы собрать в D6..D9 нуна исправить
тело dxEdLVer.inc и dxEdVer.inc на:
-------
{$i cxVer.inc}
-------

Автор: inigo
Дата сообщения: 05.10.2005 12:52
Alex1978

Цитата:
Присоединяюсь к вопросу (если разобрался подскажи плз решение).

Насколько удалось самостоятельно разобраться, "чекать" дочерние и родительские узлы приходиться самому. Написал две процедурки: одна рекурсивная для "детей" и одна обычная для "родителей".
Автор: stalker780
Дата сообщения: 06.10.2005 12:28
Подскажите, как определить, что выбрано в свойстве Properties компоненты TcxGridDBColumn?

ААА! уже разобрался. для этого есть свойства PropertiesClass и PropertiesClassName. Вопрос снят надо было внимательнее хелп изучать.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Kylix


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