Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Несколько вопросов по StringGrid [D7, XP]


Страницы:   1 2 3 4 5

uno-84 ©   (2008-07-02 08:41:00) 

Здравстуйте! У меня несколько вопросов по StringGrid, я добавляю в него записи

with StringGrid1 do
          begin
             RowCount := k+1;
             for i := 1 to RowCount do
             begin
                  if FieldByName('MESSAGE_IMPORTANCE').AsString = 'T' then StringGrid1.Cells[0, i] := '!' else StringGrid1.Cells[0, i] := '';
                  if FieldByName('MESSAGE_ATTACH_COUNT').AsInteger > 0 then StringGrid1.Cells[1, i] := FieldByName('MESSAGE_ATTACH_COUNT').AsString
                     else StringGrid1.Cells[1, i] := '';    
                  if FieldByName('MESSAGE_ORIGINALMSG').AsString > '' then StringGrid1.Cells[2, i] := 'Ответ' else StringGrid1.Cells[2, i] := '';
                  if FieldByName('MESSAGE_NOTIFY').AsString = 'T' then StringGrid1.Cells[3, i] := '+' else StringGrid1.Cells[3, i] := '-';
                  if FieldByName('MESSAGE_TYPE').AsString = 'R' then StringGrid1.Cells[4, i] := 'Извещение о прочтении'
                     else
                     begin
                          if FieldByName('MESSAGE_WORK_TYPE').AsString = 'T' then
                          begin
                          StringGrid1.Cells[5, i] := FieldByName('MESSAGE_WORK_PRO').AsString + '%';
                          StringGrid1.Cells[4,i] := 'Служебное задание';
                          end
                           else
                           begin
                           StringGrid1.Cells[4, i] := 'Обычное сообщение';
                           StringGrid1.Cells[5, i] := '';
                           end;
                     end;

                  StringGrid1.Cells[6, i] := FieldByName('USER_NAME1').AsString;
                  StringGrid1.Cells[7, i] := FieldByName('MESSAGE_RECIPIENTS_NAMES').AsString;
                  StringGrid1.Cells[8, i] := FieldByName('USER_NAME').AsString;
                  StringGrid1.Cells[9, i] := FieldByName('MESSAGE_SUBJECT').AsString;
                  StringGrid1.Cells[10, i] := FieldByName('MESSAGE_SEND_DATE').AsString;
                  StringGrid1.Cells[11, i] := FieldByName('MESSAGE_RECEPT_DATE').AsString;
                  StringGrid1.Cells[12, i] := FieldByName('MESSAGE_READ_DATE').AsString;
                  StringGrid1.Cells[13, i] := FieldByName('MESSAGE_ID').AsString;
            Next;
            end;
1. Можно ли вставить в StringGrid1.Cells[14, i] CheckBox и как отслеживать поставлен чек или нет?
2. В Cells[5, i] нежен прогресс бар или что-то в этом роде, для визуального представления процента?
3. Как сделать так что-бы записи писались по центру ячейки?
Подскажите пожалуйста.
Заранее спасибо


Sergey13   (2008-07-03 10:29:00) [21]

> [61] Anatoly Podgoretsky ©   (03.07.08 10:23)
> Мы вроде про StringGrid говорим? Не так ли?

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

Потому и предлагал _Guest_у организовать свою ветку с нормальным описанием условий.


Anatoly Podgoretsky   (2008-07-03 10:23:00) [22]


> Данных в гриде нет.

Мы вроде про StringGrid говорим? Не так ли?


MsGuns   (2008-07-03 10:22:00) [23]

>_Guest_   (03.07.08 10:10) [57]

Все, что описано, достаточно просто (хотя и не без некоторой громоздкости) реализуется в событии отрисовки ячеек. Однако есть одно НО. Судя по всему объекты, отображаемые в сетке, не линейны и имеют определенную структуру, которая может быть частью другой структуры. В этом случае не обойтись без объектов. Надо создать объект-рекорд или объект-класс, куда предварительно запихать все данные, включая внешние ссылки (парент и чилдкаунт например). Адреса всех объектов положить в список, из которого и заполнять сетку. В этом случае брать данные для нужной отрисовки код обработчика будет не из ячеек сетки, где по понятным причинам отображается явно не вся "внутренность" объекта, а из его экземпляра, индекс адреса которого в списке легко определяется по номеру строки сетки


Anatoly Podgoretsky   (2008-07-03 10:21:00) [24]

> _Guest_  (03.07.2008 10:10:57)  [57]

Группировка - это что?


Sergey13   (2008-07-03 10:19:00) [25]

> [57] _Guest_   (03.07.08 10:10)

Почему то мне кажется, что твоя задача идеально решается в екселе.
Ты все хочешь из грида сделать некий инструмент для манипулирования данными. А он изначально предназначен только для их визуализации. Данных в гриде нет.


_Guest_   (2008-07-03 10:10:00) [26]

Ладно, раз обсуждение худо бедно идет, то продолжим. Посылы MsGuns © поняты и приняты к сведению.
Вопрос: как можно в гриде реализовать простенькую группировку строк по одному фиксированному столбцу? БД нет, столбцов с десяток, строк около 30, максимум 50. Количество уровней вложенности теоретически не ограничено, практически же 2-4. Сортировки и поиски не требуются. Это что то вроде плана работ с вычислением время- и трудозатрат и отслеживанием финансирования.


Игорь Шевченко   (2008-07-03 09:54:00) [27]

clickmaker ©   (03.07.08 09:34) [55]


> Насчет "чем плохо редактировать в гриде".
> Если объект сильно структурированный, т.е. свойства можно
> разложить по категориям, то ИМХО его удобней редактировать
> в модальной форме с закладками.
> Можно, конечно, и в гриде замутить группирование подзаголовков,
>  но во-первых, стандартный грид этого не умеет, во-вторых,
>  при большом количестве полей все равно не наглядно.


Марксизм не догма, а руководство к действию. Почему из-за неудобства редактировать сложный объект с закладками в гриде делается вывод о неудобстве редактирования в гриде вообще чего-либо, я не совсем понимаю.
Кстати, в той же упоминаемой неоднократно MsMoney в гриде есть гайка - редактировать отдельно или в гриде. Но при том, никаких модальных форм в ней не появляется, просто внизу открывается подвал для редактирования (кстате, с закладками), и если тебе вольно покинуть страницу в гриде, то ты ее, соответственно, покидаешь (правда можешь вернуться назад и продолжить редактирование). А не вернулся - считается, что нажал на кнопку Cancel. Работать весьма удобно.


clickmaker   (2008-07-03 09:34:00) [28]

Насчет "чем плохо редактировать в гриде".
Если объект сильно структурированный, т.е. свойства можно разложить по категориям, то ИМХО его удобней редактировать в модальной форме с закладками.
Можно, конечно, и в гриде замутить группирование подзаголовков, но во-первых, стандартный грид этого не умеет, во-вторых, при большом количестве полей все равно не наглядно.
К тому же, в форме проще делать валидацию, обозначать обязательные поля и все такое прочее.


Sergey13   (2008-07-03 08:48:00) [29]

> [51] _Guest_   (02.07.08 17:07)

Лучше здесь. Тем более, что обсуждение худо бедно идет.


MsGuns   (2008-07-02 17:32:00) [30]

И вдогонку о компонентах.

Тут принято советовать всяческие сторонние компоненты, часто действительно хорошие и реально упрощающие разработку приложений (особенно интерфейсной части). Но я бы прежде чем "скачать, установить и не мучиться" подумал бы о последствиях - как только Вы используете сторонний компонент в своем проекте, с этого момента он перестанет компиллиться без этой библиотеки. А если таких библиотек - эн штук ? Ничего страшного, конечно, но только до тех пор, пока Вы проектируете в ЭТОЙ ДЕЛЬФЕ и на ЭТОМ ПК. Любой "переезд" чреват тем, что все Ваши распрекрасые проекты вместе с расудесными гридами, овальными кнопками и прозрачными "под мыльную пену" панельками станут просто не редактируемы. И для их "оживления" надо будет доустановить все библиотеки, компоненты которых Вы использовали в проекте.
Другими словами, если используемая Вами среда суть что-то постоянное (например, в отделе, где Вы работаете, эти компоненты являются частью стандарта) либо разрабатываемый проект "разовый" - сделал-отдал-забыл, тогда смело пользуйтесь. В других случаях я бы советовал поостеречься.


MsGuns   (2008-07-02 17:22:00) [31]

Вот примерная схема использования мною гридов, "устаканенная" за 6 лет работы:

Таблица, редактируемая в манере экселя (неважно, связанная напрямую с БД или нет) и неограниченная по размерам - TClientDataSet. Полный сервисный "фарш" (поиски, фильтрции,сортировки)

Таблица, редактируемая по принципу "объекта" (т.е. начал редактировать один объект - закончи) и отображающая данные ОДНОЙ ТАБЛИЦЫ БД (например, плоский справочник) - TDBGrid с ReadOnly = false. Сервисный "фарш"

То же самое, но с требованием управления транзакциями (контролем непосредственной записи данных в БД) - TDBGrid с ReadOnly = true и редактирование записей-объектов БД в модальном окне через обычные не DB-Aware контролы. Сервисный "фарш"

Небольшая по размерам таблица (до 1000 записей) для отображения чего-то в основном не  связанного с БД с возможностью или без редактирования в сетке. Всякие прибамбасы типа картинок, прогресбаров, чекбоксов, кнопок, комбобоксов и прочего, как "фантомные" (т.е. появляющиеся лишь при получении ячейкой фокуса и рисуемые прямо поверх ячейки), так и обычные, рисуемые в каждой строке. Из сервиса - по минимуму и только в особых случаях (например, при отображении списка файлов) - TStringGrid

То же, но с графическими наворотами ("хитрые" или простые деревья, шаблоны, массивы и т.д.) -
TDrawGrid. Как правило, сервис не требуется

И еще. Для того чтобы реализовать поиск или сортировку в стрингриде хотя бы сопоставимую по скорости с ДБгридовой, надо очень хорошо попотеть. Поэтому в большинстве случаев достаточно вместо этого просто его (ДБгрид) и юзать


_Guest_   (2008-07-02 17:07:00) [32]


> Sergey13 ©   (02.07.08 16:56) [50]
> Зато можно положить рядом два отдельных (при том возможно
> и бесплатных) компонента. 8-)

Сергей, можно об этом в аське, а то правда некрасиво, тема то чужая?


Sergey13   (2008-07-02 16:56:00) [33]

> [49] _Guest_   (02.07.08 16:44)
> Ответ по компонентам, совмещающим свойства таблицы и дерева,
> я получил - бесплатного нет

Зато можно положить рядом два отдельных (при том возможно и бесплатных) компонента. 8-)


_Guest_   (2008-07-02 16:44:00) [34]


> Sergey13 ©   (02.07.08 15:18) [48]
>Вообще-то недурно бы, ИМХО, завести СВОЮ
> ветку со СВОИМ вопросом. Хватит чужой топик насиловать.
> 8-)В своем топике желательно обстоятельно рассказать про
> условия задачи, используемую СУБД и ь.д. и т.п.

Да я еще в [30] предлагал переместиться куда-нибудь чтобы обсудить условия работы и финансы :). Ответ по компонентам, совмещающим свойства таблицы и дерева, я получил - бесплатного нет, про БД я ничего не говорил. Интересен Ваш [23], но там, в общем, все понятно. Спасибо за полезно и приятно проведенное время, пошел работать.


Sergey13   (2008-07-02 15:18:00) [35]

> [43] _Guest_   (02.07.08 12:11)
> Может натолкнете на идею, задача такова:

Вообще-то недурно бы, ИМХО, завести СВОЮ ветку со СВОИМ вопросом. Хватит чужой топик насиловать. 8-)
В своем топике желательно обстоятельно рассказать про условия задачи, используемую СУБД и ь.д. и т.п.


Anatoly Podgoretsky   (2008-07-02 15:12:00) [36]


> Ega23 ©   (02.07.08 11:21) [29]

За ваши деньги выполним любой каприз :-)


_Guest_   (2008-07-02 12:23:00) [37]


> Ega23 ©   (02.07.08 12:17) [44]
> > _Guest_   (02.07.08 12:11) [43]У TTreeNode есть свойство
> Data, куда можно положить указатель на что угодно. Например,
>  PInteger, по адресу которого лежит значение ключевого поля
> набора данных.Также у TTreeView есть событие OnChangeNode.
> Также у TTreeVew есть свойство Selected.

Это, в общем то понятно, визуально как синхронизировать? Выровнять высоты и отслеживать верхний видимый элемент?


_Guest_   (2008-07-02 12:18:00) [38]


>Ega23 ©   (02.07.08 12:00) [41]
>А ты зарегистрируйся и
> в анкету данные введи. Тогда всем будет понятно какой ты
> - молодой или старый. :)

Да точно помню, что пару-тройку лет назад регистрировался, мыло не менялось, сейчас поискал по нему - нету. А бываю здесь редко и, как правило, читателем. Надо будет еще раз зарегистрироваться.
>Ну моё дело предложить...
>  :)

Так и за это спасибо :)


Ega23   (2008-07-02 12:17:00) [39]


> _Guest_   (02.07.08 12:11) [43]


У TTreeNode есть свойство Data, куда можно положить указатель на что угодно. Например, PInteger, по адресу которого лежит значение ключевого поля набора данных.
Также у TTreeView есть событие OnChangeNode.
Также у TTreeVew есть свойство Selected.


_Guest_   (2008-07-02 12:11:00) [40]

О-о! я тут пост один интересный для себя пропустил:
> Sergey13 ©   (02.07.08 10:47) [23]
> > [18] _Guest_   (02.07.08 10:35)> Мне не хватает только
> дерева с узлами в одном из столбцов.Это, ИМХО, немножко
> странное желание. Обычно (из того что я видел разумеется)
> грид привязывают к дереву в качестве рядом стоящего детализирующего
> прибамбаса. И это мне кажется логичным. Но вот показывать
> конкретно в гриде несколько деревьев - это как минимум дорого
> с точки зрения вычислений. В этом случае более логично сбоку
> (можно снизу 8-) от грида воткнуть какой-нибудь деревянный
> компонент и, лучше, если он будет срабатывать по отдельной
> кнопке.

Может натолкнете на идею, задача такова:
есть некие действия(задачи), каждое из которых может иметь подзадачи. Для этого нужно дерево. Все они имеют довольно много свойств, которые необходимо редактировать, таблица для этого необязательна, но можно в ней, а дальше из свойств подзадач вычисляются свойства их родителей и так вплоть до верхнего уровня. Пользователю хочется видеть сразу все элементы и все их свойства и тут же их менять. Если использовать связку дерева с таблицей, то я не могу придумать как их синхронизировать. Красиво, по крайней мере у меня, не получается. Набор свойств от уровня вложенности не зависит. Таблица мне кажется нагляднее, но если есть идеи буду благодарен.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо