Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > StringGrid и выравнивание


Автор: MacTep 21.5.2005, 12:30
Здравствуйте!
Проблема такая: не могу сделать выравнивание по середине в StringGrid'е. Знаю, что эта проблема давно и много раз обсуждалась. Но я не смог найти путевого ответа! У меня такой код:
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var lRow,lCol:LongInt;
begin
  lRow:=ARow;
  lCol:=ACol;
  with Sender as TStringGrid, Canvas do
  begin
    FillRect(Rect);
    SetBkMode(Handle, TRANSPARENT);
    SetTextAlign(Handle, TA_CENTER);
    TextOut(Rect.Right-2, Rect.Top+2, Cells[lCol, lRow]);
  end;
end;

Только вот не получается по центру выставить содержимое ячеек. Почему это происходит и что я делаю не так? Спасибо...

Автор: s-mike 21.5.2005, 13:33
Используй DrawText и не мучься smile
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  Windows.DrawText(
    StringGrid1.Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, 
    DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;

Автор: MacTep 23.5.2005, 10:44
s-mike, если делаю так:
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
Windows.DrawText(
StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]),-1,
Rect,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;

procedure TForm1.FormShow(Sender: TObject);
var s:string;
begin
  StringGrid1.Cells[0,1]:='***';
  StringGrid1.Cells[1,1]:='По центру';
  StringGrid1.Cells[2,2]:='***';
,
то получается что все надписи выводятся по два раза. Что делать?

Автор: ~FoX~ 23.5.2005, 17:02
MacTep
Ну так тыж сначал заносишь значения в ячейку при FormShow, а потом еще раз рисуешь при StringGrid1DrawCell, вот и получаются две надписи.

Автор: s-mike 23.5.2005, 17:44
Цитата(MacTep @ 23.5.2005, 10:44)
то получается что все надписи выводятся по два раза. Что делать?

Ну дык StringGrid.DefaultDrawing := False
или
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  StringGrid1.Canvas.FillRect(Rect);
  Windows.DrawText(
    StringGrid1.Canvas.Handle,
    PChar(StringGrid1.Cells[ACol, ARow]),-1,
    Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;

Автор: MacTep 23.5.2005, 20:50
s-mike, благодарю, все отлично работает! Но DefaultDrowing - фигня полная! Мне такой вид не понравился! smile

Автор: ~FoX~ 24.5.2005, 08:10
Цитата(MacTep @ 23.5.2005, 21:50)
Но DefaultDrowing - фигня полная! Мне такой вид не понравился!

Он то как раз и позволяет тебе с видом сделать все что угодно.

Автор: s-mike 25.5.2005, 07:17
Цитата(MacTep @ 23.5.2005, 20:50)
Но DefaultDrowing - фигня полная! Мне такой вид не понравился! smile


Цитата
Он то как раз и позволяет тебе с видом сделать все что угодно.

Да. Этот метод отключает отрисовку ячеек по умолчанию и позволяет придавать ячейкам совсем другой вид. smile

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