21. R∙znΘ aplikace I
  1. V dalÜφ aplikaci se budeme zab²vat pracφ se soubory. Z existujφcφho textovΘho souboru se pokusφme vytvo°it nov² soubor s pozm∞n∞n²m obsahem. Program nazvan² FILTR umφ p°evΘst vÜechny znaky textovΘho souboru na velkß pφsmena, zv∞tÜit jen pφsmena ka₧dΘho prvnφho slova ve v∞t∞ nebo odstranit znaky z druhΘ Φßsti tabulky ASCII (pφsmena s hßΦky a Φßrkami). Vytvo°φme formulß° podle nßsledujφcφho obrßzku (je zde pou₧ita komponenta RadioGroup):


  2. U₧ivatel m∙₧e zadat nßzvy vstupnφho a v²stupnφho souboru ve dvou editaΦnφch ovladaΦφch nebo stisknutφm tlaΦφtka Zm∞nit otev°φt p°φsluÜnΘ dialogovΘ okno pro v²b∞r souboru. U komponenty OpenDialog nastavφme Options na [ofPathMustExist, ofFileMustExist] a u SaveDialog na [ofOverwritePrompt, ofPathMustExist, ofCreatePrompt]. Vlastnosti Filter u obou dialogov²ch oken nastavφme na Textov² soubor (*.txt). Obsluha stisku hornφho tlaΦφtka Zm∞nit bude tvo°ena p°φkazem (pro spodnφ tlaΦφtko ji vytvo°te sami):
    if (OpenDialog1->Execute()) Edit1->Text = OpenDialog1->FileName;
    Do soukromΘ Φßsti deklarace formulß°e vlo₧φme tyto deklarace:
    FILE *VstSoubor, *VystSoubor;
    int DelkaSouboru;
    void __fastcall PrevodVelka();
    void __fastcall PrevodPrvniVelk();
    void __fastcall PrevodSymb();
    Obsluha stisku tlaΦφtka P°evΘst je tvo°ena p°φkazy (je zobrazeno dialogovΘ okno, kterΘ bude popisovat proces p°evodu; tento dalÜφ formulß° bude obsahovat pouze komponentu ProgressBar a BitBtn s textem OK; tlaΦφtko zakß₧eme a obsluha jeho stisknutφ bude tvo°ena p°φkazem Close();):
    if ((Edit1->Text != "")&&(Edit2->Text != "")) {
      if ((VstSoubor = fopen(Edit1->Text.c_str(), "rt")) == NULL){
        ShowMessage("Nelze otev°φt vstupnφ soubor.");
        return;
      }
      fseek(VstSoubor, 0L, SEEK_END);
      DelkaSouboru = ftell(VstSoubor);
      fseek(VstSoubor, 0L, SEEK_SET);
      if ((VystSoubor = fopen(Edit2->Text.c_str(), "wt")) == NULL){
        ShowMessage("Nelze otev°φt v²stupnφ soubor.");
        return;
      }
      Form2->Show();
      Form2->BitBtn1->Enabled = false;
      Button3->Enabled = false;
      switch (RadioGroup1->ItemIndex) {
        case 0: PrevodVelka(); break;
        case 1: PrevodPrvniVelk(); break;
        case 2: PrevodSymb(); break;
      }
      fclose(VstSoubor);
      fclose(VystSoubor);
      Form2->BitBtn1->Enabled = true;
      Button3->Enabled = true;
    }
    else ShowMessage("Zadej jmΘna soubor∙.");
    Zb²vß jeÜt∞ vytvo°it t°i metody provßd∞jφcφ po₧adovan² p°evod. Nßsleduje v²pis t∞chto metod (je zde i pomocnß funkce p°evßd∞jφcφ velkß pφsmena na malß):
    char __fastcall LowCase(char Zn)
    {
      if ((Zn >= 'A') && (Zn <= 'Z')){return Zn - 'A' + 'a';}
      else return Zn;
    }
    void __fastcall TForm1::PrevodVelka()
    {
      int Pozice = 0;
      while (!feof(VstSoubor)) {
        fputc(UpCase(fgetc(VstSoubor)), VystSoubor);
        Pozice++;
        Form2->ProgressBar1->Position = Pozice * 100 / DelkaSouboru;
        Application->ProcessMessages();
      }
    }
    void __fastcall TForm1::PrevodPrvniVelk()
    {
      int Pozice = 0;
      char Zn;
      bool Tecka = true;
      while (!feof(VstSoubor)) {
        Zn = fgetc(VstSoubor);
        if ((Zn >= 'A') && (Zn <= 'Z')){
          if (Tecka) {fputc(Zn, VystSoubor); Tecka = false;}
          else {fputc(LowCase(Zn), VystSoubor); Tecka = false;}
        }
        else if ((Zn >= 'a') && (Zn <= 'z')){
          if (Tecka) {fputc(UpCase(Zn), VystSoubor); Tecka = false;}
          else {fputc(Zn, VystSoubor); Tecka = false;}
        }
        else if ((Zn == '.') || (Zn == '?') || (Zn == '!'))
          {fputc(Zn, VystSoubor); Tecka = true;}
        else {fputc(Zn, VystSoubor);}
        Pozice++;
        Form2->ProgressBar1->Position = Pozice * 100 / DelkaSouboru;
        Application->ProcessMessages();
      }
    }
    void __fastcall TForm1::PrevodSymb()
    {
      int Pozice = 0;
      int Zn;
      while (!feof(VstSoubor)) {
        Zn = fgetc(VstSoubor);
        if (Zn < 128) fputc(Zn, VystSoubor);
        Pozice++;
        Form2->ProgressBar1->Position = Pozice * 100 / DelkaSouboru;
        Application->ProcessMessages();
      }
    }
    Tφm je naÜe aplikace hotova a m∙₧eme ji vyzkouÜet. Pokuste se pochopit jak pracuje. V aplikaci se pracuje se soubory zp∙sobem pou₧φvan²m v C. Pokuste se tuto aplikaci zm∞nit tak, aby byly pou₧ity souborovΘ datovΘ proudy.
  3. Vedle pou₧φvßnφ textov²ch soubor∙ m∙₧eme takΘ b∞₧n²m zp∙sobem pou₧φvat binßrnφ soubory. Nejprve vytvo°φme aplikaci, kterß bude zobrazovat grafy (seznßmφme se s komponentou Chartfx) a pozd∞ji k tΘto aplikaci p°idßme mo₧nost uklßdat a naΦφtat zobrazenΘ hodnoty do a ze soubor∙. ZaΦneme s v²vojem novΘ aplikace. Formulß° zv∞tÜφme a umφstφme na nφ komponentu Chartfx (bude zabφrat asi hornφ dv∞ t°etiny formulß°e). Na zb²vajφcφ plochu formulß°e umφstφme jeÜt∞ komponentu StringGrid (s p∞ti sloupci a Φty°mi °ßdky, bez fixnφch °ßdk∙ a sloupc∙, bez posuvnφk∙ a k vlastnosti Options p°idßme hodnotu goEditing), komponentu ComboBox (vlastnost Style nastavφme na csDropDownList a prvky seznamu nastavφme na 1 û Lines, 2 û Bar, 3 û Spline, 4 û Mark, 5 û Pie, 6 û Area, 7 û Pareto, 8 û Scatter a 9 û HiLow) a tlaΦφtko s textem Aktualizuj. M°φ₧ku °et∞zc∙ m∙₧eme editovat a aby p°ijφmala pouze celß Φφsla musφme obslou₧it jejφ udßlost OnGetEditMask. Tuto obsluhu bude tvo°it p°φkaz:

  4. Value = "!09";
    Tφm mßme mo₧nost zadat do bun∞k m°φ₧ky jednomφstnΘ nebo dvojmφstnΘ Φφslo. P°i vytvß°enφ formulß°e vyplnφme m°φ₧ku nßhodn²mi hodnotami a volßnφm obsluhy stisku tlaΦφtka Aktualizuj tyto hodnoty zobrazφme v grafu. Do ve°ejnΘ Φßsti deklarace formulß°e p°idßme:
    bool Modifikovano;
    AnsiString AktualniSoubor;
    Obsluha OnActivate formulß°e bude tedy tvo°ena p°φkazy:
    Randomize();
    for (int I = 0; I < 5; I++)
      for (int J = 0; J < 4; J++)
        StringGrid1->Cells[I][J] = IntToStr(random(100));
    Button1Click(this);
    ComboBox1->ItemIndex = Chartfx1->ChartType - 1;
    Modifikovano = true;
    AktualniSoubor = "";
    a obsluhu stisku tlaΦφtka Aktualizuj tvo°φ p°φkazy (nßpov∞du k pou₧φvßnφ komponenty Chartfx vyvolßme stiskem F1 p°i vybranΘ komponent∞; nßpov∞da je ale urΦena pro Delphi):
    Chartfx1->OpenDataEx(COD_VALUES,5,4);
    for (int I = 0; I < 5; I++){
      Chartfx1->ThisSerie = I;
      for (int J = 0; J < 4; J++)
        Chartfx1->Value[J] = StrToIntDef(StringGrid1->Cells[I][J], 0);
    }
    Chartfx1->CloseData(COD_VALUES);
    Modifikovano = true;
    Zb²vß jeÜt∞ vytvo°it obsluhu udßlosti OnChange kombinovanΘho ovladaΦe. Tvo°φ ji p°φkazy:
    Chartfx1->ChartType = ComboBox1->ItemIndex + 1;
    Modifikovano = true;
    Tφm je tato Φßst aplikace hotova. VyzkouÜejte jak pracuje.
  5. Aplikaci vytvo°enou v p°edchozφm zadßnφ rozÜφ°φme o mo₧nost uklßdßnφ zobrazovan²ch dat do souboru. K aplikaci p°idßme nabφdku Soubor s volbami Otev°φt, Ulo₧it a Ulo₧it jako (m∙₧ete p°idat i volbu Konec) a p°idßme komponenty OpenDialog a SaveDialog (nastavφme vhodn∞ jejich vlastnosti). Obsluha volby Otev°it bude tvo°ena p°φkazy:

  6. FILE *LoadFile;
    if (OpenDialog1->Execute()) {
      AktualniSoubor = OpenDialog1->FileName;
      Caption = "Graf " + AktualniSoubor;
      if ((LoadFile = fopen(AktualniSoubor.c_str(), "rb")) == NULL){
        ShowMessage("Nelze otev°φt soubor");
        return;
      }
      int Hodnota;
      for (int I = 0; I < 5; I++)
        for (int J = 0; J < 4; J++){
          fread(&Hodnota, sizeof(Hodnota), 1, LoadFile);
          StringGrid1->Cells[I][J] = IntToStr(Hodnota);
        }
      fread(&Hodnota, sizeof(Hodnota), 1, LoadFile);
      ComboBox1->ItemIndex = Hodnota;
      Modifikovano = false;
      fclose(LoadFile);
      ComboBox1Change(this);
      Button1Click(this);
    }
    Zb²vajφcφ obsluhy vytvo°te sami a aplikaci vyzkouÜejte. Nahra∩te op∞t souborovΘ operace C souborov²mi datov²mi proudy.

  7. V p°edchozφ aplikaci jsme se seznßmili s komponentou Chartfx. Nynφ se touto komponentou budeme zab²vat podrobn∞ji.

  8. Graf vytvß°φme stejn²m zp∙sobem, jako pou₧φvßme jinΘ komponenty. Umφstφme komponentu na formulß° a nastavφme jejφ inicializaΦnφ vlastnosti.
    Po vytvo°enφ grafu je nutno alespo≥ specifikovat data, kterß chceme zobrazit (zatφm jsou zobrazovßna nßhodnß data). Pro specifikaci zobrazen²ch dat musφme pou₧φt vlastnost Value, tj. vlastnost, kterß musφ b²t pou₧ita jako pole vlastnostφ:
    Chart1->Value[nPoint] = dValue;
    Tento p°φkaz °φkß, ₧e hodnota dValue je hodnota bodu nPoint v sΘrii urΦenΘ vlastnostφ ThisSerie. Nap°. nßsledujφcφ p°φkazy nastavujφ bod 3 sΘrie 0 na hodnotu 10.5:
    Chart1->ThisSerie = 0;
    Chart1->Value[3] = 10.5;
    P°ed pou₧itφm tΘto vlastnosti je nutno zajistit, ₧e komunikaΦnφ kanßl ke komponent∞ je otev°en. To provedeme dvojicφ metod OpenDataEx a CloseData. K≤d nastavujφcφ data tedy bude vypadat nap°. takto:
    // Otev°enφ kanßlu hodnot specifikujφcφho 2 sΘrie a 7 bod∙
    Chart1->OpenDataEx(COD_VALUES,2, 7);
    // K≤d nastavujφcφ data
    Chart1->ThisSerie = 0;
    for (int i = 0; i < 7; i++)
     Chart1->Value[i] = 9;
    Chart1->ThisSerie = 1;
    for (int i = 0; i < 7; i++)
     Chart1->Value[i] = 15;
    // Uzav°enφ kanßlu hodnot
    Chart1->CloseData(COD_VALUES);
    Tφmto zp∙sobem se nastavujφ zobrazovanß data. M∙₧eme si to nynφ vyzkouÜet. ZaΦneme v²voj novΘ aplikace, na formulß° umφstφme komponentu ChartFX, zm∞nφme jejφ jmΘno na Chart1, zv∞tÜφme jejφ velikost tak, aby zabφrala v∞tÜinu plochy formulß°e a vytvo°φme obsluhu udßlosti OnActivate formulß°e s tφmto k≤dem:
    Chart1->OpenDataEx(COD_VALUES,2,8);
    Chart1->ThisSerie = 0;
    Chart1->Value[0] = 30;
    Chart1->Value[1] = 20;
    Chart1->Value[2] = 40;
    Chart1->Value[3] = 60;
    Chart1->Value[4] = 50;
    Chart1->Value[5] = 15;
    Chart1->Value[6] = 24;
    Chart1->Value[7] = 35;
    Chart1->ThisSerie = 1;
    Chart1->Value[0] = 45;
    Chart1->Value[1] = 60;
    Chart1->Value[2] = 30;
    Chart1->Value[3] = 60;
    Chart1->Value[4] = 80;
    Chart1->Value[5] = 45;
    Chart1->Value[6] = 15;
    Chart1->Value[7] = 45;
    Chart1->CloseData(COD_VALUES);
    Po spuÜt∞nφ aplikace jsou zde zadanß data zobrazena v grafu. VyzkouÜejte.
  9. Nynφ se budeme zab²vat zm∞nou dat zobrazen²ch v grafu v p°edchozφm kroku. Pro zm∞nu zobrazen²ch hodnot pou₧φvßme stejnΘ vlastnosti jako pro poΦßteΦnφ zadßvßnφ dat.

  10. Volßnφ OpenDataEx s nov²m poΦtem sΘriφ a bod∙ zruÜφ existujφcφ data a p°ipravφ komunikaΦnφ kanßl k p°ijetφ nov²ch dat.
    // Otevφrß kanßl hodnot specifikacφ 4 sΘriφ a 8 bod∙
    // Toto volßnφ zruÜφ existujφcφ data
    Chart1->OpenDataEx(COD_VALUES,4, 8);
    // K≤d nastavujφcφ data
    for (int i = 0; i < 4; i++){
     Chart1->ThisSerie = i;
     for (int j = 0; j < 8; j++){
      Chart1->Value[j] = 12;
     }
    }
    // Uzav°enφ kanßlu hodnot
    Chart1->CloseData(COD_VALUES);
    Pokud pouze chceme zm∞nit hodnoty beze zm∞ny poΦtu bod∙ nebo sΘriφ, pak m∙₧eme pou₧φt p°φznak COD_UNCHANGE, kter² znamenß, zachovßnφ star²ch dat s v²jimkou t∞ch, kterΘ zm∞nφme ve vlastnosti Value:
    // Otevφrß kanßl hodnot se zachovßnφm poΦtu sΘriφ a bod∙
    Chart1->OpenDataEx(COD_VALUES, COD_UNCHANGE, COD_UNCHANGE);
    // Modifikace po₧adovanΘho bodu
    Chart1->ThisSerie = 1;
    Chart1->Value[4] = 10.5;
    // Uzav°enφ kanßlu hodnot
    Chart1->CloseData(COD_VALUES);
    Budeme pokraΦovat ve v²voji aplikace z p°edchozφho bodu. Na formulß° p°idßme tlaΦφtko a vytvo°φme obsluhu jeho stisknutφ k≤dem:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      int i;
      double d1[8],d2[8];
      randomize();
      for(i=0; i<7; i++){
        d1[i] = random(100);
        d2[i] = random(100);
      }
      NastavNoveHodnoty(d1, d2);
    }
    Dßle vytvo°φme soukromou metodu formulß°e:
    void __fastcall TForm1::NastavNoveHodnoty(double *d1, double *d2)
    {
      int i;
      Chart1->OpenDataEx(COD_VALUES,2,8);
      Chart1->ThisSerie = 0;
      for (i=0; i<7; i++)
        Chart1->Value[i] = d1[i];
      Chart1->ThisSerie = 1;
      for (i=0; i<7; i++)
        Chart1->Value[i] = d2[i];
      Chart1->CloseData(COD_VALUES);
    }
    Nynφ aplikaci m∙₧eme op∞t vyzkouÜet. V₧dy p°i stisku tlaΦφtka se zm∞nφ zobrazenΘ hodnoty.
  11. Dßle se struΦn∞ seznßmφme s titulky a legendami grafu. Ke zm∞n∞ titulk∙ grafu nastavφme vlastnost Title s k≤dem titulku v indexu na nov² °et∞zec titulku, jak je ukßzßno dßle:

  12. Chart1->Title[CHART_LEFTTIT] = "Vydaje";
    Chart1->Title[CHART_BOTTOMTIT] = "Mesice";
    Pro zm∞nu legendy grafu pou₧ijeme vlastnost Legend pro jednotlivΘ body a vlastnost SerLeg pro jednotlivΘ sΘrie a k≤d zadßvajφcφ legendu m∙₧e vypadat takto:
    Chart1->Legend[0] = "Leden";
    Chart1->Legend[1] = "Unor";
    Chart1->Legend[2] = "Brezen";
    Chart1->Legend[3] = "Duben";
    Chart1->SerLeg[0] = "Prijmy";
    Chart1->SerLeg[1] = "Vydaje";
    P°ejdeme op∞t k naÜi aplikaci. P°idßnφ titulk∙ a legendy provedeme p°idßnφm nßsledujφcφho k≤du  na zßv∞r obsluhy udßlosti OnActivate formulß°e:
    Chart1->Title[CHART_LEFTTIT] = "Platby";
    Chart1->Title[CHART_BOTTOMTIT] = "Mesice";
    Chart1->Legend[0] = "Leden";
    Chart1->Legend[1] = "┌nor";
    Chart1->Legend[2] = "B°ezen";
    Chart1->Legend[3] = "Duben";
    Chart1->Legend[4] = "Kv∞ten";
    Chart1->Legend[5] = "╚erven";
    Chart1->Legend[6] = "╚ervene";
    Chart1->Legend[7] = "Srpen";
    Chart1->SerLeg[0] = "Prod A";
    Chart1->SerLeg[1] = "Prod B";
    Aplikaci vyzkouÜejte.
  13. Dßle se budeme zab²vat zm∞nou vzhledu (zm∞nou vizußlnφch atribut∙) grafu. Komponenta poskytuje 3 re₧imy zobrazenφ:
  14. Implicitnφ re₧im vytvß°enφ grafu je re₧im 2D. Toto m∙₧eme p°epsat a nastavit jako implicitnφ re₧im "plochΘho" 3D p°i nßvrhu nebo za b∞hu aplikace pou₧itφm vlastnosti Chart3D takto:
    Chart1->Chart3D = true;
    K nastavenφ re₧imu prohlφ₧enφ 3D, musφ b²t graf v re₧imu "plochΘho" 3D a provedeme nßsledujφcφ volßnφ:
    Chart1->Angles3D = MAKELONG(30,60);
    Dßle se budeme zab²vat zm∞nou n∞kter²ch atribut∙, kterΘ definujφ zp∙sob zobrazenφ grafu. VÜechny tyto atributy mohou b²t zm∞n∞ny koncov²m u₧ivatelem prost°ednictvφm nabφdky a svßzan²ch dialog∙. V nßsledujφcφm k≤du jsou pou₧ity vlastnosti, kterΘ umo₧≥ujφ m∞nit zobrazovacφ atributy:
    // nastavenφ barevnΘho schΘmatu
    Chart1->Scheme = CHART_CSPATTERN;
    // nastavenφ rastru
    Chart1->Grid = CHART_HORZGRID;
    // nastavenφ barev pozadφ
    Chart1->RGBBk = RGB(0,255,0);
    Chart1->RGB2DBk = RGB(200,20,90);
    Chart1->RGB3DBk = RGB(200,20,90);
    I kdy₧ graf pou₧φvß implicitn∞ 8-mi bodovΘ pφsmo Arial k zobrazenφ titulk∙, legend a dalÜφch text∙ v grafu a programßtor m∙₧e m∞nit tato pφsma pomocφ n∞kolika vlastnostφ Font.
    Op∞t se vrßtφme k naÜi aplikaci. Na konec obsluhy udßlosti OnActivite p°idßme p°φkazy:
    Chart1->View3D = true;
    Chart1->Angles3D = MAKELONG(30,60);
    Chart1->Grid = CHART_HORZGRID;
    Chart1->RGBBk = RGB(0,255,0);
    Chart1->RGB2DBk = RGB(200,20,90);
    Chart1->RGB3DBk = RGB(200,20,90);
    VyzkouÜejte.
  15. Dßle se budeme zab²vat vytvß°enφm nßstroj∙ a dalÜφch vizußlnφch prvk∙ v grafech. Graf dßvß koncovΘmu u₧ivateli 4 nßstroje, kterΘ usnad≥ujφ zm∞nu n∞kter²ch charakteristik grafu.

  16.  
    Nßstroj (vlastnost) Pou₧it k ...
    ToolBar Zm∞na typu grafu, rastru apod.
    LegendBar Zobrazuje legendu X a sΘriφ.
    PaletteBar M∞nφ barvy pomocφ techniky ta₧enφ.
    PatternBar M∞nφ v²pl≥ovΘ vzory pomocφ techniky ta₧enφ.

    Z pohledu programßtor∙ prßce t∞chto nßstroj∙ je pln∞ transparentnφ a mohou b²t zobrazeny b∞hem nßvrhu nebo p°i b∞hu aplikace nastavenφm p°φsluÜnΘ vlastnosti na true.
    TChartfx mß zabudovan² k≤d k vytvß°enφ a zobrazovßnφ stavovΘho °ßdku, k informovßnφ koncovΘho u₧ivatele o stavu programu. Nejsnadn∞jÜφm zp∙sobem vytvß°enφ stavovΘho °ßdku je pou₧itφ metod OpenDataEx a CloseData ve spojenφ s metodou SetStatusItem.
    Nßsleduje p°φklad k≤du vytvß°ejφcφho stavov² °ßdek:
    // Otev°enφ komunikaΦnφho kanßlu
    Chart1->OpenDataEx(COD_STATUSITEMS,4,0);
    // Nastavenφ prvk∙
    Chart1->SetStatusItem(0,true,IDM_TEXT1,true,100,50,4,CHART_STLEFT);
    Chart1->SetStatusItem(1,true,IDM_TEXT2,true,80,80,5,CHART_STCENTER);
    Chart1->SetStatusItem(2,false,NULL,true,40,40,10,NULL);
    Chart1->SetStatusItem(3,true,IDM_TEXT3,true,50,30,2,CHART_STRIGHT);
    // Uzav°enφ kanßlu prvk∙
    Chart1->CloseData(COD_STATUSITEMS);
    K≤d nutn² k zobrazenφ stavovΘho °ßdku je:
    Chart1->ShowStatus = true;
    a k≤d k zadßnφ textu prvku stavovΘho °ßdku je:
    // wIdm je identifikace prvku pou₧itß p°i jeho vytvß°enφ
    Chart1->StatusText[wIdm] = "Nov² text";
    Pou₧itφ t∞chto p°φkaz∙ pro vytvß°enφ nßstroj∙ a ovlßdßnφ stavovΘho °ßdku si ukß₧eme op∞t na naÜi aplikaci. Nßsledujφcφ p°φkazy p°idßme op∞t na zßv∞r obsluhy udßlostφ OnActivate:
    Chart1->OpenDataEx(COD_STATUSITEMS,4,0);
    Chart1->SetStatusItem(0, true, 101, true, 100, 50, 4, 0);
    Chart1->SetStatusItem(1, true, 102, false, 80, 80, 5, 0);
    Chart1->SetStatusItem(2, false, 0, true, 40, 40, 10, 0);
    Chart1->SetStatusItem(3, false, 103, true, 50, 30, 4, 0);
    Chart1->CloseData(COD_STATUSITEMS);
    Chart1->StatusText[101] = "Text 1";
    Chart1->StatusText[102] = "Text 2";
    Chart1->StatusText[103] = "Text 3";
    Chart1->ShowStatus = true;
    Chart1->ToolBar = true;
    Chart1->PaletteBar = true;
    VyzkouÜejte.

  17. Dßle se budeme zab²vat udßlostmi generovan²mi grafem a zpracovßnφm t∞chto zprßv. P°φklady n∞kter²ch udßlostφ generovan²ch grafem jsou:

  18.  
    Udßlost Nastane kdy₧
    LButtonDblClk U₧ivatel dvojit∞ klikne na n∞kterou Φßst grafu.
    RButtonDown U₧ivatel stiskne pravΘ tlaΦφtko myÜi na grafem.
    Destroy Graf bude zruÜen.
    ReadFile Mß b²t Φten soubor.
    Menu U₧ivatel zvolil u₧ivatelem definovan² prvek nabφdky.

    Obsluhy udßlostφ se pou₧φvajφ obvykl²m zp∙sobem. V naÜφ aplikaci vytvo°φme obsluhu dvojitΘho klinutφ lev²m tlaΦφtkem myÜi. Tato obsluha je tvo°ena p°φkazy:
    if ((nSerie == -1) || (nPoint == -1))
      ShowMessage("PrßzdnΘ dvojitΘ kliknutφ X: "+AnsiString(x)+" Y: " + y);
    else {
      Chart1->ThisSerie = nSerie;
      double Hodnota = Chart1->Value[nPoint];
      if (Hodnota < 25) nRes = 1;
      else
       if (Hodnota < 50) Chart1->HText = "Hodnota mezi 25 a 50";
    }
    VyzkouÜejte.
    Komponenta TChartfx umo₧≥uje provßd∞t jeÜt∞ mnoho dalÜφch Φinnostφ. Nebudeme se jimi ji₧ ale zab²vat.

21. R∙znΘ aplikace I