Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)

Модерирует : ShIvADeSt

ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

   

golkanavt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DevExpress

Обмен опытом, обсуждение нюансов и решение проблем возникающих при использовании библиотеки компонент Developer Express




 
Сами прирученные компоненты частенько приходят на водопой сюда
 
DLL со скинами из библиотеки dxSkins, автор Ziltoid Подробнее... линк обновлен
Продолжение, Первая часть, вторая часть

Всего записей: 1069 | Зарегистр. 08-04-2002 | Отправлено: 10:31 07-02-2009 | Исправлено: vladman, 14:36 24-10-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum
AViewInfo.GridRecord.Index
но это индексы грида. и это также будет не верное решение
У Вас база с ID'шниками ? Если да то добавьте поле в грид
и проверяйте по нему ID такой удален или нет  

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:27 02-04-2009 | Исправлено: greenpc, 11:33 02-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
if AdsTable1.AdsIsRecordDeleted(AViewInfo.GridRecord.ViewInfo.Index+1)

Если я правильно понял, то в качестве аргумента для AdsIsRecordDeleted нужно указывать индекс записи в таблице.
Уверен, что зная значение первичного ключа (ID) записи, есть возможность узнать и индекс этой записи.
Поэтому  
AViewInfo.GridRecord.ViewInfo.Index+1 заменяем на что-то похожее на
<GetRecordIndexByRecordID>(Sender.DataController.Values[AViewInfo.GridRecord.Index,  <YourGridTVYourIdColumn.Index]

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 11:58 02-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc
vladman
Дело втом, что ипользую грид в программе редактор dbf, т.е. открываются любые dbf-ки и у них не обязательно есть индекыи индексные поля. Аргументом для AdsIsRecordDeleted должен быть не индекс, а номер записи (Retrieves the current record number). Я так понимаю, проблема именно в этом - как узнать номер записи из AViewInfo

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 15:22 02-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum
AViewInfo.GridRecord.RecordIndex либо AViewInfo.GridRecord.Index
 
Различия см. ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_Class_TcxCustomGridRecord.htm

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 16:49 02-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum
Еще раз повторяю пробуй AViewInfo.GridRecord.Index  

Цитата:
AdsIsRecordDeleted должен быть не индекс, а номер записи (Retrieves the current record number).  

Номер записи реально получить ? думаю -да
в Вашей таблице AdsTable1 добавить поле где будет этот номер реально сделать?
если не хотите привязываться к номеру записи сделайте автоинкрементальное поле и работайте с ним.
PS: 4 раз говорю одно и тоже
PSS Вы уж определитесь какая грида Вам нужна
 

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 16:50 02-04-2009 | Исправлено: greenpc, 16:54 02-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc

Цитата:
в Вашей таблице AdsTable1 добавить поле где будет этот номер реально сделать?  
если не хотите привязываться к номеру записи сделайте автоинкрементальное поле и работайте с ним.

Я тоже повторюсь - это прога dbf-редактор. Я не могу просто так взять и добавить в чужую базу поле только лишь для того, чтоб мне было удобно. (Вернее, могу делать это при открытии базы, заполнять это поле автоинкрементным значением, а при закрытии удалять это поле. А Вы представляете, какова будет скорость открытия и закрытия больших файлов? Да и не неправильно это).
AViewInfo.GridRecord.Index вроде получилось, по крайней мере при скроллинге и перемещении курсора подсветка остается на месте. При удалении записи  подсветка сразу ставится. Остался лишь косяк с тем, что при повторном удалении подсветка не убирается (а должна)
С гридом определяюсь. В Девках по сравнению с EHLib на порядок больше возможностей. Просто я не думал, что такая простая операция, как подсветка удаленных записей вызовет такие танцы с бубном. В EHLib это на порядок проще и понятнее реализуется (код я приводил).  
P.S. В EHLib, кстати, чтоб обрабатывался CustomDrawCell y грида нужно свойство DefaultDrawing:=false. А в Девках ничего подобного не надо?
P.P.S. У Девок в OnCustomDrawCell есть ADone. Что это и надо ли его использовать?

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 17:06 02-04-2009 | Исправлено: Postscriptum, 17:21 02-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
У Девок в OnCustomDrawCell есть ADone. Что это и надо ли его использовать?

Нужно хелп почитывать
ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_TcxCustomGridTableView_OnCustomDrawCell.htm

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

Так никто и не заставляет. Вставлять нужно не в AdsTable1, а в DataController TableView.
Как ваш AdsTable1 определяет уникальность той или иной записи. Без уникальности (Первичного ключа) вы не сможете редактировать, удалять записи. Насколько я помню, в dbf есть специальное поле, которое создается автоматически и отвечает за уникальность. Вот его и возьмите с AdsTable1 и поместите в грид. Visible и VisibleForCustomization этому полю можно сделать false.
Вот по этому значению и определяйте индекс записи.

Цитата:
Просто я не думал, что такая простая операция, как подсветка удаленных записей вызовет такие танцы с бубном

Таблица умножения тоже кажется танцами с еще теми бубнами когда видишь ее первый раз и не пытаешься понять как это работает.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 18:55 02-04-2009 | Исправлено: vladman, 18:59 02-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как ваш AdsTable1 определяет уникальность той или иной записи. Без уникальности (Первичного ключа) вы не сможете редактировать, удалять записи. Насколько я помню, в dbf есть специальное поле, которое создается автоматически и отвечает за уникальность.

Нет в dbf такого специального поля. Первичный ключ может быть, а может и не быть. Поля autoincrement в dbf тоже нет. И без униального ключа прекрасно редактируются, удаляются и добавляются записи.

Цитата:
Таблица умножения тоже кажется танцами с еще теми бубнами когда видишь ее первый раз и не пытаешься понять как это работает.

Согласен. Но, согласитесь, таблицу умножения (EHLib) выучить  и понять гораздо проще, чем таблицы Брагиса (Девки)

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 02:23 03-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
Я не могу просто так взять и добавить в чужую базу поле  

извините погорячился vladman меня поправил
добавить поле в гриду
Цитата:
DataController TableView.

хотя думаю Вам хватит индекса грида  

Цитата:
Остался лишь косяк с тем, что при повторном удалении подсветка не убирается (а должна)  

как это - повторное удаление ?

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 08:32 03-04-2009 | Исправлено: greenpc, 08:35 03-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc

Цитата:
как это - повторное удаление ?

Ну вот так - в dbf-файлах записи из базы фактически не удаляюстя, они толко помечаются на удаление. В любом датасете, который работает с dbf-файлами можно настроить - показывать такие удаленные записи или нет. Т.е. если НЕ показывать, то для пользователя визуально происходит удаление записи, но на самом деле она в базе остается. Для того, чтобы физически удалить такие записи из dbf-файла используется процедура упаковки таблицы. А вот если настроено, чтоб показывать удаленные записи, то визуально в гриде запись при удалении как была, так и остается, вот я и подсвечиваю их красным, чтоб видно было. Но самое интересное, если такую "удаленную" запись еще раз удалить т.е. нажать в гриде Del или Ctrl+Del - ее мона восстановить - такой простенький undo/redo  
Вот как-то так.
Теперь что у меня получилось: после
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
 OldC: TColor;
begin
 if AdsTable1.Active then
 begin
  oldc:=ACanvas.Canvas.Brush.Color;
  aa:=  AViewInfo.GridRecord.RecordIndex+1;
  if AdsTable1.AdsIsRecordDeleted(aa) then
    ACanvas.Canvas.Brush.Color := clRed
  else
   ACanvas.Canvas.Brush.Color:=oldc;
end;
у меня удаленные записи подсвечиваются. Все замечательно. Если не неподсвеченной (неудаленной) записи нажать дел, она удаляется (сразу подсвечивается красным), а вот если повторно нажать Delete, подсветка не убирается (это я протупил, надо же обработать этот и восстановить запись). Для этого сделал следующее - у Table-компонента в событии AfterDelete прописал:
  if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) //проверил - типа удалена запись?
    then
     begin
        AdsTable1.AdsRecallREcord; // Это и есть восстановление записи
        AdsTable1.AdsRefreshRecord; //Обновил запись
   end;
 
После этого стало наоборот - если нажать Del на подсвеченной (удаленной) записи - она восстанавливается (подсветка убирается), а вот если попытаться удалить запись - она не удаляется, не пойму, в чем косяк.  

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 09:37 03-04-2009 | Исправлено: Postscriptum, 09:54 03-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
а вот если попытаться удалить запись - она не удаляется, не пойму, в чем косяк
событие какое ???
Цитата:
AfterDelete  

вы удалили запись, дальше
Цитата:
if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum)  
 убедились что она удалена
и Восстановили ее .  
 
вориант:создайте глобальную переменную
на событие onBeforeDelete проверьте  <перемен> :=AdsIsRecordDeleted
а на AfterDelete добавьте if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) and (<перемен>)
PS:Научитесь пользоваться точками остановки- очень облегчит жизнь

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 10:08 03-04-2009 | Исправлено: greenpc, 10:23 03-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
Нет в dbf такого специального поля. Первичный ключ может быть, а может и не быть. Поля autoincrement в dbf тоже нет. И без униального ключа прекрасно редактируются, удаляются и добавляются записи.  

Да не может в таблице существовать двух и более одинаковых записей. Уникальность обеспечивается первичным ключом. Первичный ключ может быть как простой, так и составной (состоять их нескольких полей). И у dbf этот первичный ключ обязан быть. Может он имеет какое-то другое название, но без него никак.
Например, есть таблица с двумя полями *Имя* и *Фамилия*. Вы вставили в эту таблицу две записи со значениями *Василий*, *Пупкин*. Теперь хотите одну из низ удалить. Скажите, как драйвер БД поймет какую из них вы собираетесь удалять если для него (драйвера) они абсолютно одинаковы? Уверен, что внутри есть какой-то неявный механизм идентификации этих записей. Вот его и используйте в раскрашиваниях.
Об этом как раз говорит
Цитата:
AdsTable1.AdsGetRecordNum
.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 11:07 03-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Может в dbf файлах может не существовать ключей вообще
информация о структуре хранится в заголовке
и переход на нужную запись осуществляется смещение относительно начала файла

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:15 03-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc

Цитата:
Может

Ну может так может. Спорить не буду. Я с dbf сталкивался раз и совсем давно .

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 11:40 03-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc

Цитата:
вориант:создайте глобальную переменную  
на событие onBeforeDelete проверьте  <перемен> :=AdsIsRecordDeleted  
а на AfterDelete добавьте if AdsTable1.AdsIsRecordDeleted(AdsTable1.AdsGetRecordNum) and (<перемен>)  

Умные люди думают одинаково. Так и сделал в итоге, а потом пост прочитал Теперь все прекрасно работает.

Цитата:
PS:Научитесь пользоваться точками остановки- очень облегчит жизнь

Зачем так зло? Точками останова (так они правильно называются) пользуюсь с 1990 года

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 18:59 03-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очередной вопрос по гриду из Девок.
Подскажите, как правильно работать с выделенными строками? Например, мне нужно скопировать выделенные строки в файл. Делаю так:
 
 book:=cxGrid1DBTableView1.Controller.SelectedRowCount;
  if Book > 1 then
 begin
   for i := 1 to Book-1 do
  begin
    AdsTable1.RecNo:=cxGrid1DBTableView1.Controller.SelectedRows[i].RecordIndex;
     тут необходимые действия
  end;
 
Все вроде хорошо, но почему-то так не работает с последней строкой в выделении, а если сделать цикл for i := 1 to Book do - пишет ListIndex out of bounds.
Пришлось сделать после цикла
  AdsTable1.Next;
   тут опять необходимые действия
  cxGrid1DBTableView1.Controller.ClearSelection;
Так работает, но меня смущает такой подход.  
P.S. Встроенного в Delphi help'а у меня нет, только скачанный с стайта в chm-ках. Там вообще мизер написано.

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 14:12 04-04-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Postscriptum

Цитата:
Очередной вопрос по гриду из Девок.

Во-первых,
for i := 1 to Book-1 do заменить на  
for i := 0 to Book - 1 do
 
Во-вторых,
Проверить, как нумеруются AdsTable1.RecNo: c 1 или 0? RecordIndex - c 0.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 15:22 04-04-2009 | Исправлено: vladman, 15:30 04-04-2009
Postscriptum



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Точно!
Так заработало:
 
book:=cxGrid1DBTableView1.Controller.SelectedRowCount;  
 if Book > 1 then  
 begin  
   for 0 := 1 to Book-1 do  
  begin  
    AdsTable1.RecNo:=cxGrid1DBTableView1.Controller.SelectedRows[i].RecordIndex+1;  
     тут необходимые действия  
  end;
 end;
Сенкс. Это самый оптимальный способ работать с выделением?

Всего записей: 464 | Зарегистр. 31-01-2004 | Отправлено: 17:54 04-04-2009
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Подскажите, как правильно работать с выделенными строками?

в прошлых темах уже это обсудили не раз, воспользуйтесь поиском
В шапке есть Первая и Вторая части, в них поищите. Уверен, что во второй части есть.

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 19:01 04-04-2009
Kim006



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть пару вопросов по гриду,  
не люблю спрашивать но уже несколько дней не могу решить:
 
1. Как сделать следующее:        
 
//это совсем не катит, может можно както по другому:
TcxGridTableView *  AView = (TcxGridTableView *) cxGrid1->FocusedView;
 for(int Clp=0;Clp < AView->ColumnCount;Clp++)
 {
  if((AView->Columns[Clp]->GetAlternateCaption()) == "_XXX_")
  {
     if(! AView->Items[Clp]->EditValue.IsNull())
     Memo1->Lines->Add(AView->Items[Clp]->EditValue );
   break;
  }
 }
 
т.е. получить индекс колонки в TableView зная ее заголовок "_XXX_";
 
---------------
 
2. В обработчике cxGrid1LayoutChanged узнать что запись была удалена
(не охото отслеживать колич записей в гриде) наверняка есть какая стандартная
фича типа ->DataController->IsEditing...
 
---------------
QuantumGrid 6, Borland C++ 6

Всего записей: 16 | Зарегистр. 04-04-2009 | Отправлено: 21:37 04-04-2009
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)
ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru