Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > OnGetText


Автор: Akella 18.1.2006, 10:08
В таблице есть поле
Код

CREATE TABLE APART (
    ID                     "INT" NOT NULL /* "INT" = INTEGER */,
    ...
    IS_PHONE               BOOL /* BOOL = VARCHAR(1) DEFAULT 'F' */,
...


т.е. в поле записывается или F, или T

в коде пытаюсь сделать такое:

Код

procedure TDM.fibdsApartSearchIS_PHONEGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  if text = 'T' then
  text := '+';

  if text = 'F' then
  text := '-';
end;


т.е. хочу, что пользователь видел не 'T' или 'F', а '+' или '-', ну или Да-Нет, не важно

в поле есть значения и 'T' и 'F', но в сетке все ячейки этого поля пустые

хотя другое поле, где записывается 0 или 1 - все нормально, т.е. в сетку выводится 'Да' или 'Нет'.

Автор: neat 19.1.2006, 06:13
Используйте OnSetText.
Код

rocedure TDM.fibdsApartSearchIS_PHONESetText(Sender: TField; const Text: String);
begin
    if text = 'T' then
       fibdsApartSearchIS_PHONE.AsString := '+';

   if text = 'F' then
      fibdsApartSearchIS_PHONE.AsString := '-';
end;

Автор: Akella 19.1.2006, 09:01
neat, на сколько я знаю, то OnSetText используется при записи в таблицу, а мне нужно при чтении из таблицы

Автор: neat 19.1.2006, 11:01
Тогда так
Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if Column.FieldName = 'название_колонки' then
    with DBGrid1.Canvas do begin
      if fibdsApartSearchIS_PHONE.Value = 'F' then begin
        Brush.Color := clWhite;
        FillRect(Rect);
        TextOut(Rect.Left + 2, Rect.Top + 2, '-');
      end;
      if fibdsApartSearchIS_PHONE.Value = 'T' then begin
        Brush.Color := clWhite;
        FillRect(Rect);
        TextOut(Rect.Left + 2, Rect.Top + 2, '+');
      end;
    end;
end;

Автор: Akella 19.1.2006, 11:15
нет, так не пойдет, т.к. к таблице подключено несколько сеток (такая специфика) и в каждой сетке прописывать это событие?

Автор: SergeBS 19.1.2006, 11:38
Akella
Цитата

нет, так не пойдет, т.к. к таблице подключено несколько сеток (такая специфика) и в каждой сетке прописывать это событие?

Тогда делай вычисляемое поле. А с T/F прячь. Все равно, если редактировать надо, то будешь иметь некоторые стандартные проблемы.
И вообще на эту тему есть статья Разноцветный DBGrid на DelphiKingdom. Ничего отличного от того, что там есть, не придумаете.
Заодно узнаешь, как обойтись одним обработчиком на все сетки. А прописывать обработку все равно придется. Или делай компонент/фрейм с уже прописанной обработкой.

neat
2-й if нафиг не нужен. Вся строка с ним заменяется на else begin ...


Автор: Akella 19.1.2006, 11:55
про сетку я знаю, мне нужно именно OnGetTex
блин, но в соседнем же поле нормально отрабатывается
Добавлено @ 11:58
вопрос открыт

Автор: neat 19.1.2006, 12:06
Вот похоже то, что тебе требуется
Код

procedure TDM.fibdsApartSearchIS_PHONEGetText(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
if DisplayText then begin
  if Sender.Value = 'F' then
   text := '-' 
  else
    text := '+';
end else
  text := Sender.AsString;
end;

Автор: Alex 19.1.2006, 16:24
Как я узнал замену нужно сделать при отображении данных в DBGridEh, а там это делается в течении 10 секунд. У каждой колонки есть свойства: KeyList и PickList. Соответственно в KeyList добавляем две строки:
Цитата

F
T

В PickList тоже две строки:
Цитата

-
+

Теперь при редактировании данных из грида в базу будут записывать F/T, а отображать -/+

Автор: Akella 19.1.2006, 16:41
да, так работает, но хочу через OnGetText

Автор: Akella 19.1.2006, 17:06
Код

    case
        WHEN (A.IS_PHONE = 'F') THEN '-'
        WHEN (A.IS_PHONE = 'T') THEN '+'
        ELSE '?'
    end as IS_PHONE,


сделал так, спасибо Алексу (+)

Автор: Alex 19.1.2006, 17:12
Akella, Только забыл упомянуть, что это в синтаксисе Firebird 1.5 и выше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)