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

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

Автор: UKRANDRUSHKA
Дата сообщения: 23.02.2006 16:52
gpi Тогда так
PPersistInfo = ^TPersistInfo;
TRichEditSelInfo = record
SelStart: Integer;
SelLength: Integer;
end;
PRichEditSelInfo =^ TRichEditSelInfo;
TPersistInfo = record
WinControl: TWinControl;
SpecInfo: Integer;

function GetFocusedControl(AWinControl:
TWinControl): TWinControl;
var
i: Integer;
begin
Result := nil;
for i:=0 to AWinControl.ControlCount - 1 do
if AWinControl.Controls[i] is TWinControl then
begin
Result := GetFocusedControl(TWinControl(AWinControl.Controls[i]));
if Result <> nil then Exit;
if TWinControl(AWinControl.Controls[i]).Focused then
begin
Result := TWinControl(AWinControl.Controls[i]);
Exit;
end;
end;
end;

procedure StorePersistentInfo(Sender: TcxGrid);
var
AWinControl: TWinControl;
p: PPersistInfo;
PSelInfo: PRichEditSelInfo;
begin
AWinControl := GetFocusedControl(Sender);
if AWinControl <> nil then
begin
New(p);
p^.WinControl := AWinControl;
if AWinControl is TCustomEdit then
begin
New(PSelInfo);
PSelInfo^.SelStart := TCustomEdit(AWinControl).SelStart; <-------
PSelInfo^.SelLength := TCustomEdit(AWinControl).SelLength; <-------
p^.SpecInfo := Integer(PSelInfo);
end;
end;
end;
Автор: gpi
Дата сообщения: 25.02.2006 19:49
UKRANDRUSHKA
Если честно - ничего не понял . Что-нибудь попроще есть? Или как загрузить rtf-текст в ячейку столбца TcxGridBandedColumn с Properties=RichEdit
Автор: AnGo
Дата сообщения: 26.02.2006 09:27
Коллеги!
Что-то странное происходит у меня.
ВСВ6, грид 5.3.
Положил на форму, всю компилится, работает.
Выхожу - получаю исключение Invalid pointer operation в модуле Form.

Самое интересное, что уже давно живет проект с такими гридами, который сопровождается, регулярно правиться, новые фичи добавляются и т.д. - там все чисто.

Что-то, видимо, я забыл в консерватории поправить, когда делал новый проект.
Автор: Alex47
Дата сообщения: 27.02.2006 14:57
AnGo
Были у меня вылеты при закрытии форм, правда в Delphi.
Ситуация другая, но, возможно, эта инфа будет чем-то полезна.

1. В обработчике FormClose я закрывал DataSet MyTable на котором висит GridDBTableView. Пришлось вставить строку MyTable.DisableControls перед MyTable.Close.

2. В обработчике FormClose ставлю строку Action :=CaFree,
в обработчике FormDestroy строку myForm := nil, где

var
myForm: TmyForm;
Автор: AnGo
Дата сообщения: 27.02.2006 15:36
Alex47
При случае попробую. Сейчас глюк чудесным образом испарился.
Фантастика какая-то.
Сравнивал с старым рабочим проектом, отличий в коде нет.
В FormClose всегда ставлю caFree.
А рушилось на виртуальном деструкторе в Form.
Ситуация- не нравится в принципе. Почему и как это глюк вылезает.
Зараза и вылезет же за день до сдачи проекта в эксплуатацию.
Автор: Alex47
Дата сообщения: 27.02.2006 20:01
AnGo

У меня поведение форм внешне было похожее. Иногда проходили дни без вылетов, иногда вылеты сыпались как из мешка. Особенно помогло "зануление" переменной формы в обработчике FormDestroy: myForm := nil.
Автор: Kmich
Дата сообщения: 01.03.2006 05:50
AnGo

У меня тоже такое было когда запрос выполнялся в Thread... помогла новая версия грида...
Автор: AnGo
Дата сообщения: 01.03.2006 11:51
Kmich
Попробовал поставить последнюю из обменника.
Проекты не компиляться - штуки три неразрешенных ссылок.
Попробовал поискать в исходниках - ничего не нашел.
Поэтому пока откатился на старую, годичной давности.
Да, все ставилось под ВСВ6
Автор: sergbl2003
Дата сообщения: 02.03.2006 13:23

Подскажите пожалуйста как программно создать подменю в dxBarPopupMenu????

Вроде так:

dxBarPopupMenu1->ItemLinks->Clear();
TdxBarItemLink *ItemLink;
ItemLink = dxBarPopupMenu1->ItemLinks->Add();
ItemLink->Item = dxBarButton1;
ItemLink->UserCaption = "Custom ...";

Но сначала нужно создать dxBarButton1, а вот как ???
Автор: DimaDiZ
Дата сообщения: 02.03.2006 16:31
Может знает кто, почему в cxEditorax перестала работать такая удобная штука, как
procedure TForm1.cxTextEdit1Enter(Sender: TObject);
begin
PostMessage(cxTextEdit1.Handle, EM_SETSEL, 0, Length(cxTextEdit1.Text));
end;
она выделяет весь текст в едиторе не только при переходу по Tab (св-во AutoSelect), но и при активизации компонента мышью, в dx - работала.
Автор: CAV
Дата сообщения: 02.03.2006 23:09
DimaDiZ

Код:
PostMessage(cxTextEdit1.InnerControl.Handle, EM_SETSEL, 0, -1);
Автор: DimaDiZ
Дата сообщения: 03.03.2006 16:42
CAV

Спасибо, так текст хотя бы выделяется, но только до курсора - это если мышкой кликать (хотя в принципе видно как он моргает выделяясь весь, а затем только до курсора), а в dx нормально весь выделялся
Автор: Alex47
Дата сообщения: 03.03.2006 22:58
DimaDiZ

Я не совсем понял, какая логика нужна при клике мышью в cxTextEdit.
Можно, например, обработчик OnClick для cxTextEdit сделать таким:
if TcxTextEdit(Sender).SelText = '' then
TcxTextEdit(Sender).SelectAll;
Тогда при клике выделяется весь текст.
При выделении мышью части текста - она и остается выделенной.
При двойном клике по тексту из нескольких слов - выделяется кликнутое слово.
Автор: xokc
Дата сообщения: 05.03.2006 09:22
Вопросы DimaDiZ напомнили мне одну мелкую пакость DevEx эдиторов - если в модальной форме cxEditor установлен как ActiveControl, то есть является фокусируемым при открытии формы, то весь его текст является выделенным и кроме того, прокрученным в конец (как если бы в нем последовательно нажать Home, Shift+End). При этом, если текст в контроле длинне, чем сам контрол - начала его (текста в смысле) не видно, что не есть правильно. Есть какой-нибудь очевидный способ это победить?
Автор: Alex47
Дата сообщения: 05.03.2006 12:39
xokc
Опять же непонятно, какое поведение требуется.
Пусть TextEdit1 - ActiveControl формы.
Если в обработчик FormShow поместить код:

TextEdit1 .Properties.AutoSelect := False;
TextEdit1 .SetFocus;
TextEdit1 .Properties.AutoSelect := True;

то после появления формы активным будет TextEdit1,
курсор будет в первой позиции,
текст будет невыделенным.
Автор: CAV
Дата сообщения: 05.03.2006 13:03
xokc
Так обычный TEdit же себя так же ведёт. Это пакость на DevEx, а Гейтса.

Ещё можно на FormShow сделать PostMessage(cxTextEdit1.InnerControl.Handle, EM_SETSEL, 0, 0);

Автор: xokc
Дата сообщения: 06.03.2006 09:10
Alex47
Ну это же геморрой - на каждой форме такое вытворять. Кроме того, FormShow будет срабатывать при каждом показе окна, и тогда все время будет пытаться фокусироваться TextEdit1, даже если последний раз при прятании формы в фокусе был не он. А если TextEdit1 еще и в PageControl находится, да его Tab в настоящее время закрыт - получим Exception. Корректнее было бы это в FormCreate делать, там будет такой же Exception при SetFocus. Понятно, что можно все это проверять и отслеживать - но некрасиво это как-то.

CAV
Твое решение элегантней. Но:
1) Прокрученность на конец текста не пропадает при этом. Наверное надо еще и WM_KEYDOWN с VK_HOME посылать. А это уже как-то не красиво.
2) В OnFormShow это тоже не-совсем правильно. Так как скорее это проблема FormCreate.
3) В dx компонентах и ранних cx я этого артефакта не замечал.

Но в целом, спасибо всем. Да и проблема в общем надуманная. Просто меня лично она раздражала.
Автор: samusev
Дата сообщения: 06.03.2006 11:17
Прошу помощи.

Есть грид на таблицу.
-колонки только для чтения.
-одна колонка содержит суммарные значения полей другой таблицы.

Хочется при клике на ячейку этой колонки получить или Lookup таблицу или Popup форму - не важно по значениям, которые эту сумму составляют.... Но

Проблема в том, что при значении readonly на ячейку - никакой редактор (Properties) не вызывается.

Как быть?


Delphi7/ DevEx от 09.02.06
Автор: DimaDiZ
Дата сообщения: 06.03.2006 12:18
Alex47

Нужно следующее поведение (что достигается применением PostMessage(dxTextEdit1.Handle, EM_SETSEL, 0, -1); в OnEnter на старых dx):
при первом одинарном клике мышью выделяется все (аналогично переходу на поле по Tab), при последующих кликах все работает стандартно, проще говоря, клик мышью должен просто активировать компонент, однако он еще и двигает выделение, что как раз не нужно...

if TcxTextEdit(Sender).SelText = '' then TcxTextEdit(Sender).SelectAll;

не приводит к нужному результату, так как выделяет весь текст при любом клике по компоненту, хотя требуется, например, просто спозиционировать курсор
Автор: CAV
Дата сообщения: 06.03.2006 12:30
samusev
Обработать OnGetProperties колонки. Там посетить AProperties, например из cxEditRepository.
Автор: inner
Дата сообщения: 06.03.2006 19:47
Подскажите, как объединить несколько колонок под один Caption в гриде?
Автор: gpi
Дата сообщения: 06.03.2006 20:13
inner
Используй Banded Table или DB Banded Table
Автор: Felix
Дата сообщения: 07.03.2006 08:26
Мужики, подскажите: есть таблица в ней прмерно 1,5 млн записей. При попытке отобразить данную массу в QuantumGrid приложение висит. Как бороться?
Автор: gpi
Дата сообщения: 07.03.2006 08:46
Felix
Попробуй в GridView установить DataController.GridMode=True. Хотя, скорее всего, это проблема датасета или нехватка ресурсов
Автор: Felix
Дата сообщения: 07.03.2006 08:57
gpi
ставил, толку нет. Мне не совсем понятна идеология работы грида с данными. Что он пытается с ними сделать?

Добавлено:

Цитата:
нехватка ресурсов

это маловероятно.
Автор: vshersh
Дата сообщения: 07.03.2006 09:39
Felix
Если GridMode = True то данные вытаскиваются порциями, как и в обычном гриде (DBGrid) иначе все данные фетчатся в память и находятся там.
1) Попробуй открыть свой НД в обычном ДБгриде. Посмотри насколько быстро будет бегать там. Дев-экспресс быстрее работать не будет ни при каких настройках (на таком объеме данных)
2) откажись вытягивать весь НД в грид. Используй фильтры. Если эта таблица, например, содержит данные за какойто период, то сделай на форме фильтр с возможностью выбора периода - по умолчанию показывай данные за последний месяц (неделя, день...) а уже если юзер выберет фильтр за 10 лет -- тогда это его проблема - пусть ждет.

Лично я за 2-й вариант


Добавлено
Сорри не тому адресовал пост



Автор: Felix
Дата сообщения: 07.03.2006 09:47
vshersh
Спасибо, попробую.
Автор: Alex47
Дата сообщения: 07.03.2006 19:26
DimaDiZ

Цитата:
Нужно следующее поведение (что достигается применением PostMessage(dxTextEdit1.Handle, EM_SETSEL, 0, -1); в OnEnter на старых dx):
...

Понял. Тогда можно попробовать так:

implementation
var
Enter: Boolean;

1. Код обработчика OnEnter для cxTextEdit:
Enter := True;

2. Код обработчика OnClick для cxTextEdit:
if Enter then
begin
TcxTextEdit(Sender).SelectAll;
Enter := False;
end;
Автор: DimaDiZ
Дата сообщения: 09.03.2006 15:49
Alex47

Так действительно работает, спасибо за идею
Можно даже без отдельной переменной обойтись дергая tag у сендера.
Интересно, что за фигню они таки сотворили с системными сообщениями, если не работает такая простая команда...
Автор: ShamaN
Дата сообщения: 09.03.2006 22:50
Возможен ли в ExpressFlowChart поворот объекта?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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