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

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

Автор: brookson
Дата сообщения: 25.02.2009 14:31
vladman
Хм, возвращаясь к вопросу о гриде с чекбоксами, в котором надо отметить записи. Странная штука. У созданного столбца Properties=CheckBox, AllowGrayed=False; DisplayChecked=True; DisplayUnchecked=False; NullStyle=nssUnchecked; ValueChecked=True; ValueUnchecked=False.
Это я так перечисляю на всякий случай.
Так вот, все неотмеченные ячейки имеют значение tview.DataController.Values[i,0]=Null, а не False, как я ожидал.
Нетрудно конечно на FormCreate повесить поцедуру заполнения этих значений в False, но мне казалось оно должно быть априори False.
Кстати, если мышкой отметить, а затем убрать отметку, значение поля таки становится False.
Подскажите, где я неправ?
Автор: f3ka
Дата сообщения: 25.02.2009 14:58
brookson
все правильно... т.к. колонка Unbound то по дефолту заполняется Null'ами... а после кликов туда конечно же ставиться нормальное значение (True/False)...
Зачем на FormCreate вешать заполнение Fals'ами? почему при проверке просто не проверить на Null и на False? Null же просто означает что туда не кликали, а значит и не выбирали, что соответствует False... у меня было такое и я просто смотрел Null или False...
Автор: afiget
Дата сообщения: 25.02.2009 15:18

Цитата:
Подскажите, где я неправ?

Любой привязанный DB-контрол отображает то значение, которое хранится в источнике данных. Пока ты или компонент доступа к данным (если он умеет получать значения по-умолчанию с сервера) не изменишь значения, они так и остануться Null.
Автор: brookson
Дата сообщения: 25.02.2009 16:00
Ну, по сути да. Понимаю, почему Null, и действительно какая разница, Null или False. Одним условием вышло больше просто
Автор: X11
Дата сообщения: 25.02.2009 18:18
brookson так ты в дизайне присвой значение Falseи будет тебе по-умолчанию False, а не NULL.
Автор: vladman
Дата сообщения: 25.02.2009 18:24
brookson

Цитата:
Подскажите, где я неправ?


Подход f3ka 100% поддерживаю.

afiget

Цитата:
Любой привязанный DB-контрол отображает то значение...

В том то и дело, что brookson спрашивал как раз о поле (контроле) которое не привязано к источнику данных .
Автор: X11
Дата сообщения: 25.02.2009 19:20
У меня проблема с cxButton. Ввёл текст в Caption из трёх слов. WordWrap установил в true. Всё отлично, текст в 2 строки влазит на кнопку. Загрузил в кнопку картинку (bmp) и текст стал в одну строку
Это глюк или так задумано?
Dev 6.41, D2007
Автор: vladman
Дата сообщения: 25.02.2009 19:59
X11

Цитата:
Это глюк или так задумано?

Этот задуманный глюк девэкспрэсcы поставили в разряд Planned, т.е.
"Planned" indicates that we accepted the suggestion for implementation in one of the next updates
_http://www.devexpress.com/Support/Center/p/DS14008.aspx?searchtext=wordwrap+glyph&tid=dee0f498-9b49-42c9-bee9-5530e0ea67f6&pid=-1
Так что читайте what's new к новым релизам.

Но если не хочется ждать новых релизов, есть решение -


Код: procedure <YourForm>.FormCreate(Sender: TObject);
begin
<YourButton>.Caption := 'one' + #13#10 + 'two' + #13#10 + 'three';
end;
Автор: Nagaitsev
Дата сообщения: 25.02.2009 20:39
Доброе время суток. Пользую cxTreeList. Задача изменить цвет ячейки по клику мыши. Цвет меняю через CustomDrawCell вот так:

If (AViewInfo.Column.ItemIndex = MouseDownX)and(AViewInfo.RecordIndex = MouseDownY)
Then Begin
ACanvas.FillRect(AViewInfo.EditRect,clRed);
End;

Но как выудить MouseDownX и MouseDownY? Нужно что-то вроде MouseToCell
Автор: afiget
Дата сообщения: 25.02.2009 22:37
Nagaitsev
if AViewInfo.GridRecord.Focused then
if AViewInfo.Item.Focused then
...

Добавлено:
Внутри этих условий - текущая ячейка (которую кликнули).
Автор: X11
Дата сообщения: 25.02.2009 22:50

Цитата:
Этот задуманный глюк девэкспрэсcы поставили в разряд Planned, т.е.

ё-маё.... с с 2006-го года глюк тянется
Автор: afiget
Дата сообщения: 26.02.2009 00:24
Да у них подобных глюков, к сожалению, вагон и маленькая тележка...

Чем больше функциональность такого кол-ва продуктов, тем сложнее их поддерживать в актуальном состоянии.
Автор: jicoff
Дата сообщения: 26.02.2009 12:25
Nagaitsev

Текущее положение курсора мыши - GetCursorPos
Автор: Nagaitsev
Дата сообщения: 26.02.2009 15:03
У cxTreeList нет функции GetCursorPos, и AViewInfo.GridRecord тоже отсутствует

Добавлено:
Но нашел проще, AViewInfo.Focused... но выделяется вся строка. Че-то не могу найти как выделить только ячейку...
Автор: jicoff
Дата сообщения: 26.02.2009 16:09
Nagaitsev

Вообще-то функция GetCursorPos не относится к классу, разве что только к namespace. Информацию можно посмотреть в хелпе.
Автор: Nagaitsev
Дата сообщения: 26.02.2009 16:56
Нашел!!!!!!!!!!

ловлю CustomDrawCell


If AViewInfo.Focused and dxTreeList1.Columns[AViewInfo.Column.ItemIndex].Focused
Then ACanvas.FillRect(AViewInfo.EditRect,clRed);

работает...

А текущие координаты можно взять из AViewInfo.Column.ItemIndex и AViewInfo.RecordIndex
Автор: Meister_Floh
Дата сообщения: 26.02.2009 19:50
Господа.. А вот интересный момент какой, может кто сталкивался.. Есть таблица подготовленная для TdxDBTreeView.. Заранее не известно сколько там будет записей.. Девочки рекомендуют включать смарт рекорд, если кол-во записей > 1000. С этим все понятно можно в форм криэйт анализировать.. А вот если предположим делать импорт в таблицу - что лучше? Включать смарт рекорд сразу, или ждать пока 1000 элементов достигнет, а включать потом? Какая вставка работает быстрее, со смартом или без него??
Автор: vladman
Дата сообщения: 26.02.2009 20:35
Meister_Floh

Цитата:
Какая вставка работает быстрее, со смартом или без него

Инсертить то будете не в TreeView а в таблицу БД. Посему без разницы, НО
1. перед началом инсерта - DisableControls у датасета в который вы инсертите;
2. после инсерта - проверка количества записей в таблице и по результату определяемся с необходимостью смарт рекорд;
3. и наконец - EnableControls у того же датасета.


Код: <YourDataset>.DisableControls;
try
//DoInsert;
//DoCheckTotalRecordCount;
finally
<YourDataset>.EnableControls;
Автор: X11
Дата сообщения: 26.02.2009 22:02
Что это за смарт рекорд такой, что его нужно включать именно если записей >1000 И почему имеено 1000?
Автор: vladman
Дата сообщения: 26.02.2009 23:40
X11

Цитата:
Что это за смарт рекорд такой

TdxDBTreeView.Options
trSmartRecordLoad - DBTreeView uses the smart record loading feature.
[more=Smart Record Loading]
If your DataSet has more than 1,000 records, you should use the Smart Record load feature.


To apply the smart load, follow these steps:


1. Index (or order) the dataset by the PARENT field.

2. Set trSmartRecordLoad in Options.

3. Set the RootValue property to the PARENT value of your 'root' records. If you want to start with a particular record and not display all records in the DBTreeView , you should assign to the RootValue the value of the PARENT field of this particular record and set trCanDBNavigate to False.

4. Write the OnCreateNewKeyValue event handler. When the dxDBTreeView does not load all records, the Maximum KEY field value is incorrect. You have to get the maximum KEY value to the variable on form creation and use it when the user creates new tree nodes. Otherwise on creating a new tree node you may get a key violation error.


Smart record loading works in the following manner:


On activation of a dataset, the dxDBTreeView loads records which have a PARENT value equal to RootValue (Locate the first record whose parent Value equals RootValue and then fetch and load the records when the values of the PARENT field are equal. That is why your dataset has to be sorted by the PARENT field). Then dxDBTreeView loads records if necessary - on expand nodes and when the dxDBTreeView has to retrieve the full structure of the loaded tree node.
[/more]
Автор: Meister Floh
Дата сообщения: 27.02.2009 08:52
vladman
В том то и дело что инсертить буду прямо в дерево, потому, как читаю файло абсолютно не похожее на БД.. И анализировать предков до 5 (?) а то и более уровней вложенности тяжковасто будет.. А при инсерте в дерево использую рекурсивную функцию.. По большому счету это создание модели дерева клиентов.. Потому и интересует как себя ведет смарт-рекорд, вот сегодня уже откомпилю и померяю время как с смарт, так и без него.. И отпишусь о результатах..
Автор: X11
Дата сообщения: 27.02.2009 10:27
Я вспомнил. Я давно уже включил смартрекод. И у меня далеко не 1000 записей в таблице. Работает нормально.
Автор: vladman
Дата сообщения: 27.02.2009 14:10
Meister Floh
Уточнение понятно. Мое мнение таково, что исходя из механизма работы Smart record loading, при его установке вставка в дерево будет происходить тем дольше чем в большее количество различных веток будут добавляться новые элементы. Причина - fetch и загрузка записей из БД. При не установленном Smart record loading все записи уже будут загружены при первоначальном построении дерева.
Автор: X11
Дата сообщения: 27.02.2009 17:02
Есть cxGrid, в нём TcxGridTableView. Т.е. обычный грид без привязки к базе. Какой наиболее правильный и быстрый способ найти там что-нибудь.
Допустим, что там есть текстовая колонка. Нужно найти запись, содержащую заданный текст. Может быстрее будет проверить, есть ли строки у таблицы с таким-то текстом.
Дело в том, DataController не содержит ни locate, ни lookup.

А строк может быть в гриде очень много. Бежать пос строкам - это накладно.

Добавлено:
Странность какая-то.
Добавляю из текстового файла в грид строки. Нужно пропускать дубли.

Код:
Grid1.BeginUpdate;
....
For i :=0 to slFile.count - 1 do begin

if cboxSkipDuplicates.Checked then begin
iRecIndex := Grid1.DataController.FindRecordIndexByText(0, colText.Index, slFile[i], false, false, true);
if not VarIsNull(iRecIndex) and (iRecIndex > -1 ) then
ShowMessage(IntToStr(iRecIndex));
end;

....
Автор: afiget
Дата сообщения: 27.02.2009 18:29

Цитата:
Привязывать грид к MemTable не буду.

Отчего так категорично?

Добавлено:
Кстати, а потом с этими данными что делаешь? Если в базу, то какие компоненты используешь? Например, аналог MemTable он AnyDAC умеет делать уникальный ключ по колонке (случай дубликата можно обработать).
Автор: X11
Дата сообщения: 27.02.2009 18:44

Цитата:
Отчего так категорично?

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

Добавлено:

Цитата:
Кстати, а потом с этими данными что делаешь?

Потом пользователь просматривает таблицу, некоторые данные пихает в базу.

Добавлено:
Видать, придётся HashedStringList ещё в памяти держать. Вроде умные девки, а такое творят ((

Добавлено:
Ну вобщем передал пока что на использование THashedStringList (hsl)


Код:
if cboxSkipDuplicates.Checked then begin
if hsl.Find(slFile[i], iRecIndex) then Continue;
end;

Автор: afiget
Дата сообщения: 27.02.2009 21:04
Ну и нормально. По крайней мере, памяти меньше будет занимать, чем MemTable. Если данных много, то и скорость должна быть выше.
Автор: Meister Floh
Дата сообщения: 01.03.2009 12:05

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

Так вот господа.. Как и ожидалось со смартом наполнение таблицы работает:

медленно;
криво;
обработка post для таблицы просто утомляет

В итоге все таки для наполнения таблицы лучше писать обработчики работающие напрямую, хотя это и очень трудоемко.. Ну а отображение само собой работает быстро..
Автор: lorents
Дата сообщения: 01.03.2009 12:53
простите за тупой вопрос что такое DevExpress и "с чем его едят"?
если можно ссылку что это, желательно на русском?
Автор: deadbitch
Дата сообщения: 01.03.2009 13:39
Какая же это хрень ComboBox в VerticalGrid, убил час времени на осознание того, что там в принципе нельзя задать текущий item. Спрашивается - за что платятся деньги, за компоненты без самых простых свойств.

Сорри накипело. Пришлось юзать ImageComboBox.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


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