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

> ВНИМАНИЕ!

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

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

 
 Ответить  Открыть новую тему 
> String в TFontStyles
сообщение
Сообщение #1


mea culpa
*****

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

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


Привет всем.
Вопрос такой, читаю из файла конфигурации параметры шрифта TRichEdit, итого параметры в строковых переменных. Параметры - шрифт, стиль шрифта, размер. Когда доходит до присваивания этих параметров РичЭдиту, то происходит несовпадение типов String и TFontStyles. Так вот, как можно "конвертировать" строку строкового типа, в которой будет [fsBold] или [fsBold,fsUnderline], например, в тип TFontStyles, чтобы можно было это присвоить свойству стиля текста RichEdit?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






RTTI в чистом виде:

Uses {..., } TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
s, st: string;
ifs: TFontStyle;

ATypeInfo: PTypeInfo;
f: TFontStyles;

begin
s := '[fsBold,fsUnderline]'; // Это - твоя строка
ATypeInfo := TypeInfo(TFontStyle);

f := []; // Совсем забыл, это тоже надо, мало ли что...
for ifs := Low(TFontStyle) to High(TFontStyle) do begin
if pos(GetEnumName(ATypeInfo, ord(ifs)), s) > 0 then include(f, ifs);
end;
Memo1.Font.Style := f; // F содержит нужные стили. Для теста проверял на TMemo
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

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

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


А можно пару вопросов?
Что такое include(f, ifs)?
Что за тип PTypeInfo?
GetEnumName(ATypeInfo, ord(ifs) это как я понял выдает имя с каким-то номером. Это подойдет, например, для цвета(как в задании, но если не стиль, а цвет)?

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Я ж говорю: это RTTI - RunTime Type Information, работает с любыми типами данных. В частности - то, что я привел - с перечислениями. Поскольку цвет - это не перечисления, а константы, то этот подход к цветам неприменим.

Цитата
Что такое include(f, ifs)?
Аналог
f := f + [ifs]; // Занесение элемента во множество

Цитата
Что за тип PTypeInfo?
Это тип, описанный в модуле TypInfo, используемый для получения информации о нужном пользователю типе...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


mea culpa
*****

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

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


Deleted

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


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

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

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


Спс за ответ, попробую что-нибудь написать (вопросов будет много smile.gif )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Client, для перевода цвета из строки в TColor и обратно есть функции StringToColor/ColorToString. Скажем,
s := 'clBlue';
Color := StringToColor(s); // Color = clBlue
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

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

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


Помогло, спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


mea culpa
*****

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

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


А как можно уже TFontStyles перевести в строку?smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






По аналогии с первым преобразованием - вот так:
function FStoString(fs: TFontStyles): string;
var
ATypeInfo: PTypeInfo;
ifs: TFontStyle;
begin
ATypeInfo := TypeInfo(TFontStyle);
for ifs := Low(TFontStyle) to High(TFontStyle) do begin
if ifs in fs then
result := result + GetEnumName(ATypeInfo, Ord(ifs)) + ',';
end;
result := '[' + Copy(result, 1, Length(result) - 1) + ']';
end;
 К началу страницы 
+ Ответить 

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

 





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