|
[ DART_VEJDER @ 02.06.2005. 15:24 ] @
| kompjuter za svaku boju ima odredjeni kod...
kako bih mogao upisati u neki txt fajl npr boju koja se trenutno koristi u aplikaciji?
npr. imam richedit komponentu, i hocu da mi se u neki txt fajl upise odredjena vrijednost kojom kompjuter prepoznaje koja je boja u pitanju...
fora je u tome sto bih htio napraviti da mi kasnije, pri ucitavanju, aplikacija procita vrijednost iz toga fajla i dodjeli aplikaciji onu boju koja ima istu vrijednost kao kod u txt fajlu...isto bih htio napraviti i za font (vrsta fonta, velicina fonta, boja fonta)...
pa ako bi me ko znao usmjeriti kad su ovih par stvari u pitanju, bio bih jako zahvalan... |
[ itf @ 02.06.2005. 15:31 ] @
Svaka boja ti je, zapravo, RGB kombinacija (cesto se korisiti i TColor za reprezentaciju). Znaci, da bi u datoteku upisao neku boju trebao bi znati tu RGB kombinaciju. Medjutim, Ti mozes reci da ti u datoteku snimi npr.
// napamet pisem clan za boju...
(double)this->Color;
Ti ces tada zapisati samo jedan broj u datoteku koji ce predstavljati sva tri dijela R G i B. Isto tako i kad citas. Procitas taj jedan broj i odjednom imas cijelu RGB kombinaciju (koju ces upotrijebiti kako hoces).
[ X Files @ 02.06.2005. 16:35 ] @
Predlazem ti da za snimanje/ucitavanje poslednje koriscenih osobina
koristis TIniFile klasu. Pogledaj Help, sve je lepo objasnjeno. Dakle radi se
o INI datotekama, koje imaju sekciju, kljuc i vrednost:
[SEKCIJA]
KLJUC=VREDNOST
C++Builder / VCL poseduje vec gotove funkcije:
ColorToString()
StringToColor()
...za takve manipulacije. Prednost ovih funkcija je sto ce raditi i za vrednosti
koje su upisane u nekom HEX formatu RGB (u C++ Buildersu su zapravo
0x00BBGGRR), ali i za opisne tipa 'clMoneyGreen'.
[Ovu poruku je menjao X Files dana 02.06.2005. u 17:46 GMT+1]
[ X Files @ 02.06.2005. 16:45 ] @
Da bi probao ovo sto sam gore napisao probaj recimo ovo:
Stavi dve TLabel komponente (Label1 i Label2)
Svati dve TEdit komponente (Edit1 i Edit2), i u prvu (kao default tekst) upisi
0x000000FF a u drugu clRed
Zatim stai jedan TButton (Button1) i u njega kod:
Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Font->Color = StringToColor( Edit1->Text ); // Edit1: 0x000000FF
Label2->Font->Color = StringToColor( Edit2->Text ); // Edit2: clRed
}
[ Mirko Rajkovača @ 03.06.2005. 18:04 ] @
X Files je u pravu, najlakse ti je da koristis TIniFile. Boje moze snimati/ucitavati i na sledeci nacin:
TIniFile *ini=new TIniFile("colors.ini");
ini->WriteInteger("Section","Key",Memo1->Color);//pisanje u ini file
Memo1->Color=ini->ReadInteger("Section","Key",0);//citanje boje
delete ini;
U ovom slucaju ti boju pamti kao integer,ali radi bez problema.
[ DART_VEJDER @ 04.06.2005. 14:22 ] @
hvala vam puno!!
ovo je ono sto mi je trebalo!!
sve sam napravio sta mi je trebalo, ali evo sada jdno pitanje oko kojeg glavu razbijam vec nekoliko sati:
zasto ovo nece da radi:
napravio sam RichEdit komponentu i dugme koje zove FontDialog, na ovaj nacin:
--------------
if(FontDialog1->Execute());
{
RichEdit1->Font=FontDialog1->Font;
}
--------------
i pri izlazu, u INI fajl se upisuje sljedece:
------------------------------------------------------------------------
TIniFile *ini=new TIniFile("IME_FAJLA.ini");
ini->WriteInteger("font","boja",RichEdit1->DefAttributes->Color);
ini->WriteInteger("slova","visina",RichEdit1->DefAttributes->Height);
ini->WriteString("karakteri","ime",RichEdit1->DefAttributes->Name);
delete ini;
--------------
a pokusavao sam i sa:
--------------
TIniFile *ini=new TIniFile("IME_FAJLA.ini");
ini->WriteInteger("font","boja",FontDialog1->Font->Color);
ini->WriteInteger("slova","visina",FontDialog1->Font->Height);
ini->WriteString("karakteri","ime",FontDialog1->Font->Name);
delete ini;
----------------------------------------------------------------------
a pri podizanju se ucitava na sljedeci nacin:
----------------------------------------------------------------------
TIniFile *ini=new TIniFile("IME_FAJLA.ini");
RichEdit1->DefAttributes->Color=ini->ReadInteger("font","boja",0);
RichEdit1->DefAttributes->Height=ini->ReadInteger("slova","visina",0); //ili ("slova","visina",10)
RichEdit1->DefAttributes->Name=ini->ReadString("karakteri","ime",0); //ili ("karakteri","ime",Verdana)
delete ini;
---------------
tj. pokusavao sam i sa:
---------------
TIniFile *ini=new TIniFile("IME_FAJLA.ini");
RichEdit1->Font->Color=ini->ReadInteger("font","boja",0);
RichEdit1->Font->Height=ini->ReadInteger("slova","visina",0);
RichEdit1->Font->Name=ini->ReadString("karakteri","ime",0);
delete ini;
--------------------------------------------------------------------
ali ovo , jednostavno , nece da radi!!!!!
tj. radi ponekad...
prvo...u ini fajl aplikacija ZAPISE, cini mi se svaki put, ime fonta koji koristim...
dobro...boja fonta je neki broj...(cesto veoma velik- u stotinama hiljada, pa cak i veoma cesto, tj skoro uvijek i u milionima) (zapitam se: kakav je to integer??? :-) to i ne moze biti integer,on je puno manji...)
a visina fonta je takodje neki broj (nikad se ne podudara sa onom velicinom fonta koju sam odabrao, a cesto je i sa predznakom MINUS)
e sad se ja pitam...GDJE sam pogrijesio??? ako neko uoci gresku, molio bih ga da mi to javi, kako bih je mogao otkloniti...
[ X Files @ 05.06.2005. 19:48 ] @
Citat:
if ( FontDialog1->Execute() );
{
RichEdit1->Font=FontDialog1->Font;
}
Ovo je OK. U principu se cela struktura Font objekta prenosi u RichEdit.
Citat:
TIniFile *ini=new TIniFile("IME_FAJLA.ini");
Dve zamerke:
1) Kada je u pitanju otvaranje nekih datoteka u Windows-ima *uvek*
koristi pune putanje. Dakle, ispred "IME_FAJLA.ini" treba da dodaš kod
koji će osigurati *tačnu putanju*. U kodu koji sam dole ostavio možeš da vidiš
kako se to može uraditi.
2) Kada je u pitanju otvaranje nekih datoteka u Windows-ima *uvek*
treba da imaš neki sigurnosni kod, jer ukoliko je tvoja datoteka pri učitavanju
ekskluzivno zauzeta od nekog drugog programa, ili je "read only" dolazi do
sistemske greške i program može da prestane da se ponaša kako si zamislio, ako
to nisi predvideo. Takođe pogledaj moj kod.
Ne bi bilo zgorega da pogledaš šta je to RAII u smilsu sigurnosti C++ koda.
Citat:
ini->WriteInteger("font","boja",RichEdit1->DefAttributes->Color);
Dakle, kao što rekoh koristi StringToColor() i ColorToString(). Pametno je držati
se rešenja koja su *standardna* u nekoj biblioteci klasa. Sve to može i sa Integer
ali...
Evo nešto koda...
Code:
// ...
#include <IniFiles.hpp>
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( FontDialog1->Execute() );
{
RichEdit1->Font = FontDialog1->Font;
}
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TIniFile *pIni = NULL;
try
{
try
{
pIni = new TIniFile( ExtractFilePath( ParamStr(0) ) + "konfiguracija.ini" );
RichEdit1->Font->Name = pIni->ReadString( "RichEdit", "Name", "Arial" );
RichEdit1->Font->Color = StringToColor( pIni->ReadString( "RichEdit", "Color", "clBlack" ) );
RichEdit1->Font->Height = pIni->ReadInteger( "RichEdit", "Height", -11 );
}
catch ( const Exception &e )
{
// Moze neka poruka o gresci...
}
}
__finally
{
if ( pIni )
delete pIni;
}
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
TIniFile *pIni = NULL;
try
{
try
{
pIni = new TIniFile( ExtractFilePath( ParamStr(0) ) + "konfiguracija.ini" );
pIni->WriteString( "RichEdit", "Name", RichEdit1->Font->Name );
pIni->WriteString( "RichEdit", "Color", ColorToString( RichEdit1->Font->Color ) );
pIni->WriteInteger( "RichEdit", "Height", RichEdit1->Font->Height );
}
catch ( const Exception &e )
{
// Moze neka poruka o gresci...
}
}
__finally
{
if ( pIni )
delete pIni;
}
}
[ DART_VEJDER @ 06.06.2005. 21:09 ] @
hvala, pogledacu!!!
nadam se da nece ponovo nesto zapeti...
[ itf @ 07.06.2005. 14:43 ] @
Kada ucitavas iz INI datoteke i to pridjeljujes RichEdit komponenti izbaci onaj 'DefAttributes'. Adresiraj se direktno na Font clan RichEdit objekta.
[ DART_VEJDER @ 07.06.2005. 17:18 ] @
hvala vam puno na odgovorima!!!!
pa i jesam izbacio defattributes, i uradio kako ti predlazes...
samo jedna napomena:
i nije bas mozda dobra kombinacija:
if(FontDialog1->Execute())
{
RichEdit1->Font->FontDialog1->Font;
}
jer se desava sljedece...Kada se pritisne "ok", normalno font dobija izgled kakav smo i stavili da bude (boja, velicina, ime fonta...) ALI problem nastaje kada stisnemo "cancel"!! Tada font dobija takodje novi izgled, i to u zavisnosti gdje je bilo potamljeno na raznim sekcijama font dialoga, umjesto da se samo vratimo nazad...Normalno oni koji se vec dugo bave Borland builder-om to znaju, ali ja sam to tek nedavno primjetio...
Ako bi ko od iskusnijih zelio objasniti kako to da se rijesi, bio bih jako zahvalan...
za apply znam rijesiti, ali ne znam za Cancel....
[ X Files @ 07.06.2005. 18:28 ] @
Stavi:
Code:
FontDialog1->Font = RichEdit1->Font;
ispred
if ( FontDialog1->Execute() );
dakle:
Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FontDialog1->Font = RichEdit1->Font;
if( FontDialog1->Execute() );
{
RichEdit1->Font = FontDialog1->Font;
}
}
[ X Files @ 07.06.2005. 20:25 ] @
Našao sam grešku :) Da puknem od muke...
U tvom PRVOM kodu, koji sam kopirao od tebe, stavio si TAČKA ZAREZ tamo gde
ne treba:
Code:
if(FontDialog1->Execute()); < --- UKLONI TAČKA ZAREZ
{
RichEdit1->Font=FontDialog1->Font;
}
... i sve će raditi kako treba!
[ DART_VEJDER @ 08.06.2005. 11:54 ] @
da, da... to je to!!!!!
sada je sve u redu!!!!ne mogu da vjerujem sta nas je sve uspjelo, bar na trenutak, zeznuti...
hvala puno!!!!!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|