Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись параметров шрифта в файл 
:(
    Опции темы
docwar
Дата 12.11.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Маленький вопросец! =)

Запись данных о стиле шрифта, выбранном в FontDialog'е в переменную делаю так:
Код
TFontStyles fsb

FontDialog1->Execute();
fsb = FontDialog1->Font->Style << fsBold;
Memo1->Font->Style = fsb;


Но как записать значение этой переменной в ini-файл?
Вот так не получается (не хочет ТФонтСтиль в АнстСтринг ковертировать)
Код
TIniFile *ini;
ini=new TIniFile("D:/nazvanie.ini");
ini->WriteString("permennaya1",f,fsb);
delete ini;

PM MAIL   Вверх
Khan
Дата 13.11.2006, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



PM MAIL   Вверх
Vyacheslav
Дата 13.11.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Khan @  13.11.2006,  08:04 Найти цитируемый пост)
Посмотри здесь: http://forum.vingrad.ru/topic-119179/hl/%2...25B0/index.html 


Мда. Зачем так сложно smile.
Во первых у сетов есть операторы ввода <<  и вывода >>  в поток

Код

ostream& operator <<(ostream& os, const Set<T, minEl, maxEl> & arg)
istream& operator >> (istream& is, Set<T, minEl, maxEl> & arg)

Для того, что бы их использовать достаточно записать
Код

#defined VCL_IOSTREAM

и строки из нулей и единиц у Вас в кармане smile
Ну а кому не по вкусу нули и единицы можно  получить и непосредственно строковый набор
таким образом 
Код

AnsiString strStyle = GetSetProp(Memo1->Font, "Style", "[]"));
 
Ну и восстановить его из строки
Код

 AnsiString strStyle = "[fsBold, fsItalic]";
 SetSetProp(Memo1->Font, "Style", strStyle);


Добавлено @ 11:49 
Соответственно имеем 
Код

ini->WriteString("Font","Style",GetSetProp(Memo1->Font, "Style", "[]"));



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
docwar
Дата 13.11.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Vyacheslav, спасибо!
Проблема возникла теперь в другом! Как только сделаю любые изменения с шрифтом - текст зачеркивается. Проверял параметры шрифта формы и memo - ошибок нет.
Вот код, относящийся к передаче параметров из FontDialog -> Memo1:
Код
TFontStyles fsb,fsi,fsu,fss;

if(FontDialog1->Execute())
{
Memo1->Font->Charset=FontDialog1->Font->Charset;
Memo1->Font->Color=FontDialog1->Font->Color;
Memo1->Font->Height=FontDialog1->Font->Height;
Memo1->Font->Name=FontDialog1->Font->Name;
Memo1->Font->Pitch=FontDialog1->Font->Pitch;
Memo1->Font->Size=FontDialog1->Font->Size;

fsb = FontDialog1->Font->Style << fsBold;
Memo1->Font->Style = fsb;

fsi = FontDialog1->Font->Style << fsItalic;
Memo1->Font->Style = fsi;

fsu = FontDialog1->Font->Style << fsUnderline;
Memo1->Font->Style = fsu;

fss = FontDialog1->Font->Style << fsStrikeOut;
Memo1->Font->Style = fss;
}

PM MAIL   Вверх
Vyacheslav
Дата 13.11.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



И почему бы ему не зачеркиваться, если Вы  ему прямо говорите : "зачеркнись"
Код

fss = FontDialog1->Font->Style << fsStrikeOut;
Memo1->Font->Style = fss;


Добавлено @ 13:18 
Правда перед этим, Вы ему также говорите стань жирным, потом меняете на курсив, потом на подчекивание.

Добавлено @ 13:24 
Я бы все Ваши издевательства на фонтом изменил на код из хелпа smile
Код

FontDialog1->Font =  Memo1->Font;
if(FontDialog1->Execute())
{
   Memo1->Font =  FontDialog1->Font;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
docwar
Дата 13.11.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо большое, но это все равно не решает проблемы... уже не знаю где косяк...
Помогите, пожалуйста, отладить код. При запуске получаю, что "" не имеет интовского значения!!! =(
В этом коде пытаюсь сделать загрузку параметров шрифта из файла D:/nazvanie.ini с применением их для Memo1 и сохранение их (параметры) при закрытии в тот же файл (D:/nazvanie.ini).
Код
AnsiString c,cc,f,s,ss,ff;

void __fastcall TForm5::FormCreate(TObject *Sender)
{

TIniFile* file=new TIniFile("D:/nazvanie.ini");
TStringList* lst=new TStringList;

AnsiString strStyle = "[fsBold, fsItalic]";
SetSetProp(Memo1->Font, "Style", strStyle);

ff=lst->Values["Name"];
cc=lst->Values["Color"];
ss=lst->Values["Size"];

Memo1->Font->Name=ff;
Memo1->Font->Color=StringToColor(cc);
Memo1->Font->Size=ss.ToInt();

delete lst,file;
}
//---------------------------------------------------------------------------
void __fastcall TForm5::Label1Click(TObject *Sender)
{
if(FontDialog1->Execute())
{
 AnsiString strStyle = GetSetProp(Memo1->Font, "Style", "[]");
 Memo1->Font =  FontDialog1->Font;
 ff=Memo1->Font->Name;
 cc=ColorToString(Memo1->Font->Color);
 ss=Memo1->Font->Size;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm5::FormClose(TObject *Sender, TCloseAction &Action)
{
Memo1->Lines->SaveToFile(PP + ExtractFileName("notes.txt"));

c="Color";
f="Name";
s="Size";

TIniFile *ini;
ini=new TIniFile("D:/nazvanie.ini");
ini->WriteString("Parametrs",f,ff);
ini->WriteString("Parametrs",c,cc);
ini->WriteString("Parametrs",s,ss);

ini->WriteString("Font","Style",GetSetProp(Memo1->Font, "Style", "[]"));

delete ini;
}

PM MAIL   Вверх
pandrew
Дата 13.11.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 27.3.2006

Репутация: 3
Всего: 3



Цитата(docwar)
Memo1->Font->Size=ss.ToInt();

Эта строка выкидывает исключение, если ss не содержит числа. Поставь try..catch, либо используй atoi(ss.c_st());

PM MAIL   Вверх
docwar
Дата 13.11.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



pandrew, не могли бы вы подробнее ответить? 
В хелпе смотрел - перевод не помог мне... =)
PM MAIL   Вверх
docwar
Дата 13.11.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Установил, что ошибка в этом коде:
Код
void __fastcall TForm5::FormCreate(TObject *Sender)
{
Memo1->Lines->LoadFromFile(PP + ExtractFileName("notes.txt"));

TIniFile* file=new TIniFile("D:/nazvanie.ini");
TStringList* lst=new TStringList;

AnsiString strStyle = "[fsBold, fsItalic]";
SetSetProp(Memo1->Font, "Style", strStyle);

ff=lst->Values["Name"];
cc=lst->Values["Color"];
ss=lst->Values["Size"];

Memo1->Font->Name=ff;
Memo1->Font->Color=StringToColor(cc);
Memo1->Font->Size=ss.ToInt();

delete lst,file;
}

Точную строку определить не удалось - ругается при любом считывании данных... =(  :'(
PM MAIL   Вверх
Bima
Дата 14.11.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Ошибка происходит на строке
Код

Memo1->Font->Color=StringToColor(cc);


потому что на строках:
Код

ff=lst->Values["Name"];
cc=lst->Values["Color"];
ss=lst->Values["Size"];

переменным ff, cc, ss присваевается Null !!!

я так и не смог понять код. Вы создаете новый TStringList и пытаетесь вытащить название, цвет и размер компонента? или чего нибудь другого??? Компонент не визуальный, как можно из него вытащить размер и цвет???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
pandrew
Дата 14.11.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 27.3.2006

Репутация: 3
Всего: 3



Цитата(docwar @ 13.11.2006,  20:43)
Установил, что ошибка в этом коде:
Код
void __fastcall TForm5::FormCreate(TObject *Sender)
{...
TStringList* lst=new TStringList;
...
ff=lst->Values["Name"];
...
Memo1->Font->Name=ff;
...
delete lst,file;
}

Точную строку определить не удалось - ругается при любом считывании данных... =(  :'(

Собственно неудивительно:
1)создается список (по умолчанию он пустой)
2)из него (из пустого) пытаются вытащить величину "Name" - естественно получают пусто
3)эту величину присваивают Memo1->Font->Name - этот фокус пройдет, но результат =пусто
4)присвоение Memo1->Font->Color=<пусто> выдаст исключение ибо StringToColor ждет по хелпу:
The S parameter can be either the name of a built-in color constant such as 'clBtnFace', or the string representation of a valid TColor value such as '$02FF8800'.  StringToColor returns the TColor value that corresponds to the S parameter.аналогично
Memo1->Font->Size=lst->Values["Size"].ToInt(); даст исключение

Правильная логика в рамках вашего алгоритма при входе:
1)создается список (по умолчанию он пустой)
2)загружаем список из файла LoadFromFile(const AnsiString FileName) 
3)загружаем в Memo, интересующие нас параметры (контролируя их существование)
4)разрушаем список за ненадобностью

при выходе:
1)создается список
2)формируем параметры в списке (используя свойства Memo)  TStringList::Add("..")
3)выгружаем в файл: SaveToFile(const AnsiString FileName)
4)разрушаем список за ненадобностью

Алгоритм типичной отладки:
1)устанавливаем цель: узнать точно, что и где не так (это в голове должно созреть):
2)компилируем проект
3)ставим точку останова на начало процедуры и запускаем
4)последовательно нажимаешь F8, изучая значения своих параметров (окно Watch отладчика)
5)как только что-то не так (не так как должно) - садимся и думаем (головой), где же мы напортачили
6)правим код - переходим к п. 1)
PM MAIL   Вверх
Vyacheslav
Дата 14.11.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



docwar,  у Вас проблемы с пониманием, что такое алгоритм и что  следует применить в конкретном случае
Ну зачем Вы использовали вот этот код
Код

AnsiString strStyle = "[fsBold, fsItalic]";
SetSetProp(Memo1->Font, "Style", strStyle);

который я дал для понимания механизма преобразлвания строки в сет. Этот код надо было использовать для чтения стиля из ini-файла, а не для его первоначальной инициализации 
Ведь проще и более правильнее было написать 
Код

Memo1->Font = TFontStyles() << fsBold << fsStyle;

А зачем здесь strStyle = GetSetProp(Memo1->Font, "Style", "[]") ?
strStyle  нигде не используется в дальнейшем
Код

AnsiString strStyle = GetSetProp(Memo1->Font, "Style", "[]");
 Memo1->Font =  FontDialog1->Font;
 ff=Memo1->Font->Name;
 cc=ColorToString(Memo1->Font->Color);
 ss=Memo1->Font->Size;

И не кажется, ли Вам , что использовать Label для вызова диалога настройки шрифта  это  выглядит весьма странно smile  Обычно для этого используется  Button (кнопка)
Код

void __fastcall TForm5::Label1Click(TObject *Sender)
{
if(FontDialog1->Execute())
{
 


И зачем Вы постояннн используете промежуточные переменные  ff, cc, ss? Ведь в любой момент Вы можете непосредственно взять эту информацию из того же Memo1->Font непосредственно перед сохранением в ини-файл

docwar,   мне кажется, что Вы просто не совсем понимаете, что  сами  делаете.
Судя по этому и другим топикам Вам следует для начала ознакомится с базовыми понятиями ООП и С++. Иначе в этом топике все сведется к тому же, что и в топике с гридом: кто-то не выдержит и напишет Вам весь код. Это кстати небольшой труд. Займет от силы минут 5. Но зачем это Вам? Надеюсь Ваша цель - научиться программировать, а не копировать чужой код.







--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Bima
Дата 14.11.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Хотел бы написать пару строк на последние сообщения и просто обратится к автору программы.
Приминительно к последнему топику, а именно обращаюсь к Vyacheslav: зря вы так. Не все программируют на том уровне, что и вы (судя по колличеству заметок, которые вы здесь с легкостью оставляете).
Приминительно к данной теме могу написать:
Цитата

И зачем Вы постояннн используете промежуточные переменные  ff, cc, ss? Ведь в любой момент Вы можете непосредственно взять эту информацию из того же Memo1->Font непосредственно перед сохранением в ини-файл

Для отладки программы, это самый легкий способ отследить переменную, если вставлять Break point (хотя конечно можно пользоваться и Debug window, но это на любителя)
Цитата

docwar,   мне кажется, что Вы просто не совсем понимаете, что  сами  делаете.

Многие сюда обращаются, что бы воспользоваться советом, НО НЕКТОРЫЕ не настолько сильны в программировании, что бы понять схду код, который здесь напишут. (не про себя пишу smile )

Цитата

кто-то не выдержит и напишет Вам весь код

впринципе это наверно идельное решение для того, кто спрашивает. И я понимаю тех, для кого написать код за пять минут вызывает раздражение. Если допустим я начинаю помогать советом или кодом программы, то это не значит, что я буду тыкать мордой в монитор по поводу компьютерной безграмотности.

Цитата

Надеюсь Ваша цель - научиться программировать, а не копировать чужой код

Инетресно, а как нучиться тонкостям языка, если не применять чужой код???
Иногда здесь я встречаю намного оптимизированный код, по сравнению со своим (который был написан давно). Естественно, я буду его использовать.

Теперь автору заметки:
Было бы неплохо если бы ты повнимательней читал советы.



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Vyacheslav
Дата 14.11.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Bima @  14.11.2006,  15:03 Найти цитируемый пост)
Приминительно к последнему топику, а именно обращаюсь к Vyacheslav: зря вы так. Не все программируют на том уровне, что и вы (судя по колличеству заметок, которые вы здесь с легкостью оставляете).

Ну что вы. Я за четыре с лишним года оставил меньше 1300 сообщений. Вы за три месяца 190. Так что максимум через года полтора Вы спокойно переплюнете smile Я отвечаю обычно только на интересные вопросы или помогаю решить проблемы, которые не связаны с элементарным незнанием С++.
А вопрос этого топика был действительно не ординарен. Но к моему большому сожалению, интересные вопросы встречаются все реже. 

Цитата(Bima @  14.11.2006,  15:03 Найти цитируемый пост)
Многие сюда обращаются, что бы воспользоваться советом, 

Это верно. Только "что бы воспользоваться советом" очень часто требуется иметь хотя бы определенный базовый уровень.
Цитата(Bima @  14.11.2006,  15:03 Найти цитируемый пост)
Инетресно, а как нучиться тонкостям языка, если не применять чужой код???

Наверное анализировать, разбирать его по косточкам и творчески применять в своем приложении, а не использовать "copy-past"




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 14.11.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Vyacheslav @  14.11.2006,  11:01 Найти цитируемый пост)
кто-то не выдержит и напишет Вам весь код. Это кстати небольшой труд. Займет от силы минут 5

Короче, будем считать, что не выдержал я  smile , после критики Bima
Код

/---------------------------------------------------------------------------

#ifndef Unit24H
#define Unit24H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <IniFiles.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TMemo *Memo1;
    TButton *Button1;
    TFontDialog *FontDialog1;
    void __fastcall Button1Click(TObject *Sender);
private:
    void __fastcall RestoreFont(TFont*);    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
private:
    TIniFile* m_IniFile;
    void __fastcall SaveFont(TFont* AFont);
    __fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Код

/---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit24.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
const String c_FileName =  "C:/nazvanie.ini";
const String c_SectionName = "Font";
const String c_Name = "Name";
const String c_Size = "Size";
const String c_Color = "Color";
const String c_Style = "Style";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner), m_IniFile( new TIniFile(c_FileName) )
{
   RestoreFont(Memo1->Font);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RestoreFont(TFont* AFont)
{
   AFont->Name = m_IniFile->ReadString(c_SectionName, c_Name, "MS Sans Serif");
   AFont->Size = m_IniFile->ReadInteger(c_SectionName, c_Size, 8 );
   AFont->Color = m_IniFile->ReadInteger(c_SectionName, c_Color, 0);
   SetSetProp(AFont, c_Style, m_IniFile->ReadString(c_SectionName, c_Style, "[]"));
}

void __fastcall TForm1::SaveFont(TFont* AFont)
{
    m_IniFile->WriteString(c_SectionName, c_Name, AFont->Name );
    m_IniFile->WriteInteger(c_SectionName, c_Size, AFont->Size );
    m_IniFile->WriteInteger(c_SectionName, c_Color, AFont->Color );
    m_IniFile->WriteString(c_SectionName, c_Style, GetSetProp(AFont, c_Style, "[]") );
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    FontDialog1->Font = Memo1->Font;
    if( FontDialog1->Execute() )
    {
         Memo1->Font = FontDialog1->Font;
    }
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    SaveFont(Memo1->Font);
    delete  m_IniFile;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.