Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2013, 15:34   #1
arhiepiskop
Пользователь
 
Аватар для arhiepiskop
 
Регистрация: 26.11.2009
Сообщений: 19
По умолчанию Чудеса со StringGrid'ом

Вывожу данные, полученные из ADOQuery в StringGrid. Все нормально, но при использовании метода onDrawCell(для установки текста по центру ячейки) упорно опустошается одна ячейка[0,1]. Если же не использовать onDrawCell то эта ячейка нормально показывает текст.
Код:
 
procedure TForm_st.ListBox1Click(Sender: TObject);
var
   i,j:integer;

begin
with StringGRid1 do
    for i:=1 to RowCount-1 do   
    for j:=0 to ColCount-1 do
      Cells[j, i]:='';
with DataModule1 do
                 Begin
                 
                 ADOquery1.Close;
                 adoquery1.SQL.Clear;
                 adoquery1.SQL.add('select kod_gr from grupi where ind_gr=:a');
                 ADOQuery1.Parameters.ParamByName('a').Value:=Listbox1.Items[ListBox1.ItemIndex];
                 adoquery1.Open;
                 kod_gr:=ADOQuery1.Fields[0].Asinteger;
                  
                 ADOquery1.Close;
                 adoquery1.SQL.Clear;
                 adoquery1.SQL.add('select * from stud where kod_gr=:a');
                 ADOQuery1.Parameters.ParamByName('a').Value:=kod_gr;
                 adoquery1.Open;
                 i:=1;
                 While not ADOQuery1.Eof
                 do begin
                    Stringgrid1.Cells[0,i]:= inttostr(ADOQuery1.FieldByname('kod_st').asInteger);
                    Stringgrid1.Cells[1,i]:=ADOQuery1.FieldByname('fam').AsString;
                    Stringgrid1.Cells[2,i]:=ADOQuery1.FieldByname('name').AsString;
                    Stringgrid1.Cells[3,i]:=ADOQuery1.FieldByname('ot4').AsString;
                    Stringgrid1.Cells[4,i]:=ADOQuery1.FieldByname('n_za4').AsString;
                    ADOQuery1.Next;
                    inc(i);
                    end;
                 end;
end;
procedure TForm_st.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
    text:string;
begin
text:=StringGrid1.Cells[ACol,ARow];
StringGrid1.Canvas.Brush.Color:=clWindow;
StringGrid1.Canvas.FillRect(Rect);
DrawText(StringGrid1.Canvas.Handle, PChar(text), Length(text), Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;
Как это исправить?
Изображения
Тип файла: jpg 1.JPG (68.8 Кб, 131 просмотров)
Тип файла: jpg 2.JPG (66.2 Кб, 112 просмотров)
arhiepiskop вне форума Ответить с цитированием
Старый 23.11.2013, 15:52   #2
OlegPrograming5
Пользователь
 
Регистрация: 12.01.2009
Сообщений: 42
По умолчанию

А не проще ли будет использовать DBGrid?
OlegPrograming5 вне форума Ответить с цитированием
Старый 23.11.2013, 16:05   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как это исправить?
Отладкой естесственно не проходил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2013, 16:16   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от OlegPrograming5 Посмотреть сообщение
А не проще ли будет использовать DBGrid?
Бывает, что не проще.

Свойство DefaultDrawing в False. Если хочещь выделение прорисовывать, то заменить так примерно
Код:
  StringGrid1.Canvas.Brush.Color:=clWindow;

на

  if gdSelected in State then begin
    StringGrid1.Canvas.Brush.Color:=clActiveCaption;
    StringGrid1.Canvas.Font.Color:=clCaptionText;
  end
  else begin
    StringGrid1.Canvas.Brush.Color:=clWindow;
    StringGrid1.Canvas.Font.Color:=clWindowText;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.11.2013, 16:24   #5
arhiepiskop
Пользователь
 
Аватар для arhiepiskop
 
Регистрация: 26.11.2009
Сообщений: 19
По умолчанию

Отладкой проходил, но все равно не пойму в чем дело. Когда дело доходит до onDrawCell, то с 3го прохода рисуется первая фамилия, т.е. по логике на 2м проходе рисуется как раз ЭТА ячейка, но остается почему-то пустой, а на первом проходе вообще непонятно что делается...

DBGrid проще, но нужно сделать в StringGrid
arhiepiskop вне форума Ответить с цитированием
Старый 23.11.2013, 16:28   #6
arhiepiskop
Пользователь
 
Аватар для arhiepiskop
 
Регистрация: 26.11.2009
Сообщений: 19
По умолчанию

Аватар огромное спасибо, заработало!
Изображения
Тип файла: jpg 3.JPG (77.6 Кб, 123 просмотров)
arhiepiskop вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чудеса с printf BrookBond Общие вопросы C/C++ 9 10.03.2013 23:28
Чудеса c DBGrid'ом The_Immortal C++ Builder 3 05.05.2012 03:01
Чудеса инкремента Русtam PHP 2 27.11.2011 17:12
Чудеса Vikenty Свободное общение 10 14.10.2010 20:27
Чудеса в Borland C++ 3.1 LightWarrior Общие вопросы C/C++ 5 06.01.2010 03:37