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


Автор: WGR 7.6.2006, 12:53
Народ помогите 
мне надо в memo закрасить фон за первыми 100 символами допустим в красный цвет а  с 101 по 200 зелёным 
КАк это зделать на Delphi
чёт никак не соображу вродебы можно через convas но при этом поверх текста вроде рисует
Помогите... 

Автор: Yanis 7.6.2006, 13:01
Может логичнее исполльзовать RichEdit? Там попроще это сделать... 

Автор: Rennigth 7.6.2006, 13:38
WGR, согласен с Yanis, используй RichEdit, а закрашивать так:
http://forum.vingrad.ru/index.php?showtopic=58277&st=0&#entry464833 

Автор: jaAlex 7.6.2006, 23:16
Код

procedure TForm1.Memo1Change(Sender: TObject);
begin
if Memo1.Lines.Count<10 then Memo1.Brush.Color :=clRed
else Memo1.Brush.Color:=clGreen;
end;

Это вот счетчик по линиям, как по символам - не помню. Закрашивает выбранным цветом за символами по строкам. Если сильно надо, то выложу как по символам считать. Или сам сделаешь? 

Автор: WGR 8.6.2006, 08:07
Rennigth, хорошо попробую этот код
 smile 
Код

uses RichEdit...
...
var
  lFmt: TCharFormat2;
begin
  FillChar(lFmt.cbSize, SizeOf(TCharFormat2), 0);
  lFmt.cbSize := SizeOf(TCharFormat2);

  //Background Color
  lFmt.crBackColor := clred;
  lFmt.dwMask := CFM_BACKCOLOR;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));

  //Text Color
  lFmt.crTextColor := clGreen;
  lFmt.dwMask := CFM_COLOR;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));
end;
...


но он наверно закрасит фон у выделенного текста? (SCF_SELECTION) smile 

а мне надо программно с указанного символа по указанный
Если не сложно подскажи  
  

Автор: ~FoX~ 8.6.2006, 08:27
Вот на скорую руку набросал
Код

var
  c: TCanvas;
  n, en: integer; 
  x, y: integer;
  s: string;
begin
  n := 1; //Первый символ для покраски
  en := 10; //Последний символ
  try
    c := TCanvas.Create;
    c.Handle := GetDC(Memo1.Handle); //Создали канвас для мемо ;-)
    s := copy(Memo1.Text, n, en);
    x:=c.TextWidth(s); //Получили ширину
    y:=c.TextHeight(s); //Получили высоту
    c.Brush.Color := clRed;
    c.FillRect(Rect(0, 0, x, y)); //Тут в место нулей надо определять положение, но это ты и сам сделаешь
    c.TextOut(0, 0, s); //Написали текст по верх покраски
  finally
    c.Free; //Убили канвас
  end;
end;

Это просто пример.
   

Автор: Rennigth 8.6.2006, 09:23
WGR, 
а так? smile 
Код

var
  lFmt: TCharFormat2;
  lSaveSelStart, lSaveSelLength: Integer;
begin
  FillChar(lFmt.cbSize, SizeOf(TCharFormat2), 0);
  lFmt.cbSize := SizeOf(TCharFormat2);

  lSaveSelStart := RichEdit.SelStart;
  lSaveSelLength := RichEdit.SelLength;

  RichEdit.SelStart := 0;
  RichEdit.SelLength := 200;

  lFmt.crBackColor := clred;
  lFmt.dwMask := CFM_BACKCOLOR;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));

  RichEdit.SelStart := lSaveSelStart;
  RichEdit.SelLength := lSaveSelLength;
 

Автор: WGR 8.6.2006, 11:16
пасибо 
~FoX~, 
Rennigth, 
думаю прокатит

я новичёк и посты вродеб ёщё не могу ставить 
поставлю как смогу

дома попробуя запрогить по вашему а то щя на работе
 

Автор: WGR 9.6.2006, 01:17
Rennigth, Взял твой метод
он вроде попроще 

вот чё мне в итоге надо было 


Код

procedure TForm1.RichEditChange(Sender: TObject);
var
  lFmt: TCharFormat2;
  lSaveSelStart, lSaveSelLength: Integer;
begin
  FillChar(lFmt.cbSize, SizeOf(TCharFormat2), 0);
  lFmt.cbSize := SizeOf(TCharFormat2);

  lSaveSelStart := RichEdit.SelStart;
  lSaveSelLength := RichEdit.SelLength;

  RichEdit.SelStart := 10;
  RichEdit.SelLength := 20;

  lFmt.crBackColor := clred;
  lFmt.dwMask := CFM_BACKCOLOR;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));

  RichEdit.SelStart := 21;
  RichEdit.SelLength := 30;

  lFmt.crBackColor := clgreen;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));


  RichEdit.SelStart :=31;
  RichEdit.SelLength := 200;

  lFmt.crBackColor:=clYellow;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));

  RichEdit.SelStart :=0;
  RichEdit.SelLength := 9;
  SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(@lFmt));

  RichEdit.SelStart := lSaveSelStart;
  RichEdit.SelLength := lSaveSelLength;
end;




вот тока как в место clYellow поставить фоновое в RichEdit
ставлю RichEdit.Color а он мне фиолетовым красит

 

Автор: Rennigth 9.6.2006, 09:32
а это нормально, ты просто после того как закрасил текс снимай выделение. Например так 
Код

  RichEdit.SelLength = 0;


 

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