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

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

Автор: sam291074
Дата сообщения: 20.02.2012 18:25
Подскажите, пожалуйста.

На главной форме есть cxGrid. Форма порождает поток с вычислениями. Результаты поступают в таблицу вызовом из потока функции, обернутой при вызове в Synchronize потока:

Код:
void TMainForm::CreateRecordProcessStat(double U, double I, double T, const Seidman& iS) {
    cxGridProcessStatTableView1->DataController->RecordCount++;
    vector<int> Ind;
    Ind.push_back(cxGridProcessStatTableView1->DataController->RecordCount-1);
    for (int i = 0; i < cxGridProcessStatTableView1->ColumnCount; i++) {
         Ind.push_back(cxGridProcessStatTableView1->Columns[i]->Index);
    }

    TcxCustomDataController *dc = cxGridProcessStatTableView1->DataController;
    dc->BeginUpdate();
    try {
        dc->Values[Ind[0]][Ind[1]] = CurrToStrF(U,ffGeneral,5);
        dc->Values[Ind[0]][Ind[2]] = FloatToStrF(I,ffExponent,4,2);
        dc->Values[Ind[0]][Ind[3]] = CurrToStrF(iS.it_ext, ffGeneral, 5);
        dc->Values[Ind[0]][Ind[4]] = FloatToStrF(iS.err_int,ffExponent,4,2);
        dc->Values[Ind[0]][Ind[5]] = FloatToStrF(iS.err_ext_p,ffExponent,4,2);
        dc->Values[Ind[0]][Ind[6]] = FloatToStrF(iS.err_ext_n,ffExponent,4,2);
        dc->Values[Ind[0]][Ind[7]] = FloatToStrF(T,ffFixed,4,2);
    }
    __finally {
        if ( cxCheckBoxScrollTable->Checked ) dc->GotoLast();
        dc->EndUpdate();
    }
}
Автор: salexn1
Дата сообщения: 21.02.2012 07:32
sam291074
приведите весь код, где идет синхронизация....

еще замечания:
cxGridProcessStatTableView1->DataController->RecordCount++;
внести также в dc->BeginUpdate();

ну и как вариант отрисовывать не сразу, а скажем только каждое 5(10, 100) поступление данных от потока


Автор: sam291074
Дата сообщения: 21.02.2012 17:40
salexn1

Цитата:
приведите весь код, где идет синхронизация....



Код: указатель на поток TStatThread объявлен в классе MainForm

void __fastcall TStatThread::Execute() {
...

void __fastcall TStatThread::RunCalc() {
...
Synchronize(
void __fastcall TStatThread::TableUpdate() {
void TMainForm::CreateRecordProcessStat (...){
}
}
);
...
}
...
}
Автор: mdid
Дата сообщения: 21.02.2012 18:19
sam291074
попробуйте форме репеинт делать
Автор: sam291074
Дата сообщения: 21.02.2012 18:59
mdid

Цитата:
попробуйте форме репеинт делать


А вот и нет, это я пробовал в первую очередь - и тоже мимо кассы
Почитал про потоки, нашел в хэлпах, что синхронизация не может осуществляться с основным потоком приложения. Может в этом все дело.

Буду пробовать создавать еще один поток специально для отрисовки грида и синхронизировать уже их.
Автор: mdid
Дата сообщения: 22.02.2012 08:00
кстати а зачем вам еще один поток?выполняйте вычисления в главном+processmessages+repaint
Автор: fortezza
Дата сообщения: 22.02.2012 08:36
Добрый день, подскажите, есть ли возможность в выпадающем меню фильтрации заголовка столбца сделать собственное поле и повесить на него обработчик? Или возможно есть какие-то настройки для этого?


Нужно чтобы при клики выделялись все поля списка, а пользователь снимал галочку с ненужных.



Добавлено:
Добрый день, подскажите, есть ли возможность в выпадающем меню фильтрации заголовка столбца сделать собственное поле и повесить на него обработчик? Или возможно есть какие-то настройки для этого?



Нужно чтобы при клике по такому полю (например, SelAll) выделялись все поля списка, а пользователь снимал галочку с ненужных.

Автор: mdid
Дата сообщения: 22.02.2012 09:12
fortezza
cxGrid1DBTableView1data - поле с датами
в событие колонки в которую надо добавить свое значение фильтра OnGetFilterValues
добавить

Код: AValueList.Add(fviUser,'bigger','больше 03.11.2012',false);
Автор: salexn1
Дата сообщения: 22.02.2012 11:23
sam291074
Сделайте перерисовку грида только для каждого 10 вычисления...
Ну или для каждого 100... Тут с цифрами поиграть и посмотреть, что происходит.
Автор: Dima335
Дата сообщения: 22.02.2012 22:02

Цитата:
Можно ли у SpreadSheet закрепить крайнюю левую колонку, чтобы она отображалась всегда при перемещении по горизонтали? Т.е. как со свойством fixed kind у колонки грида

Цитата:
Dima335, можно.
Здесь есть пример.

Автор: X11
Дата сообщения: 23.02.2012 11:00
Есть dxBarManager и несколько dxBar. На dxBar лежат разные компоненты ввода для даты, для текста, комбобоксы и т.д.

Как сделать цикл по всем этим элементам ввода типа cxBarEditItem, чтобы присвоить значению EditValue значение NULL.
По нажатию на кнопку нужно очистить разом все введенные и выбранные значения.

Добавлено:
Всё оказалось весьма просто

Код: Var
i: integer;
begin
for I := 0 to dxBarManager1.ItemCount do
if dxBarManager1.Items[i] is TcxBarEditItem then
TcxBarEditItem(dxBarManager1.Items[i]).EditValue := null;
Автор: mdid
Дата сообщения: 23.02.2012 11:07
X11
копните в сторону ItemLinks
упс..опоздал..я обращался через линки...зато узнал что можно и напрямую
Автор: fortezza
Дата сообщения: 24.02.2012 06:29
mdid, спасибо
Автор: Man_Without_Face
Дата сообщения: 24.02.2012 09:04
В cxGrid вывожу данные в связке dxMemData - DataSource -cxGrid. В основном потоке все нормально. Но, как только пытаюсь вывести через критическую секцию - AV. Самое интересное - в отладчике все отрабатывает. Так же если грид не видно (в cxPageControl переключиться на др. вкладку). Кто с таким сталкивался и как это лечиться?
Автор: marser
Дата сообщения: 24.02.2012 20:35
Man_Without_Face
Если DataSet заполняется в другом потоке, то DataSet нужно отключать от DataSource
Автор: X11
Дата сообщения: 25.02.2012 08:20
Привет всем.
Есть на панели TcxBarEditItem в виде комбобокса.
Как сохранить и восстановить Properties).Items с помощью TcxPropertiesStore?
TcxComboBoxProperties(comboProxy.Properties).Items? Не получается.

Сама процедура выглядит так:

Код: procedure PropertiesStore(DoStore: boolean; form: TForm; AComponent: TComponent; const AProps: TStrArray);
Var
i:integer;
cxPropertiesStore1: TcxPropertiesStore;
begin
cxPropertiesStore1 := TcxPropertiesStore.Create(Application);
try
cxPropertiesStore1.StorageName := sPathOptions + form.name + '_' + AComponent.Name + '.ini';
cxPropertiesStore1.StorageType := stIniFile;

with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
begin
Component := AComponent;
for I := 0 to Length(AProps) - 1 do
Properties.Add(AProps[i]);
end;//with

if DoStore then
cxPropertiesStore1.StoreTo(true)
else
cxPropertiesStore1.RestoreFrom;

finally
FreeAndNil(cxPropertiesStore1);
end;
end;


//сохраняем
PropertiesStore(True, fmMain, comboProxy, VarArrayOf(['TcxComboBoxProperties(comboProxy.Properties).Items']));
Автор: LadyOfWood
Дата сообщения: 25.02.2012 15:50
sam291074
Synchronize вообще штука не очень хорошая, но учитывая что VCL не tread-safe, может лучше заполнить структуру и отсылать PostMessage.
Автор: neznayka3
Дата сообщения: 25.02.2012 19:05
Надо чтобы у TdxBarLargeButton было такое же поведение как у TdxBarSubItem. те при нажатии на кнопку вываливалось меню. bsDropDown дает только лишнюю кнопку, по которой еще попасть надо.
Автор: LadyOfWood
Дата сообщения: 25.02.2012 19:52

Цитата:
Надо чтобы у TdxBarLargeButton было такое же поведение как у TdxBarSubItem. те при нажатии на кнопку вываливалось меню.

Руками, по нажатию (onclick) делать Popup.
Автор: sam291074
Дата сообщения: 26.02.2012 08:47
LadyOfWood и другим откликнувшимся

Разобрался. Неверно был размещен код обнуления записей ДатаКонтроллера при каждом новом запуске расчета (я оставил его в порождаемом потоке, а надо было загнать его в основной, где и происходит основная обработка). Я не сразу обратил внимание на то, что отрисовка виснет со второго или очередного запуска, но никогда с первого.
Сейчас все вроде стабилизировалось. Спасибо за обсуждение.
Автор: vcrank
Дата сообщения: 26.02.2012 08:55
cxGrid
Одной из колонок в свойстве Properties указал ShellComboBox
Root - BrowseFolder указал bfCustomPath
Если в режиме проектирования заполнить свойство CustomPath, то всё работает как надо - выпадает список файлов из указанной папки.
Если пытаюсь указать путь при старте программы, то это не срабатывает
TcxShellComboBoxRoot(cxGridDBTableView2DPath).CustomPath := ExtractFileDir(ParamStr(0));

Подскажите, куда копать
Автор: sam291074
Дата сообщения: 26.02.2012 09:35
vcrank
Начни смотреть с ExtractFileDir(ParamStr(0))

Вот этот работает (Builder C++)

Код: UnicodeString P = "C:\\Temp\\";
((TcxShellComboBoxProperties*)(cxGrid1DBTableView1Column1->Properties))->Root->CustomPath = P;
Автор: vcrank
Дата сообщения: 26.02.2012 09:44
sam291074


Код: var
s: WideString;
begin
s := ExtractFileDir(ParamStr(0));
TcxShellComboBoxRoot(cxGridDBTableView2DPath).CustomPath := s;
end;
Автор: sam291074
Дата сообщения: 26.02.2012 10:18
vcrank


Цитата:
Ерунда какая-то...
TcxShellComboBoxRoot(cxGridDBTableView2DPath).CustomPath:=ExtractFileDir(ParamStr(0)); // не работает
cxShellComboBox1.Properties.Root.CustomPath:=ExtractFileDir(ParamStr(0)); // работает


Слушай, ну 99,9% преобразование типов.
Дело в том, что в таблице и в отдельном компоненте обращение по разному идет. Надо Properties колонки привести к нужному Properties и танцевать дальше.

(TcxShellComboBoxProperties(cxGridDBTableView2DPath.Properties)).Root.CustomPath := MyPath

Может так? cxGridDBTableView2DPath - это ведь имя колонки в таблице?
Автор: vcrank
Дата сообщения: 26.02.2012 10:31

Цитата:
Надо Properties колонки привести к нужному Properties и танцевать дальше.

Если я правильно помнимаю, то тип WideString

И так вариант я уже пробовал:

Код: var
s: WideString;
begin
s := ExtractFileDir(ParamStr(0));
TcxShellComboBoxRoot(cxGridDBTableView2DPath).CustomPath := s;
end;
Автор: sam291074
Дата сообщения: 26.02.2012 10:36
vcrank

Вот так работает, только что по анологии с С++ написал и проверил


Код: procedure TForm1.FormShow(Sender: TObject);
begin
cxGrid1DBTableView1.DataController.RecordCount := cxGrid1DBTableView1.DataController.RecordCount +1;
(TcxShellComboBoxProperties(cxGrid1DBTableView1Column1.Properties)).Root.CustomPath := 'C:\Temp';
end;

end.
Автор: vcrank
Дата сообщения: 26.02.2012 10:53
sam291074
Да, такой вариант сработал, но для таблицы 1 уровня... забавно... сейчас накидаю пример для Delphi 7
Автор: sam291074
Дата сообщения: 26.02.2012 11:04
vcrank

Цитата:
Да, такой вариант сработал, но для таблицы 1 уровня... забавно...

Да ничего забавного нет. Свойства должны быть преобразованы к Свойствам. Это концепция таблицы от девок. Ячейка - это контейнер имеющий определенные Свойства. Хочешь работать с ее свойствами - сделай приведение к свойствам соответствующего типа (именно к свойствам, а не к компоненту, чьими свойствами ты пользуешься). Кстати, эксепшен может и не генерироваться при неверном приведении, так как это зависит, по-моему, от размеров памяти, занимаемых объектами при приведении. Например, если ячейка занимает как объект больше памяти, чем объект к которому она приводится, то исключения не должно возникать, но то что считывается не соответствует твоему желанию. Несколько путанно, но как-то так.

Исходя из этого преобразование к TcxShellComboBoxRoot не катит
Автор: LadyOfWood
Дата сообщения: 26.02.2012 11:12

Цитата:
Да ничего забавного нет. Свойства должны быть преобразованы к Свойствам. Это концепция таблицы от девок. Ячейка - это контейнер имеющий определенные Свойства.

Там все интереснее, для ячейки хранятся только свойтва, компонента редактирования вообще нет, он создается при редактировании из свойств. Поэтому кастовать только к TcxShellComboBoxProperties.
Автор: vcrank
Дата сообщения: 26.02.2012 11:19
http://rghost.ru/36715677
Заметил такую особенность:
- запускаем программу. дочерняя таблица свёрнута
- жмём кнопку
- теперь в таблице 1 и 2 при клике на ячейку Путь появляется путь к папке с программой
- закрываем программу

- снова запускаем
- разворачиваем дочернюю таблицу
- жмём кнопку Путь
- Путь в таблице 1 уровня становится равным папке с программой
- Путь в таблице 2 уровня = Рабочий стол

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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