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

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

Автор: reenoip
Дата сообщения: 01.02.2013 14:12
Ок, ок.



В общем, я с вашей помощью сегодня добился нужного мне поведения приложения, так что всем огромное спасибо за участие. Осталась самая малость: реализация экспорта из cxgrid в spreadsheet, spreadsheet и работа с формулами внутри приложения, экспорт из spreadsheet в xlsx (xls, к сожалению, пользователя не устраивает - от него после проверки выходного файла идёт дальнейший экспорт другому пользователю, и никто из них конвертировать файл, даже с помощью bat-файла, по понятным причинам не хочет; они вообще ничего не хотят делать кроме проверки и пересылки, так что желательно переложить это на программу), ну и по мелочи с отчётами. Но это оставим на выходные
Автор: makz
Дата сообщения: 01.02.2013 14:22
mdid

Цитата:
Текст хранится в базе.

cxDBRichEdit не...? Ну в смысле в контейнере.
Автор: serg87i
Дата сообщения: 01.02.2013 22:22
Доброго времени суток. Нужен совет. Как можно получить данные из выделенной области грида?
Допустим есть sql запрос, получаю набор данных из этого набора мне нужно вытянуть поле ИД но только из тех строк какие я выделил?
Вот начало:

z = cxGrid1DBBandedTableView1->DataController->GetSelectedCount();

for (int i = 0; i < z; i++) {


Memo1->Lines->Add(..........................................

}

Спасибо!
Автор: makz
Дата сообщения: 02.02.2013 00:15
serg87i
<dataset>->GotoBookmark(DataController->GetSelectedBookmark(i))
как-то так.
Автор: reenoip
Дата сообщения: 02.02.2013 08:33

Код: procedure TForm1.Button1Click(Sender: TObject);
begin
with SaveDialog1, cxGrid1 do
if execute then
begin
ExportGridToExcel(SaveDialog1.FileName, cxGrid1, true, true, true, 'xls');
SaveDialog1.FileName:=DateToStr(Date);
end;
end;
Автор: serg87i
Дата сообщения: 02.02.2013 09:00
int z;
AnsiString d;
AnsiString k;
z = cxGrid1DBBandedTableView1->DataController->GetSelectedCount();

for (int i = 0; i < z; i++) {
Memo1->Text = ADOQuery1->FieldByName("id_monitor")->AsString;
}

В Мемо заносится только первая выделенная строка а остальные нет как быть?

Добавлено:
[CPP]int z;
int y;
AnsiString d;
AnsiString k;
z = cxGrid1DBBandedTableView1->DataController->GetSelectedCount();

for (int i = 0; i < z; i++) {

    d = cxGrid1DBBandedTableView1->DataController->GetSelectedRowIndex(i) ;
    Memo1->Lines->Add(d) ;



}[/CPP]
Вот еще вариант. В Мемо заносятся индексы строк. А как по этим индексам вытащить данные из поля id_minitor ?
Автор: makz
Дата сообщения: 02.02.2013 10:32
reenoip
Очевидно потому, что в этом коде имя файлу присваивается уже после закрытия диалога.
Автор: regkz
Дата сообщения: 02.02.2013 10:35

Цитата:
for (int i = 0; i < z; i++) {   Memo1->Text = ADOQuery1->FieldByName("id_monitor")->AsString;   }

правильно, нужно же строку добавлять
Memo1->Lines->Add(ADOQuery1->FieldByName("id_monitor")->AsString);
и передвигать курсор на следующую запись
Автор: makz
Дата сообщения: 02.02.2013 10:58
serg87i

Цитата:
В Мемо заносится только первая выделенная строка а остальные нет как быть?

for (int i = 0; i < z; i++) {
ADOQuery1->GotoBookmark(DataController->GetSelectedBookmark(i));
Memo1->Lines->Add(ADOQuery1->FieldByName("id_monitor")->AsString);
}


Цитата:
А как по этим индексам вытащить данные из поля id_minitor ?

Эти индексы мало отношения имеют к тому, что вам захотелось получить.
Автор: serg87i
Дата сообщения: 02.02.2013 11:34
Спасибо всем за помощь!
Добавлено:
for (int i = 0; i < Memo1->Lines->Count; i++) {
j = Memo1->Lines->Strings[i];
ADOQuery2->Close();
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("SELECT as,id FROM link_tbl WHERE id = '"+k+"' ");
ADOQuery2->Open();
ExportGridToXLSX(j,cxGrid2,1,1,1,"xlsx");
}
Кто сталкивался?
В Мемо1 вносятся id, затем по ним осуществляется экспорт. Так вот при количестве записей больше 30000 у меня out of memory. Смотрю в диспетчере процесс доходит до предела обьема ОЗУ и выкидывает ошибку.












Добавлено:
Может есть другие способы экспорта из таблиц не обязательно через грид?
Автор: reenoip
Дата сообщения: 03.02.2013 07:26
makz
да, но дело в том, что и


Код: procedure TForm1.Button1Click(Sender: TObject);
begin
with SaveDialog1, cxGrid1 do
if execute then
begin
SaveDialog1.FileName:=DateToStr(Date);
ExportGridToExcel(SaveDialog1.FileName, cxGrid1, true, true, true, 'xls');
end;
end;
Автор: makz
Дата сообщения: 03.02.2013 09:00
reenoip
И какая же по-вашему строка кода запускает диалог? И что исполняется до, а что после закрытия?

Добавлено:
serg87i
Даже не ужас. Ужас-ужас.

Цитата:
Может есть другие способы экспорта из таблиц не обязательно через грид?

Мильён разных способов. Только надо задачу описать конкретнее, а то, пардон, бисер метать - надоедает.
Автор: serg87i
Дата сообщения: 03.02.2013 11:42
Задача выгрузить данные из базы. Есть запрос, нужен экспорт в XLSX. Спс.
Автор: makz
Дата сообщения: 03.02.2013 12:39
serg87i
Если без самого excel надо обойтись, то например _http://www.tmssoftware.com/site/flexcel.asp, а если excel есть, то можно через OLE.
Автор: X11
Дата сообщения: 04.02.2013 09:12

Цитата:
Доброго времени суток. Нужен совет. Как можно получить данные из выделенной области грида?


Наберите в гугле: cxGrid цикл по выделенным записям

Добавлено:

Цитата:
Может есть другие способы экспорта из таблиц не обязательно через грид?


Есть. Однозначно есть.
Автор: reenoip
Дата сообщения: 04.02.2013 12:25

Цитата:
И какая же по-вашему строка кода запускает диалог? И что исполняется до, а что после закрытия?

Так если бы я знал - разве б я спрашивал?






А как вот это можно перевести с "С++" на "Delphi"?


Код: //Setting the BarEditItem's value to "Checked"
cxBarEditItem1->EditValue = ((TcxCheckBoxProperties*)cxBarEditItem1->Properties)->ValueChecked;

//Setting the BarEditItem's value to "Unchecked"
cxBarEditItem1->EditValue = ((TcxCheckBoxProperties*)cxBarEditItem1->Properties)->ValueUnchecked;
Автор: makz
Дата сообщения: 04.02.2013 13:54
reenoip

Код: procedure TForm1.Button1Click(Sender: TObject);
begin
with SaveDialog1, cxGrid1 do begin
FileName:=DateToStr(Date);
if execute then
ExportGridToExcel(FileName, cxGrid1, true, true, true, 'xls');
end;
end;
Автор: reenoip
Дата сообщения: 04.02.2013 14:40
makz
благодарю.

Только скажи, пожалуйста, как ты это узнал? А то у меня открыт хэлп по этому компоненту, и я его перед тем, как сюда написать, вывернул наизнанку, но всё равно не смог найти искомое (плохо ищу?). Выходит, я либо не так ищу, либо файл у меня устаревший.




Добавлено:

Цитата:
procedure TForm1.Button1Click(Sender: TObject);  
begin  
with SaveDialog1, cxGrid1 do begin
FileName:=DateToStr(Date);
if execute then  
ExportGridToExcel(FileName + '.', cxGrid1, true, true, true, 'xls');  
end;  
end;

makz
это,кстати, то, что нужно, но я чуть-чуть изменил имя (выделил жирным), а то у меня год "съедался", почему-то, в итоге имя файла выглядело как "04.02.xls" вместо "04.02.2013.xls".

Огромное спасибо за помощь!
Автор: makz
Дата сообщения: 04.02.2013 16:24
reenoip
Знание некоторых принципов, восполняет незнание многих фактов. Ничего я не знал - это перевод того что ты просил перевести.
Автор: reenoip
Дата сообщения: 05.02.2013 11:25
Понятно. В любом случае, спасибо ещё раз за помощь.







Новый вопрос: как мне в cxGrid русифицировать "summary"?



Все остальные компоненты русифицированы нормально (через подключение ресурсов), и сам грид в целом тоже, но "шапки" без перевода. Посмотрел *.ini (служивший в качестве исходника для *.rc), пропущенных строк не обнаружил, в итоге попробовал подключить его (мало ли, вдруг *.rc как-то криво скомпилировался, а в *.ini всё пучком), но - безрезультатно.

Добавлено:
Т.е. мне бы русифицировать COUNT. Или это "by design"?

Добавлено:
И вдогонку: как мне экспортировать это хозяйство из cxGrid в сгруппированном виде (т.е. как на рисунке)? А то сейчас при попытке экспорта в тот же *.xls таблица уходит в развёрнутом виде.
Автор: X11
Дата сообщения: 05.02.2013 12:43

Цитата:
как мне экспортировать это хозяйство из cxGrid в сгруппированном виде


Справка поможет.
А посмотреть параметры ExportGridToExcel не получается?
Автор: Pint pot
Дата сообщения: 05.02.2013 14:07
Доброго времени суток.

Вопрос мой связан с компонентом TcxDBTreeList (v. 5.58).
Имеется рабочее приложение, в котором используется TcxDBTreeList. По появившемуся желанию заказчика, должна быть реализована возможность выделения и последующего копирования данных в буфер (затем в Excel) отдельной группы ячеек. То есть стандартным образом можно выделять только целыми нодами-записями по всем имеющимся полям.
Я спрашивал на сайте техподдержки http://www.devexpress.com/Support/Center/Question/Details/Q470423 "как быть?" Мне указали на то, что это возможно реализовать только вручную.

Прошу помочь, желательно рабочим кодом-примером (!), как, например, отлавливать событие клика мышкой по ячейке (или выделение области ячеек мышкой с зажатой левой кнопкой мыши, или комбинации Shift + Arrow) и по нему выделять отдельные ячейки или хотя бы как-то маркировать их (менять цвет текста или фона, например).

Автор: X11
Дата сообщения: 05.02.2013 14:28
Я бы отобразил чекбоксы и пусть юзер сам решает с помощью чекбоксов, что ему нужно копировать.
В дереве реализовано так, что если отмечаешь узел, то автоматически отмечаются и все дочерние подузлы.
Автор: makz
Дата сообщения: 05.02.2013 14:38
reenoip
В Default For Groups например написать <Кол-во:##> в св-ве Format.
Автор: reenoip
Дата сообщения: 05.02.2013 15:08
makz
спасибо огромное!!!

Добавлено:
Как правильно программным путём отменять группировку колонок "group by box" в cxGrid?

Пока, к сожалению, самостоятельно смог додуматься лишь до такого извращения:

Код: cxGrid1DBTableView1***.GroupIndex1:=-1;
Автор: Pint pot
Дата сообщения: 05.02.2013 20:52
Никто ничего больше не подскажет? Мне необходимо реализовать требование именно описанным способом. То есть операция выделения группы ячеек должна выглядеть как выделение группы ячеек в MS Excel.

Вот как оно выглядит сейчас в TreeList. И надо сделать так как это получается на картинке с Grid-ом. То есть выбирать ячейки с данными за интересующие показываемые годы.
http://s2.uploads.ru/ty8eD.png
http://s2.uploads.ru/W1xRT.png

Кто-нибудь работал с событиями типа onCustomDrawDataCell у TcxDBTreeList?
Автор: eddoc
Дата сообщения: 05.02.2013 21:23
reenoip

Цитата:
Как правильно программным путём отменять группировку колонок "group by box" в cxGrid?


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

Автор: X11
Дата сообщения: 05.02.2013 22:34
очень сильно облегчают, но нужно их изучать

Добавлено:

Цитата:
Как правильно программным путём отменять группировку колонок "group by box" в cxGrid?



посмотри .DataController.Groups..... нет дельфи под рукой и справку глянь
Автор: marser
Дата сообщения: 06.02.2013 06:13
Pint pot
В обработчике события OnMouseDown, используя cxTreeList.HitTest, запоминаете индексы Node и Column. В обработчике события OnCustomDrawDataCell проверяете совпадение индексов (if (AViewInfo.Node.AbsoluteIndex = ...) and (AViewInfo.Column.ItemIndex = ...)) и раскрашиваете нужные ячейки (ACanvas.Brush.Color := ..., ACanvas.Font.Color := ...)
Автор: X11
Дата сообщения: 06.02.2013 10:01

Цитата:
Как правильно программным путём отменять группировку колонок "group by box" в cxGrid?


<YourTableView>.DataController.Groups.ClearGrouping;

Добавлено:
Да, а ещё есть <YourTableView>.DataController.ClearSorting(False);

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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