Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2011, 15:06
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию DBGrid и Hint

Доброго времени суток!

Помогите, пожалуйста, решить проблемку: нужно содержимое ячеек вывести в Hint... Реализовано, НО: экран постоянно мерцает + нельзя перейти к нижним записям, не убирающимся на экран, особенно при использовании колесика мыши (как бы выталкивает наверх, в область, ограниченную экраном)


Код:
  private
 procedure AppMess(var Msg: TMsg; var Handled: Boolean);

    { Private declarations }
  public
Код:
procedure TfmChild1.AppMess(var Msg: TMsg; var Handled: Boolean);
var
  X, Y: integer;
  gpt: TGridCoord;
  s: string;
  w, len: integer;
begin
  if Msg.message=WM_MOUSEMOVE then
  begin
    if Msg.hwnd=DBGrid1.Handle then
    begin
      x:=LoWord(Msg.lParam);
      y:=HiWord(Msg.lParam);
      gpt:=DBGrid1.MouseCoord(x,y);
      if (gpt.x>0) and (gpt.y>0) then
      begin
        DataSource2.DataSet.First;
        DataSource2.DataSet.MoveBy(gpt.y-1);
        s:=FmMain.ADOQuery1.Fields[gpt.x-1].asString;
        w:=DBGrid1.Columns[gpt.x-1].Width;
        len:=DBGrid1.Canvas.TextWidth(s);
        if len > w then
          DBGrid1.Hint:=s
        else
          DBGrid1.Hint:='';
      end;
    end;
  end;
end;

Код:
procedure TfmChild1.FormCreate(Sender: TObject);
begin
  DBGrid1.ShowHint := True;
  Application.OnMessage := AppMess;
end;
__________________
Memento Mori(арти)
Ответить с цитированием
  #2  
Старый 08.09.2011, 08:45
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

Нашла ещё такой вариант:
Код:
type
   TMouseGrid = class(TCustomDrawGrid);
   THackDBGrid = Class(TDBGrid);

По движению мыши:
var s: string;
    DLink : TDataLink;
    nCol,nRow:Integer;
    OldPosRecord: Integer;// vecchia posizione del cursore
  Procedure NoHint;
  begin  // nel caso di nessun hint .. lo nascondo
    DBGrid1.Hint:='';
    Application.HideHint;
  end;
begin
  nCol := -1;
  nRow := -1;
  s:= '';
  if DBGrid1.DataSource.DataSet.Active then  // solo se il dataset и aperto
  begin
    TMouseGrid(Sender).MouseToCell(X, Y, nCol, nRow);  //Mi ritorna riga colonna del mouse
    if (nCol>0) and (nRow>0) then
    begin
      DLink:=THackDBGrid(DBGrid1).DataLink;  //mi becco il datalink
      if Assigned(DLink) then  // и sicuramente assegnato .. ma .. 
      begin
        OldPosRecord := DLink.ActiveRecord;  // salvo il cursore del record
        DLink.ActiveRecord := nRow - 1;  //-1 conto che ci sia l'intestazione
        if assigned(DBGrid1.DataSource.DataSet.Fields[nCol - 1]) then
          s := DBGrid1.DataSource.DataSet.Fields[nCol - 1].AsString; // prendo il valore
        DBGrid1.Hint := s;   // assegno il valore all'hint della grid
        Application.ActivateHint(DBGrid1.ClientToScreen( Point(X,Y) ));  //mostro l'hint nella posizione del cursore
        DLink.ActiveRecord := OldPosRecord; // ripristino posizione
      end
      else
        NoHint;
    end
    else
      NoHint;
  end
  else
   NoHint;
Админ: Пользуемся тегами для оформления кода!

Правда, почему-то не работает
__________________
Memento Mori(арти)

Последний раз редактировалось Admin, 08.09.2011 в 09:42.
Ответить с цитированием
  #3  
Старый 08.09.2011, 10:19
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

Код:
type
TXGrid=class(DBGrids.TDBGrid);
Код:
var Coord: TGridCoord;
CurRec: Integer;
lh1, lh2: Integer;
begin
with TXGrid(DBGrid1) do
begin
Coord:=MouseCoord(x,y);
with Coord do
if (Y<1) or (X<1) or (X>Columns.Count) then Exit;
CurRec:=DataLink.ActiveRecord;
DataLink.ActiveRecord:=Coord.Y-1;
//
// Опредиляем длину данных в поле
lh1:=Canvas.TextWidth(Columns[Coord.X-1].Field.AsString);
Label3.Caption:=IntToStr(lh1);
//
// Определяем длину поля
lh2:=Columns[Coord.X-1].Width;
Label4.Caption:=IntToStr(lh2);
//
// Если длина поля меньше длины его текста - выводим подсказку
if lh2 <= lh1 then
begin
ShowHint:=True;
Hint:=Columns[Coord.X-1].Field.AsString;
Application.ActivateHint(ClientToScreen(Point(X, Y)));
Edit1.Text:=Columns[Coord.X-1].Field.AsString;
end
else
begin
Edit1.Text:='';
ShowHint:=False;
Hint:=''; 
end;
//
DataLink.ActiveRecord:=CurRec;
end;
end; 
тоже отказывается работать
__________________
Memento Mori(арти)
Ответить с цитированием
  #4  
Старый 08.09.2011, 10:52
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

в DBGridEh уже встроено (библиотека компонентов EhLib).
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!
Ответить с цитированием
  #5  
Старый 08.09.2011, 11:51
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот такой еще вариант:
Код:
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
  CellXY: TGridCoord;
  RecNo: Integer;
begin
 CellXY := DBGrid1.MouseCoord(X, Y);
 DBGrid1.DataSource.DataSet.DisableControls;
 RecNo := DBGrid1.DataSource.DataSet.RecNo;
 DBGrid1.DataSource.DataSet.MoveBy(CellXY.Y - DBGrid1.DataSource.DataSet.RecNo);
 if CellXY.X > 0
 then begin
      DBGrid1.Hint := DBGrid1.Columns[CellXY.X - 1].Field.DisplayText;
      Application.ActivateHint(DBGrid1.ClientToScreen(Point(X,Y)));
      end;
 DBGrid1.DataSource.DataSet.RecNo := RecNo;
 DBGrid1.DataSource.DataSet.EnableControls;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DBGrid1.DoubleBuffered := True;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 08.09.2011, 12:05
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

2 Страдалецъ :

За код - огромное спасибо! Правда, проблемы он не решил - экран по-прежнему мерцает и работать можно только с верхней частью таблицы, отображающейся на экране...

Пошла следующим путем:

Код:
procedure TfmChild1.DBGrid1CellClick(Column: TColumn);
begin
 if Column.FieldName='Info' then
 Hint:=DBGrid1.DataSource.DataSet.FieldByName('info').AsString;
 if Column.FieldName='Prim' then
 Hint:=DBGrid1.DataSource.DataSet.FieldByName('prim').AsString;

end;

Работает четко, НО при условии, что в DBGride в Options dgRowSelect стоит False. В противном случае, индекс колонки всегда будет 0, заголовок=заголовку 0-й колонки и подсказки, естественно, не будут выводиться... А dgRowSelect должно стоять в true... Не подскажете, как решить проблемку?
__________________
Memento Mori(арти)
Ответить с цитированием
  #7  
Старый 08.09.2011, 12:13
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

В смысле, чтобы указывался реальный индекс или имя колонки, которой принадлежит ячейка.
__________________
Memento Mori(арти)
Ответить с цитированием
  #8  
Старый 08.09.2011, 12:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
За код - огромное спасибо! Правда, проблемы он не решил - экран по-прежнему мерцает и работать можно только с верхней частью таблицы, отображающейся на экране...
А DoubleBuffered для формы, грида вы включали?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 08.09.2011, 12:29
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

И еще момент, основательно тормозит собственно хинт, может вместо него лучше сделать отдельное окошко, куда выводить содержимое текущего поля?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 08.09.2011, 13:02
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

Цитата:
А DoubleBuffered для формы, грида вы включали?

в смысле, прописывала ли событие OnFormCreate? Да.

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

база очень большая, некуда окно вставлять... Но, к слову, вывод подсказок нужно только для 2 колонок сделать, допустимо по щелчку на ячейку, поэтому вопрос из сообщений 6-7 остается открытым
__________________
Memento Mori(арти)
Ответить с цитированием
  #11  
Старый 08.09.2011, 13:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Там у меня для грида только включение буферизации. Есть еще такая-же штука на форме. Там тоже попробуйте включить.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 08.09.2011, 14:30
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

TfmChild1.DBGrid1CellClick(Column: TColumn) и DBGrid1 при Options dgSelectRow=True теперь уживаются:

Код:
procedure TfmChild1.DBGrid1CellClick(Column: TColumn);
var
MouseX: integer;
MouseY: integer;
pt: TGridCoord;
begin
MouseX:=Mouse.CursorPos.X;
MouseY:=Mouse.CursorPos.Y;
pt:= DBGrid1.MouseCoord(MouseX,MouseY);
 //Showmessage(IntToStr(pt.X));
if pt.X=17 then Hint:=DBGrid1.DataSource.DataSet.FieldByName('Prim').AsString;
if pt.X=18 then Hint:=DBGrid1.DataSource.DataSet.FieldByName('Info').AsString;

end;

Буферизация - очень интересная тема, обязательно к ней вернусь, только картинки к базе прикручу
__________________
Memento Mori(арти)
Ответить с цитированием
  #13  
Старый 08.09.2011, 22:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Shoni
Цитата:
А DoubleBuffered для формы, грида вы включали?
в смысле, прописывала ли событие OnFormCreate? Да.
Вас о несколько другом спросили. Включение DoubleBuffered никакого отношения к OnFormCreate не имеет. Первое это событие формы или компонента, второе его метод.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025