IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> выравнивание в AdvStringGrid, текст в ячейках
сообщение
Сообщение #1


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Вопрос - столкнулся с задачей выравнивания в ячейках компонента AdvStringGrid, при этом нужно активировать свойство переноса слов на новые строки (свойство WordWrap:=true;) , чтобы умещались слова в заданную длину столбца и строки были высотой с текст в них.. Получается выравнивать по центру и строки с высотой выровнять, но текст по вертикали не ровняется, как быть? Событие ОнДроу не нашел ((
Код

procedure TfrmRabot.ReBuildGrid;

const
  DefaultRowHeight = 64;
  FirstRowHeight = 32;

  procedure AddItem(Kod, IsSogl: Integer);
  var
    tmp: Integer;
  begin
    tmp := Length(rabotArr);
    SetLength(rabotArr, tmp + 1);
    rabotArr[tmp].Kod := Kod;
    rabotArr[tmp].IsSogl := IsSogl;
  end;

var
  row: Integer;
begin
  isChanged := False;
  AddItem(-1, -1);

  sgRabot.ClearAll;
  sgRabot.GridLineColor := clBlack;
  sgRabot.GridFixedLineColor := clBlack;
  sgRabot.ColCount := 5;
  sgRabot.FixedRows := 1;
  sgRabot.FixedCols := 0;
  sgRabot.VAlignment := vtaCenter;
  sgRabot.DefaultRowHeight := DefaultRowHeight;
  sgRabot.RowHeights[0] := FirstRowHeight;

  sgRabot.Cells[0, 0] :='Код работы';
  sgRabot.Alignments[0, 0] := taCenter;
  sgRabot.ColWidths[0] := 90;
  sgRabot.WordWraps[0, 0] := False;

  sgRabot.Cells[1, 0] :='Наименование работы';
  sgRabot.Alignments[1, 0] := taCenter;
  sgRabot.ColWidths[1] := 380;
  sgRabot.WordWraps[1, 0] := False;

  sgRabot.Cells[2, 0] :='Наименование группы';
  sgRabot.Alignments[2, 0] := taCenter;
  sgRabot.ColWidths[2] := 300;
  sgRabot.WordWraps[2, 0] := False;

  sgRabot.Cells[3, 0] :='Ремонт / замена';
  sgRabot.Alignments[3, 0] := taCenter;
  sgRabot.ColWidths[3] := 80;
  sgRabot.WordWraps[3, 0] := True;

  sgRabot.Cells[4, 0] :='Согласовано / запрещено';
  sgRabot.Alignments[4, 0] := taCenter;
  sgRabot.ColWidths[4] := 100;
  sgRabot.WordWraps[4, 0] := True;

  sgRabot.Multilinecells:=true;
  sgRabot.WordWrap:=true;

  DM.GetRabot;
  sgRabot.RowCount := DM.qryRabot.RecordCount + 1;
  row := 1;
  while not DM.qryRabot.Eof do
  begin

   sgRabot.Cells[0, row]:= DM.qryRabot.FieldByName('Nomer').AsString;
   sgRabot.Alignments[0, row] := taCenter;

    sgRabot.Cells[1, row]:= DM.qryRabot.FieldByName('Name_Rab').AsString;
    sgRabot.Alignments[1, row] := taLeftJustify;
    sgRabot.WordWraps[1, row] := True;

    sgRabot.Cells[2, row]:= DM.qryRabot.FieldByName('Name_Group').AsString;
    sgRabot.Alignments[2, row] := taLeftJustify;
    sgRabot.WordWraps[2, row] := True;

    if DM.qryRabot.FieldByName('Priznak_Rem').AsInteger = 1 then
      sgRabot.Cells[3, row] := 'Ремонт'
    else
      sgRabot.Cells[3, row] := 'Замена';
    sgRabot.Alignments[3, row] := taCenter;

    if DM.qryRabot.FieldByName('Priznak_Sol').AsInteger = 1 then
      sgRabot.Cells[4, row] := 'Согласовано'
    else
      sgRabot.Cells[4, row] := 'Запрещено';
      sgRabot.Alignments[4, row] := taCenter;

    AddItem(
      DM.qryRabot.FieldByName('Kod').AsInteger,
      DM.qryRabot.FieldByName('Priznak_Sol').AsInteger
    );
    sgRabot.AutoSizeRow(row);
    Inc(row);
    DM.qryRabot.Next;

  end;
  DM.qryRabot.Close;
end;


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Событие ОнДроу не нашел
OnDrawCell должен быть:
Прикрепленное изображение

А сам по себе VAlignment := vtaCenter; работать не будет (при WordWrap выставленном в True). Претензии - разработчикам WinAPI.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


А если не сложно, можно пример, для любого столбца


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Пример чего? Как выровнять текст в ячейке вертикально по центру? Как обычно: сначала DrawText с флагом DT_CALCRECT, это даст тебе в четвертом параметре прямоугольник, в который помещается текст. Разница размеров того прямоугольника, который передается в OnDrawCell и полученного из DrawText - это и есть значение, на которое нужно сдвинуть вывод текста. А потом - второй DrawText, уже без флага CALCRECT, для действительного вывода текста. У меня сейчас не установлен под Дельфи TMS Pack, только под Билдером. Вот так это выглядит на Билдере:

void __fastcall TForm1::asgDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
TGridDrawState State)
{
TAdvStringGrid *grid = dynamic_cast<TAdvStringGrid*>(Sender);
String s = grid->Cells[ACol][ARow];
TRect r = Rect;

if(ARow)
{
grid->Canvas->FillRect(Rect);

DrawText (grid->Canvas->Handle,
s.t_str(), s.Length(), &r, DT_CENTER | DT_WORDBREAK | DT_CALCRECT);

int dx = (Rect.Width() - r.Width()) / 2;
int dy = (Rect.Height() - r.Height()) / 2;
OffsetRect(&r, dx, dy);

DrawText (grid->Canvas->Handle,
s.t_str(), s.Length(), &r, DT_CENTER | DT_WORDBREAK);
}
}


Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Как понимаю надо делать так->
Код
procedure TfrmRabot.sgRabotDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
with sgRabot, sgRabot.Canvas do begin
  FillRect(Rect);
  SetBkMode(Handle, TRANSPARENT);
  Rect.Right:=Rect.Right -2;
  if (ACol = 0) or (ARow = 0) or (ACol >2) then
  // DT_SINGLELINE
    DrawText(Handle, Cells[ACol, ARow], -1, Rect, DT_VCENTER OR DT_WORDBREAK OR DT_CENTER)
  else
    DrawText(Handle, Cells[ACol, ARow], -1, Rect, DT_VCENTER OR DT_WORDBREAK OR DT_LEFT);
end;
end;

Косяк так и остался, если флаг DT_SINGLELINE, то все отлично, но нет переноса по строчкам, а вот если DT_WORDBREAK, есть перенос, но нет центровки. Выходит снова упор в косяк WinAPI?


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


То есть, я понимаю так, что читать то, что написано и изучать приведенный код ты не желаешь? Я ж написал специально:
Цитата
сначала DrawText с флагом DT_CALCRECT, это даст тебе в четвертом параметре прямоугольник, в который помещается текст. <...> А потом - второй DrawText, уже без флага CALCRECT, для действительного вывода текста.
Где у тебя два вызова DrawText? Не вижу, вижу только один, непосредственный вывод текста. Где подсчет смещения отцентрированного текста относительно исходного Rect? Почему дословный перевод Билдеровского кода на Дельфи у меня отработал:
Прикрепленное изображение
(DrawCell - он у всех гридовых компонентов DrawCell, работать будет одинаково на любом гриде), а у тебя
Цитата
снова упор в косяк WinAPI?
? Может, упор в нежелание понимать, что происходит?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Дурная голова кривым рукам покоя не дает ((
Еще вопрос, как запретить события он клик на всех ячейках кроме первого столбца. И если есть событие OnClick ячейки, то закрасить всю строку. Сделал так, но нажимается везде и везде прокрашивается только ячейка OnClick, при чем любая.
Код
procedure TfrmFrom1.AdvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const //здесь определяем Ваш цвет. Так же можно использовать цвета по умолчанию.
  clPaleGreen = TColor($CCFFCC);
var
  grid:TAdvStringGrid;
  s: string;
  r :TRect;
  dx, dy,i: integer;

begin
  if (gdFocused in State) then
  begin
    AdvStringGrid1.Canvas.Brush.color := clPaleGreen
  end
  else
   AdvStringGrid1.Canvas.Brush.Color := clWindow;
  if (ARow > 0) and (ACol=0)then
  begin
    AdvStringGrid1.Canvas.FillRect(Rect);
    AdvStringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, AdvStringGrid1.Cells[ACol, ARow]);
   end;


begin
  grid:=Sender as TAdvStringGrid;
  s:=grid.Cells[ACol, ARow];
  r:=Rect;
   if ( Arow>=0 ) and ( ACol>=0 ) then
  begin
  grid.Canvas.FillRect(Rect);
  DrawText (grid.Canvas.Handle,
    s, Length(s), r, DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
  dx:=((Rect.Right - Rect.Left) - (r.Right - r.Left)) div 2;
  dy:=((Rect.Bottom - Rect.Top) - (r.Bottom - r.Top)) div 2;
  offsetRect(r,dx,dy);
  DrawText (grid.Canvas.Handle,
  s, Length(s), r, DT_CENTER or DT_WORDBREAK);
  end
  else
  begin
  grid.Canvas.FillRect(Rect);
  DrawText (grid.Canvas.Handle,
    s, Length(s), r, DT_WORDBREAK  or DT_CALCRECT);
    dx:=1;
  dy:=((Rect.Bottom - Rect.Top) - (r.Bottom - r.Top)) div 2;
  offsetRect(r, dx, dy);
  DrawText (grid.Canvas.Handle,
  s, Length(s), r, DT_WORDBREAK);
end;
end;
end;


Сообщение отредактировано: Atreides -


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Вы не правы)
Но так бывает. Не обижайтесь.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 21.12.2024 19:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name