[ Barni Kamenko @ 07.06.2009. 16:17 ] @
Pokusavam da napravim program koji ce iz jednog txt fajla punog raznih podataka sastavljati ugovor tako sto menja neke reci u template.rtf fajlu. Pokusao sam sledece sto se cinilo kao logicno, ali Insert i Delete kao da ne rade, prodje kompajliranje ali ne obavi posao.... Jel zna neko zasto, i kako to ispraviti??


//kada se otvori txt fajl, on treba da se prikaze u
void __fastcall TForm1::OtvoriClick(TObject *Sender)
{
if( OpenDialog1->Execute() == True )
{ int c= 0;

rtf->Lines->LoadFromFile("template.rtf"); //richedit koji ispise sadrzaj template.rtf, i njega treba menjati
c = rtf->Text.Pos("zstpnk") ; //rec zstpnk treba zameniti sadrzajem richedit-a "Zastupnik"
rtf->Text.Delete(c,6); //ovo prodje kompajliranje, ali ne uradi nista
rtf->Text.Insert(Zastupnik->Lines->GetText(),Zastupnik->Text.Length()); //i ovo prodje kompajliranje, ali ne uradi nista

}
}

Molim za pomoc, gubim zivce :)))
[ X Files @ 07.06.2009. 17:01 ] @
// NETESTIRANO
Code:

// ...
RichEdit1->Lines->LoadFromFile( ... );
// ...
AnsiString StaSeTrazi = "zstpnk";
AnsiString NoviTekst  = "Zastupnik";

TSearchTypes vrsta_pretrage = TSearchTypes() << stMatchCase;

int Pozicija = RichEdit1->FindText( StaSeTrazi, 0, RichEdit1->GetTextLen(), vrsta_pretrage );

if ( Pozicija != -1 )
{
    RichEdit1->SelStart = Pozicija;
    RichEdit1->SelLength = StaSeTrazi.Length();
    RichEdit1->SelText = NoviTekst;
    // ...
    RichEdit1->Lines->SaveToFile( ... );
}
// ...
[ Barni Kamenko @ 07.06.2009. 17:42 ] @
Ne radi, ali kombinacija tvog i mog koda radi. Hvala puno, kasnije cu okaciti ispravan kod. Mada i dalje ne prebacuje nase znake ispravno.
ć pretvori u ?.... Jel postoji tu neka fora, ne bih da menjam nasa slova sa c,s i sl.
[ X Files @ 07.06.2009. 18:23 ] @
^
Pretpostavljam da treba:
Control Panel > Rergional and language options > Advanced > Language for non-unicode programs > Serbian Latin
[ Barni Kamenko @ 08.06.2009. 23:16 ] @
Tacno, hvala. Evo i koda, ako neko bude imao slican problem

AnsiString StaSeTrazi = "zstpnk";
AnsiString NoviTekst = "Zastupnik";

Pozicija = rtf->Text.Pos("zstpnk") ;
if ( Pozicija != -1 )
{
RichEdit1->SelStart = Pozicija;
RichEdit1->SelLength = StaSeTrazi.Length();
RichEdit1->SelText = NoviTekst;
// ...
RichEdit1->Lines->SaveToFile( ... );
}
// ...
[ Barni Kamenko @ 09.06.2009. 00:12 ] @
JOS JEDNO PITANJE: dosao sam do momenta kad treba da granam program u zavisnosti od odgovora korisnika. Posto nemam mnogo iskustva, narocito u builderu (do sada sam sve radio u konzolnim aplikacijama), ne znam kako da postavim pitanje u pop-up dialogu. pitanje treba da bude: zelite li opciju A ili opciju B, i treba da budu dva dugmeta, A i B, pa kad klikne na jedno da se programnastavi svojim smerom..
Malo sam konfuzno objasnio... :)
[ X Files @ 09.06.2009. 06:20 ] @
Ako misliš na obične Yes/No/... dijaloge, imaš nekoliko solucija:

Pogledaj VCL Help u vezi sledećih funkcija, ima i primera:
MessageBox()
MessageDlg()

(Prva je API bazirana iako je wrapovana u VCL, a druga je čisto VCL bazirana)

Za detalje u vezi dijaloga, šaljem dva PDF fajla i jedan primer gde je urađeno nekoliko složenijih primera, pa čak i kako da uradiš svoj Message Box od nule.



[ Barni Kamenko @ 10.06.2009. 18:58 ] @
Uspeo, hvala za pomoc.
Jos jedna stvar. Trebam u jednom txt fajlu da promenim sve '\' u 'Đ' ali ne mogu jer mi javlja gresku kad karakteru dodelim vrednost \

[C++ Error] Unit1.cpp(84): E2380 Unterminated string or character constant

jasno mi je zasto javlja ali ne znam kako da je izbegnem... Ako mi i ovde pomognete prestacu da smaram :)))
[ X Files @ 10.06.2009. 19:34 ] @
Umesto:
'\'

Probaj:
'\\'

;)
[ Barni Kamenko @ 10.06.2009. 21:32 ] @
Genijalno!!! :) Hvala po ko zna koji put :)
[ Barni Kamenko @ 12.06.2009. 13:12 ] @
E SAD IMAM NAJSTRASNIJI PROBLEM!!!

Napisao sam program i na mom racunaru radi perfektno (AMD Athlon x2), bez greske (za sada). Medjutim na drugom racunaru (Intel celeron, preskace neke funkcije i javlja da float-ovi nisu u dobrom formatu...) Zasto to, kako to ispraviti??? Program je pisan u c++ borland builderu
[ Mihajlo Cvetanović @ 12.06.2009. 13:41 ] @
Možda imaš neku float članicu neke klase koja nije lepo složena na adresu deljivu sa 4. Da bi ovo proverio možeš ili da nateraš kompajler da lepo složi članice, korišćenjem #pragma pack direktive (bar je tako u VC++), ili da staviš sve floate svih klasa na početak klase, pre svih drugih članica. Da li možeš da debaguješ .dmp fajl kada ti pukne program (to jest da li program puca, ili se desi nešto drugo)? Da li možeš da lociraš taj float koji pravi problem?
[ Barni Kamenko @ 19.07.2009. 16:34 ] @
Ispostavilo se da su local settings bili tako namesteni na tom racunaru da je '.' tretirana kao ',' i obrnuto. Namestio sam kako treba i sad je OK. Eto, mozda neko bude imao slican problem...
[ Barni Kamenko @ 06.04.2010. 17:04 ] @
Posle duže vremena, ozbiljan problem oko istog programa....

Do sada je sve super funkcionisalo: u jednom RichEdit-u se otvori unapred pripremljeni .txt fajl, i onda se odatle na zadata mesta u drugom RichEdit-u kopiraju potrebni podaci.

Problem je sledeci: RANIJE JE TAJ .TXT FAJL BIO LATINIČNI, A SAD JE ĆIRILIČNI I NE MOGU NIKAKO DA GA OTVORIM U RICHEDIT-u!!! Podesio sam sve na eastern europe fonts, u RichEdit mogu pisati ćirilicu, ali ne mogu otvoriti ćirilični fajl. Ima li tu jos neka caka za koju ne znam? Isprobavao sam i kodne strane, nista nije upalilo... Kada otvorim fajl, pojavi se samo jedan simbol "яю"

Koristim XP, u pitanju je Borland Builder 6, molim za pomoć ako neko ima ideju, hitna je stvar

[ Mihajlo Cvetanović @ 06.04.2010. 17:38 ] @
Moraš da budeš precizan oko tog ćiriličnog formata txt fajla. Txt fajl je možda UTF-16 (što se u Microsoftu zove Unicode), možda je UTF-8, a možda je čak pisan na kodnoj strani 1251 (nadam se da nije). S druge strane tvoja aplikacija je možda Unicode, a možda i nije. Ukupno imaš 3x2=6 mogućih slučajeva. Sve će lepo da radi ako su i txt fajl i tvoja aplikacija Unicode (i ovu kombinaciju ti toplo preporučujem), i to pod uslovom da txt fajl nema takozvani BOM na početku fajla. Sve će raditi i ako je txt fajl pisan u onoj kodnoj stranici u kojoj se na tvom Windowsu izvršavaju non-Unicode aplikacije (ovo nije najsrećnije rešenje, ali bar radi). Za sve ostale kombinacije moraćeš da isprogramiraš nekakvu konverziju podataka (WideCharToMultiByte i MultiByteToWideChar) da bi RichEdit lepo video sadržaj txt fajla.
[ Barni Kamenko @ 06.04.2010. 17:50 ] @
Text fajl je Unicode, ali koliko vidim, Borlan ne podrzava unicode aplikacije.
Posto se program izvrsava na jednom racunaru, nije problem namestiti code page koji je potreban, ali meni to i dalje ne radi. Dakle, ja u Richtext MOGU sam da upisujem cirilicu, ali NE MOGU da otvorim cirilicni tekstualni file.

I sta je taj BOM? kao sto rekoh, meni se pojavljuje samo jedan karakter, da nije sve zbog tog BOM-a?

Nasao sam neke .pas fajlove koji navodno resavaju ove probleme:
http://arhiva.elitesecurity.or...kojima-treba-Unicode-za-Delphi
Jos samo da skontam kako se koriste :)

[Ovu poruku je menjao Barni Kamenko dana 06.04.2010. u 19:42 GMT+1]
[ Mihajlo Cvetanović @ 06.04.2010. 20:42 ] @
BOM je Byte Order Mark, to je fora da označi format teksta (UTF-8, UTF-16LE, UTF-16BE). Ono što je u Windowsu Unicode je zapravo UTF-16LE (Little Endian). Pogledaj na guglu za sve što ti nije jasno. Na Guglu sam i video da su slova яю zapravo BOM za Unicode (0xFF 0xFE), i to kada ta dva bajta čitaš u ćiriličnoj kodnoj stranici. Ne znam kako se uključuje Unicode na Borlandu, možda neko drugi zna, ali sigurno je prosto neka opcija.
[ Barni Kamenko @ 07.04.2010. 14:10 ] @
ipak cu ovako... mislim da je ipak tako najjednostavnoje

kretacu se kroz fajl karakter po karakter. ako hex vrednost karaktera odgovara odredjenom cirilicnom slovu, upisacu odgovarajuce latinicno slovo. to bi trebalo da radi...

e, sad, opet problem
isprobao sam na nekoliko karaktera i ispada da se hex vrednosti ne podudaraju iako u tabeli pise da je tako... sve radi ali
if (k[0] == 0x0426) k[0]='S';
jednostavno biva ignorisan.
Ima li nekog saveta?
Ima da batalim programiranje zauvek :)
[ Mihajlo Cvetanović @ 07.04.2010. 14:57 ] @
Prvo, to što radiš ne da nije jednostavnije, nego je sumanuto. Uostalom, kako ćeš da prevedeš ćirilična slova nj, lj i dž?

Ako ti neka oblast znanja treba da bi rešio problem onda savladaj tu oblast. Nemoj da kalemiš svoje postojeće znanje na svaki novi problem. Prvo, dobijaćeš polovična rešenja, a drugo tako ništa nećeš naučiti. Ako zapneš kod neke prepreke onda kopaj dublje i šire, traži pomoć, i napadni prepreku. Nemoj da odustaješ samo zato što ti se trenutno čini da je problem komplikovan. Ako si novajlija u programiranju onda prosto nemaš dovoljno znanja da zaključiš šta je stvarno komplikovano. Zato smo mi ostali tu.

Drugo, nešto nije u redu sa if primerom koji si dao. Prvo k[0] porediš sa short vrednošću, a onda mu dodeljuješ char vrednost. Čudi me da ti se kompajler ne žali. Kog je tipa k?

Treće, da bi lakše debagovao nikad ne stavljaj više instrukcija u istu liniju. U tvom slučaju instrukciju k[0]='S' stavi u sledeću liniju. Tako ćeš znati da li se ta instrukcija izvršava, ili if uslov uopšte nije ni zadovoljen.
[ Mihajlo Cvetanović @ 07.04.2010. 15:00 ] @
Inače, koje je godište taj Borland što ga koristiš?
[ Barni Kamenko @ 07.04.2010. 16:59 ] @
Ma to sam vec skontao... Smislio sam kako da odradim, i sve je radilo osim velikog K. katastrofa. Moram neki drugi nacin pronaci. Borland je iz 2002. - 2003. godine otprilike, verzija 6. Moram jos cackati po netu... Hvala na savetu, skroz si u pravu
[ X Files @ 07.04.2010. 20:52 ] @
Maločas sam izvršio test:

1. Kreirao ćirilični RTF (žšđč掊ĐČĆ) <--- ovde je ćirilica
2. Napravio ovaj kod (Document.RTF je u istom folderu gde i EXE, šaljem ga u prilogu):
Code (cpp):

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->Lines->LoadFromFile("Document.rtf");
}
 

3. Kliknuo na Button1
4. Ćirilica se prikazala u RichEdit1 objektu


Inače, XP je podešen ovako:
http://www.elitesecurity.org/p2300219


AKo se ne varam, TRichEdit u BCB6 je zasnovan na verziji 2 Windows richedit dll-a, pa nema Unicode podršku. Ili pronađi Unicode verziju RichEdit komponente, ili pređi na novu verziju BCB ili podesi XP kao ja.
[ Barni Kamenko @ 07.04.2010. 22:27 ] @
Vidi stvarno otvara .rtf, a .txt nece pa nece...
Hvala puno
[ X Files @ 08.04.2010. 07:25 ] @
TRichEdit za BCB6 je zasnovan na nekoj prepotopskoj verziji Windows-ovog RICHED32.DLL-a, tako da su sva ogranicenja projektovana i na Borlandov TRichEdit.

Ovde je tip (pored ostalog) opisao neke nacine kako se moze iskoristiti noviji DLL:
http://bellsouthpwp2.net/r/e/rediv/Yacs.html

Ipak, najelegantnije je naci neku besplatnu modernu verziju TRichEdit-a ili preci na novije okruzenje.
[ tkaranovic @ 09.04.2010. 04:34 ] @
Može da se konvertuje tekst fajl u rtf. Uzme se rtf kao taj što je poslao X files, odvoji "zaglavlje" od kraja a u sredinu se ubaci tekst. Tekst se konvertuje u kodove, gde je malo a: \'e0, malo b je: \'e1. Ostali kodovi su u nastavku a \par je za novi red. Ništa drugo nije potrebno za konvertovanje i tako se može dobiti ćirilični rtf koji se učitava.

Na codesearch mogu da se nađu slični primeri:

Code:

//---------------------------------------------------------------------------
//This function writes the complex number into the RichEdit
void ComplexToRTF(Func32::Complex C, TRichEdit *RichEdit)
{
  const TData &Data = Form1->Data;
  //Create rtf string to everything to become bold
  //Font f0: MS Sans Serif
  //Font f1: Symbol
  AnsiString Str = "{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 MS Sans Serif;}{\\f1\\froman\\fprq2\\fcharset2 Symbol;}}\n\\f0\\fs18 ";

  switch(Data.Property.ComplexFormat)
  {
  case cfReal:
    //Check for an imaginary part
    if(std::abs(C.imag()) < MIN_ZERO)
      Str += RoundToStr(C.real(), Data);
    break;
  case cfRectangular:
  {
    //Round numbers to chosen number of decimals
    AnsiString Real = RoundToStr(C.real(), Data);
    AnsiString Imag = RoundToStr(std::abs(C.imag()), Data);

    if(Imag == "0" || std::abs(C.imag()) < MIN_ZERO)  //(-1.50)^2 = 2.25+2.4395E-19i
      Str += Real;
    else //If there is a imaginary part
    {
      if(Real != "0")
        Str += Real + (C.imag() < 0 ? '-' : '+');
      //Add imaginary part to string
      if(Imag != "1")
        Str += Imag;
      Str += "\\b i";
    }
    break;
  }
  case cfPolar: //Polar format
    //The complex number 0 does not have an angle
    if(C.real() == 0 && C.imag() == 0)
    {
      Str += '0';
      break;
    }

    Str += RoundToStr(abs(C), Data); //Get numeric value as a string
    //Add angle symbol to text in Symbol font
    Str += "\\f1\\fs20 \xD0\\f0\\fs18 ";
    if(Data.Axes.Trigonometry == Func32::Degree)
      //Add degree symbol, if angle is in degree
      Str += RoundToStr(std::arg(C) * 180 / M_PI, Data) + "\\f1\\fs20 \xB0";
    else
      Str += RoundToStr(arg(C), Data);
  }

  Str += "\n}";
  //Use stream to put data into RichEdit
  std::auto_ptr<TStringStream> Stream(new TStringStream(Str));
  RichEdit->Lines->LoadFromStream(Stream.get());
}



Ovaj primer ne radi baš to što se traži, samo je primer za formiranje rtf fajla.