1

Тема: Стилі шрифту в RichEdit (Delphi)

В мене яка проблема: Кнопками SpeedButton я планую змінювати стилі виділеного шрифта.
Написав наступний код, та не 33-му рядку є помилка (властивості SelAttributes.Style тип даних String непідходить) Порадьте як зробити.

{======================== Встановлюємо стилі шрифта ===========================}
procedure TRiderAlg_Form.AddStyleFromAlgDesREd;
var
  S:String;
  I:Integer;
begin
  S:='';
  S:='[';
  If AlgDesBold_SBt.Checked=True then
    begin
      S:=S+'fsBold,';
    end;
  If AlgDesItalic_SBt.Checked=True then
    begin
      S:=S+'fsItalic,';
    end;
  If AlgDesUnderline_SBt.Checked=True then
    begin
      S:=S+'fsUnderline,';
    end;
  If AlgDesStrikeout_SBt.Checked=True then
    begin
      S:=S+'fsStrikeOut,';
    end;
  I:=Length(S);
  If I>1 then
    begin
      S:=LeftStr(S,I-1);//Видаляємо кому
    end;
  S:=S+']';
  if AlgDes_REd.SelLength>0 then // Вибрано виділений текст
    begin
      AlgDes_REd.SelAttributes.Style:=S;
    end;
end;

2

Re: Стилі шрифту в RichEdit (Delphi)

Наугад
Я б писав так

ВашБаттон.Font.Style := [fsBold, fsItalic];

ще є підкреслене, закреслене, але я не памятаю як (можна їх додавати через кому в квадратні дужки)

3

Re: Стилі шрифту в RichEdit (Delphi)

Я вибачаюсь, що неуважно прочитав умову, ну але це нічого не змінює, крім того, що замість ВашогоБаттона, треба писати ВашRichEdit

4

Re: Стилі шрифту в RichEdit (Delphi)

Chemist-i написав:

Наугад
Я б писав так

ВашБаттон.Font.Style := [fsBold, fsItalic];

ще є підкреслене, закреслене, але я не памятаю як (можна їх додавати через кому в квадратні дужки)

Якщо брати Font.Style то стилі застосовуються до всього тексту, а мені потрібно до виділеного тексту

Використовуюччи [fsBold, fsItalic] замість S працює і в моєму коді

 

if AlgDes_REd.SelLength>0 then // Вибрано виділений текст
    begin
      AlgDes_REd.SelAttributes.Style:=[fsBold, fsItalic];
    end;

В мене 4-ри кнопки SpeedButton кожна з яких відвовідає за певний стиль шрифту. В стоку S записую дані якщо кнопка нажата. Одна поблема як позбутися лапок. бо в мене виходить так '[fsBold, fsItalic]' а не так:[fsBold, fsItalic](як потрібно)

5 Востаннє редагувалося koala (11.01.2018 11:26:03)

Re: Стилі шрифту в RichEdit (Delphi)

Треба робити S не String, а TFontStyles. Delphi - компільована мова, а не інтерпретована, фрагменти коду в рядках не можуть бути виконані.
var S:TFontStyles;
...

  If AlgDesItalic_SBt.Checked then //не треба boolean порівнювати з True
    begin
      S:=S+fsItalic;
    end;

Але це надто одноманітно, як на мене. Краще вже якось так:

procedure TRiderAlg_Form.AddStyleFromAlgDesREd;
const StyleControls:array[1..4] of TSpeedButton = (AlgDesBold_SBt,AlgDesItalic_SBt,AlgDesUnderline_SBt,AlgDesStrikeout_SBt);
const Styles:array[1..4] of TFontStyle = (fsBold,fsItalic,fsUnderline,fsStrikeout);
var i:integer;
begin
    if AlgDes_REd.SelLength>0 then begin // Вибрано виділений текст
      for i:=1 to 4 do begin
        if StyleControls[i].Checked then begin
          AlgDes_REd.SelAttributes.Style:=AlgDes_REd.SelAttributes.Style+Styles[i];
        end;
      end;
    end;
end;

Швидше за все, const так не спрацює, треба додавати в TRiderAlg_Form приватну змінну або ж якось іще прив'язувати контроли до стилей, але воно, гадаю, того варте.
Ідеальним тут би був асоціативний масив, але я не знаю, яким Delphi ви користуєтеся, а TDictionary досить пізно з'явився.
Ще можна від TSpeedButton успадкуватися, але тоді, можливо, доведеться забагато переробляти.
А ще в контролах є Tag, але це трохи ризиковано, якщо хтось іще спробує його використовувати:

        if StyleControls[i].Checked then begin
          AlgDes_REd.SelAttributes.Style:=AlgDes_REd.SelAttributes.Style+TFontStyle(StyleControls[i].Tag);
        end;
Подякували: Torbins, leofun01, Romanvolja3

6

Re: Стилі шрифту в RichEdit (Delphi)

koala
В Делфі можна навіть так:

var
  StyleControls: array[TFontStyle] of TSpeedButton;
  i: TFontStyle;
  S: TFontStyles;
//...
  S := [];
  for i := Low(TFontStyle) to High(TFontStyle) do
    if StyleControls[i].Checked then
      S := S + i;

Romanvolja
Оце почитайте:
http://pascal.org.ua/structure-types#enumeration
http://pascal.org.ua/structure-types#set

Подякували: koala, leofun01, Romanvolja3

7

Re: Стилі шрифту в RichEdit (Delphi)

Дійсно. Я зациклився на тому, що цикл має бути по контролах.
Втім, можлива проблема - якщо колись стилів стане більше, а контролів не додасться, код почне падати.