Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dokładność odczytu i zerowanie w polu Edit - C++ Builder

Jackww 13 Mar 2005 10:05 1479 0
  • #1 13 Mar 2005 10:05
    Jackww
    Poziom 11  

    Program rysuje jakiś wykres, następnie muszę kliknąć myszką w jeden
    punkt na wykresie (linii) i zczytać dane (współrzędne punktu) do pola
    Edit2, następnie muszę kliknąć w drugi punkt i zczytać dane do pola
    Edit3 i wykonać obliczenia a wyniki przedstawić w polu Edit4 i Edit5.
    Problem jest w tym ze dane przekazywane przez kliknięcie na wykresie
    nie są tak dokładne jak dane wyświetlane w polu Edit1 w trakcie
    poruszania myszką po obszarze wykresu. Drugi problem jest taki: w jaki
    sposób po dokonaniu tych obliczeń wyzerować pola Edit2, Edit3, Edit4 i
    Edit5.
    Program piszę w C++ Builderze. Proszę o pomoc, nie znam prawie w ogóle języka C a muszę coś takiego napisać.
    Poniżej załączam listing programu:
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <math.h>
    #include "Unit1.h"

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

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

    TForm1 *Form1;

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------------------------------------------------
    void __fastcall TForm1::LineSeries1AfterDrawValues(TObject *Sender)

    {
    OldX = -1; // Reset old mouse position
    }

    //---------------------------------------------------------------------------
    // This procedure draws the crosshair lines }
    void TForm1::DrawCross(int ax, int ay)
    {
    TColor tmp;
    tmp = Chart1->BackColor;
    if (tmp == clTeeColor)
    tmp = clBtnFace;
    Chart1->Canvas->Pen->Color = (TColor)(CrossHairColor ^
    ColorToRGB(tmp));
    Chart1->Canvas->Pen->Style = CrossHairStyle;
    Chart1->Canvas->Pen->Mode = pmXor;
    Chart1->Canvas->Pen->Width = 1;
    Chart1->Canvas->MoveTo(ax,Chart1->ChartRect.Top-Chart1->Height3D);
    Chart1->Canvas->LineTo(ax,Chart1->ChartRect.Bottom-Chart1->Height3D);
    Chart1->Canvas->MoveTo(Chart1->ChartRect.Left+Chart1->Width3D,ay);
    Chart1->Canvas->LineTo(Chart1->ChartRect.Right+Chart1->Width3D,ay);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    LineSeries1->FillSampleValues(30); // <-- some random values
    OldX = -1; // initialize variables
    CrossHairColor = clYellow;
    CrossHairStyle = psSolid;
    Chart1->Cursor = crCross;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState
    Shift,
    int X, int Y)
    {

    double tmpX,tmpY;

    LineSeries1->GetCursorValues(tmpX,tmpY); // <-- get values under
    mouse cursor

    Edit1->Text = LineSeries1->GetHorizAxis->LabelValue(tmpX)

    + " " + LineSeries1->GetVertAxis->LabelValue(tmpY);

    if (OldX != -1) {

    DrawCross(OldX,OldY); // draw old crosshair

    OldX = -1;

    }
    // check if (mouse is inside Chart rectangle

    if (PtInRect((RECT*)&Chart1->ChartRect,
    Point(X-Chart1->Width3D,Y+Chart1->Height3D))) {

    DrawCross(X,Y); // draw crosshair at current position

    // store old position

    OldX = X;

    OldY = Y;

    // set label text

    // LineSeries1->GetCursorValues(tmpX,tmpY); // <-- get values
    under mouse cursor

    // Edit1->Text = LineSeries1->GetHorizAxis->LabelValue(tmpX)

    // + " " + LineSeries1->GetVertAxis->LabelValue(tmpY);

    }
    }

    //---------------------------------------------------------------------------
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {

    if (CheckBox1->Checked)

    Chart1->Cursor = crCross;

    else

    Chart1->Cursor = crDefault;

    Chart1->OriginalCursor = Chart1->Cursor;

    }

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

    //void __fastcall TForm1::BitBtn2Click(TObject *Sender)

    //{

    // CrossHairColor = EditColor(this,CrossHairColor);

    //}

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



    void __fastcall TForm1::Chart1ClickSeries(TCustomChart *Sender,

    TChartSeries *Series, int ValueIndex, TMouseButton Button,

    TShiftState Shift, int X, int Y)

    {

    // bool E2 = true;

    // bool E3 = true;

    // Edit2->Text.IsEmpty();

    if (Edit2->Text.IsEmpty())

    {

    Edit2->Text = FloatToStrF(Series->XValue[ValueIndex], ffFixed,
    15, 3) + ':' +

    FloatToStrF(Series->YValue[ValueIndex], ffFixed, 15, 3);

    cvInx1 = ValueIndex;

    }

    else

    {

    Edit3->Text = FloatToStrF(Series->XValue[ValueIndex], ffFixed,
    15, 3)+':'+

    FloatToStrF(Series->YValue[ValueIndex], ffFixed, 15, 3);

    cvInx2 = ValueIndex;



    Edit4->Text = FloatToStr((Series->XValue[cvInx2]-
    Series->XValue[cvInx1]) / 2);

    Edit5->Text = FloatToStr(38.61*(Series->XValue[cvInx2] -
    Series->XValue[cvInx1]) /

    log(Series->YValue[cvInx2] / Series->YValue[cvInx1]));

    }

    Edit2->Text.IsEmpty();

    Edit3->Text.IsEmpty();

    }

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