На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Подмена данных DBGrid? , ADO
    Никто не сталкивался с реализацией такой задачей: в dbgrid, связанной с базой с базой по ADO, необходимо заменять данные в некотором столбце, т.е. отображать не непосредственно считанные с базы данные, а, например, считанные и затем преобразованные некой процедурой?
    Заранее спасибо.
      Если используется к-л компонент TADOTable или TADOQuery, TADOStoredProc, то в них можно создавать вычисляемые поля , которые отображаются в DBGrid.
        Часть 4. Что можно поместить в DBGrid
        Наталия Елманова
        Компьютер Пресс - CD, 1999, N 5
        © Copyright N.Elmanova & ComputerPress Magazine.


        Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid:

        void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
        const TRect &Rect, int DataCol, TColumn *Column,
        TGridDrawState State)
        {
        if
        (Column->FieldName=="VenueNo")
        {
        DBGrid1->Canvas->Brush->Color=clWhite;
        DBGrid1->Canvas->FillRect(Rect);
        if (Table1->FieldByName("VenueNo")->Value==1)
        {
        DBGrid1->Canvas->Font->Color=clRed;
        DBGrid1->Canvas->TextOut(Rect.Right-2-
        DBGrid1->Canvas->TextWidth("our venue"),
        Rect.Top+2,"our venue");
        }
        else
        {
        DBGrid1->Canvas->TextOut(Rect.Right-2-
        DBGrid1->Canvas->TextWidth("other venue"),
        Rect.Top+2,"other venue");
        }
        }
        }

        Соответствующий код для Delphi имеет вид:

        procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
        DataCol: Integer; Column: TColumn; State: TGridDrawState);
        begin
        if (Column.FieldName='VenueNo') then begin
        with DBGrid1.Canvas do begin
        Brush.Color:=clWhite;
        FillRect(Rect);
        if (Table1.FieldByName('VenueNo').Value=1) then begin
        Font.Color:=clRed;
        TextOut(Rect.Right-2-
        DBGrid1.Canvas.TextWidth('our venue'),
        Rect.Top+2,'our venue');
        end else begin
        TextOut(Rect.Right-2-
        DBGrid1.Canvas.TextWidth('other venue'),
        Rect.Top+2,'other venue');
        end;
        end;
        end;
        end;

        Еще один пример - использование значков из шрифтов Windings или Webdings в качестве подставляемой строки.

        void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
        const TRect &Rect, int DataCol, TColumn *Column,
        TGridDrawState State)
        {
        if
        (Column->FieldName=="VenueNo")
        {
        DBGrid1->Canvas->Brush->Color=clWhite;
        DBGrid1->Canvas->FillRect(Rect);
        DBGrid1->Canvas->Font->Name="Wingdings";
        DBGrid1->Canvas->Font->Size=-14;
        if (Table1->FieldByName("VenueNo")->Value==1)
        {
        DBGrid1->Canvas->Font->Color=clRed;
        DBGrid1->Canvas->TextOut(Rect.Right-2-
        DBGrid1->Canvas->TextWidth("J"),
        Rect.Top+1,"J");
        }
        else
        {
        DBGrid1->Canvas->Font->Color=clBlack;
        DBGrid1->Canvas->TextOut(Rect.Right-2-
        DBGrid1->Canvas->TextWidth("F"),
        Rect.Top+1,"F") ;
        }
        }
        }

        Соответствующий код для Delphi имеет вид:

        procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
        DataCol: Integer; Column: TColumn; State: TGridDrawState);
        begin
        if (Column.FieldName='VenueNo') then begin
        with DBGrid1.Canvas do begin
        Brush.Color:=clWhite;
        FillRect(Rect);
        Font.Name:='Wingdings';
        Font.Size:=-14;
        if (Table1.FieldByName('VenueNo').Value=1) then begin
        Font.Color:=clRed;
        TextOut(Rect.Right-2-
        DBGrid1.Canvas.TextWidth('J'),
        Rect.Top+1,'J');
        end else begin
        Font.Color:=clBlack;
        TextOut(Rect.Right-2- DBGrid1.Canvas.TextWidth('F'),
        Rect.Top+1,'F');
        end;
        end;
        end;
        end;

        Сообщение отредактировано: Bas -
          А еще, у всех TField существует свойство DisplayText которое используется всеми визуальными компонентами чувствительными к данным (DataAware), в том числе и TDBGrid'ом. Т.е. TDBGrid выводит именно это свойство. В свою очередь, значение этого свойства по умолчанию равно значению из поля БД, с учетом свойства DisplayFormat (у кого оно есть). Но это по умолчанию.
          Реально-же, у всех TField есть событие OnGetText. Если оно определено для поля, то DisplayText этого поля будет возвращать то, что вернет OnGetText.
          Словами слишком запутанно smile.gif, проще на примере:
          Если поля созданы в дизайнере, то требуемому полю (например FFF) вешаем обработчик FFFOnGetText событию OnGetText.
          Если-же поля создаются динамически, то соответственно вешаем обработчик динамически.
          Пример обработчика:
          procedure FFFOnGetText (Sender: TField; var Text: String; DisplayText: Boolean);
          begin
           if  DisplayText  then  Text := AnsiUpperCase(Text);
          end;

          С таким обработчиком, в поле FFF DBGrid'а, все символы будут заглавными, вне зависимости какие они в БД.
          Естественно в БД они не меняются. При этом возникает интересный эффект. Если вы начнете редактировать поле FFF, то оно приобретет вид такой как в БД smile.gif, до тех пор пока Вы не закончите редактирование.
          Естественно это работает и для TDBEdit и пр.

          Этот способ удобно применять когда нужно выполнить только текстовое преобразование для отображения значения поля.
          Сообщение отредактировано: Петрович -
            Thanks!
              >Bas
              если сталкивался подскажи как избавиться от каждоразового щелканься по труе-фалсе? а делать через картинки
              >Петрович
              можно подробней про
              Цитата
              у всех TField есть событие OnGetText. Если оно определено для поля, то DisplayText этого поля будет возвращать то, что вернет OnGetText.
              Словами слишком запутанно , проще на примере:
              Если поля созданы в дизайнере, то требуемому полю (например FFF) вешаем обработчик FFFOnGetText событию OnGetText.

              у меня есть DBGrid, DataSources, где искать OnGetText? Если шелкнуть на DBGrid, то вижу перечень полей моей таблицы, но там нет Event-ов.
              Сообщение отредактировано: tomsksmile -
                Цитата
                tomsksmile, 13.02.04, 09:06
                у меня есть DBGrid, DataSources, где искать OnGetText? Если шелкнуть на DBGrid, то вижу перечень полей моей таблицы, но там нет Event-ов.

                Смотри глубже :).
                Твой DBGrid связан с DataSource, а DataSources связан с каким-либо DataSet'ом (в твоем случае либо ADODataSet, либо ADOTable, либо ADOQuery). Вот "щелкать" надо именно по нему (DataSet'у) - там будет список полей, по умолчанию пустой. Добавь туда все нужные тебе в гриде поля (правый клик -> Add fields). Теперь, встаешь на нужное тебе поле, и наступит счастье - в инспекторе увидишь его OnGetText.

                А еще, можно в хелпе поискать OnGetText :).
                  На твой вопрос посмотри здесь Что можно поместить в DBGrid
                  Если не поможет то -
                  Можно использовать словарь атрибутов полей (Dictionary)

                  Добавлено в :
                  Петрович :
                  У меня поле int можно ли через OnGetText(|| чтото) дать возможность вводить и показывать число 15835.25 а в базу записать 1583525
                  Не используя (Mask)Edit.
                  Сообщение отредактировано: Bas -
                    Цитата
                    Bas, 14.02.04, 12:08
                    У меня поле int можно ли через OnGetText(|| чтото) дать возможность вводить и показывать число 15835.25 а в базу записать 1583525


                    Легко. Для показывать используй OnGetText а для вводить используй OnSetText
                      >Basпосмотрел ссылку... спасибо. Рисовать в гриде я научился, но вот ка избавиться от старого списка? Раньше в поле был просто список false/true, теперь поверх списка рисую по канве, но смене статуса все равно нужно работать со списком. Как изловчиться, чтобы просто шелкать по груди без выбора списка?
                        ButtonStyle=cbsNone
                          действительно список пропал :(, но теперь приходиться вводить руками true/false...
                          а хотелось бы просто щелкать по полю...
                            Подробней, если можно.
                            ButtonStyle дает возможность выбора (или нет из допустимых значений)
                            из PickList.
                            У меня поле int(bool) при OnClick(On...) pole1=!pole1 и подставка галочки в зависимости от значения поля.
                              у меня есть DbGrid, построенный на основе ADOTable.
                              В таблице есть поле, которое принимает true/false. Хочу чтобы в гриде на месте этого поля были галочки при true в таблице... Сейчас у меня чтобы поставить галочку нужно в гриде (в соответстующем поле грида) открыть список и выбрать true. Спрашиваю как сделать так, чтобы галочка снималась/выставлялась шелчком мыши. Я не пойму, что за событие OnClick?
                                У DBGrid есть событие OnCellClick по нему меняеш значение нужного тебе поля у текущей записи.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0414 ]   [ 16 queries used ]   [ Generated: 17.03.26, 15:31 GMT ]