Results 1 to 9 of 9

Thread: TChart.Series geeft een access violation fout melding

  1. #1

    TChart.Series geeft een access violation fout melding

    Hallo,
    zou iemand mij kunnen helpen met een foutmelding die ik krijg bij gebruik van Teechart STD van Delphi 10.2 Tokio

    ik ben bezig met een programma die "Multi language" is en de data uit een CSV (komma gescheiden) bestand komt.
    Het deel waar de fout nu in ontstaat was in eerste instantie werkend.
    Door het programma op te splitsen in DLL's is er nu een fout ontstaan in het deel van het programma waar verder niets aan gewijzigd is (dit deel wordt nog rechtstreeks aangeroepen vanuit het hoofd-programma).

    het programma maakt gebruik van TChart van Delphi 10.2 zelf.
    hieronder de sourcecode van het gedeelte waar de fout in ontstaat
    Delphi Code:
    1. procedure TViewForm.ShowChart(Sender: TObject);
    2. var
    3.   I, II, III, Val: Integer;
    4.   Value: Double;
    5.   VRec: Array[1..4] of Integer;
    6.  
    7.  
    8. function IntToDouble(Id: Integer): Double;
    9. begin
    10.    Result := Double(Id);
    11. end;
    12.  
    13.  
    14. begin
    15.    if ChartView.SeriesCount > 0 then
    16.       for I := 0 to ChartView.SeriesCount - 1 do
    17.           ChartView.Series[I].Free;
    18.    case RChoice.ItemIndex of
    19.        0: begin // shutter metingen
    20.              ChartView.Title.Text.Clear;
    21.              ChartView.Title.Text.Add(Usr_Shutter);
    22.              for I := 1 to 4 do
    23.                  VRec[I] := 2;
    24.              for I := 2 to XLS.RowCount - 1 do
    25.              begin
    26.                 for II := 0 to 5 do
    27.                 begin
    28.                    if I = 2 then
    29.                    begin
    30.                       ChartView.AddSeries(TFastLineSeries);
    31.                       ChartView.Series[II].Title       := Prg_Headers[II];
    32.                       ChartView.Series[II].Name     := 'SLine' + IntToStr(II + 1);
    33.                    end;
    34.                    case II of
    35.                        0, 1: Value := StrToFloat(XLS.Cells[II, I]);
    36.                        2, 3,
    37.                        4, 5: begin
    38.                                 if (VRec[II - 1] >= 2)  then
    39.                                 begin
    40.                                    if (((II = 3) or (II = 5)) and (TryStrToFloat(XLS.Cells[2, VRec[II - 1]], Value))) or
    41.                                      (((II = 2) or (II = 4)) and (TryStrToFloat(XLS.Cells[1, VRec[II - 1]], Value))) then
    42.                                    begin
    43.                                       if Value = StrToInt(XLS.Cells[0, I]) then
    44.                                         Inc(VRec[II - 1])
    45.                                       else
    46.                                         if I = 2 then
    47.                                            Value := StrToFloat(XLS.Cells[II, 2])
    48.                                         else
    49.                                            Value := StrToFloat(XLS.Cells[II, VRec[II - 1]]);
    50.                                    end else
    51.                                    begin
    52.                                       Value := StrToFloat(XLS.Cells[II, VRec[II - 1]]);
    53.                                       Inc(VRec[II - 1]);
    54.                                    end;
    55.                                 end else Value := 0;
    56.                              end;
    57.                    end;
    58.                    if (Value > 0) or ((I = 2) and (II < 2)) then
    59.                    begin
    60.                       ChartView.Series[II].AddXY(IntToDouble(I - 2), Value);
    61.                    end;
    62.                 end;
    63.              end;
    64.           end;

    zodra de regel "
    ChartView.Series[II].AddXY(IntToDouble(I - 2), Value);" wordt aangeroepen verschijnt er een foutmelding
    "Access violation in ..."(enz.) op dat moment bevatten de volgende variabelen de waardes II=0, I=2 en value=27 (dit laatste komt uit het CSV bestand)
    Chartview is op dat moment wel aktief.

    weet iemand hier een oplossing op?
    b.v.d.
    Peter
    Last edited by GolezTrol; 26-Apr-18 at 10:37.

  2. #2
    Ik vermoed dat series II nil is.

  3. #3
    Hoi Luigi,
    dank je voor je antwoord, maar dat heb ik al vernoemd, chartview = actief (dus niet nil).
    series[II] wordt geactiveerd door het commando Chartview.AddSeries....
    bij elke lijn die gebruikt wordt deze door dit commando geactiveerd.
    zoals je misschien ook ziet wordt daaronder de lijn een titel en een naam gegeven, dat gaat wel goed.
    Deze series is een array, eenmaal geactiveerd kan je er gegevens aan toe voegen.
    vandaar dat ik de activering alleen bij eerste aanroep doe.

  4. #4
    Ik had niet je hele code doorgeploegd maar dat leek me zo laat op de avond het meest waarschijnlijke. Het is wel een gekke regel waar je die AV krijgt. Er gebeurd eigenlijk weinig spannends. Zelfs als je probeert toe te voegen aan een serie die niet bestaat krijg je geen AV.

  5. #5
    Ik heb geen idee hoe die ChartView werkt maar is deze regel wel goed?
    Delphi Code:
    1. ChartView.AddSeries(TFastLineSeries);

    Moet dat niet dit zijn????
    Delphi Code:
    1. ChartView.AddSeries(TFastLineSeries.Create(nil));

    De reden waarom het bij Title en Name wel goed gaat is omdat dat properties zijn van ChartView.Series[0]. Maar op moment dat je punten toe gaat voegen gaat die de "meegegeven" serie gebruiken (in dit geval TFaseLineSeries). Maar die moet je dan wel "creëren". Jij geeft alleen maar de ClassType mee.

  6. #6
    Vind ik ook vreemd,maar ik heb dat stukje geprobeerd en er lijkt geen (explecite) create nodig te zijn.

  7. #7
    Quote Originally Posted by luigi View Post
    Vind ik ook vreemd,maar ik heb dat stukje geprobeerd en er lijkt geen (explecite) create nodig te zijn.
    Volgens deze code-snippet wel:
    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. var i: Integer;
    3. begin
    4.   for i:=0 to 9 do
    5.     Chart1.AddSeries(TFastLineSeries.Create(self));
    6.   Chart1.AutoRepaint := false;
    7. end;
    (bron http://www.teechart.net/support/view...p=38418#p38418)

    En het lijkt mij eigenlijk ook wel logisch dat je een zelf gecreëerde serie meegeeft.

    En als die dus niet bestaat krijg je natuurlijk een AV.

    Waarom jij die niet krijgt weet ik niet.

    (Ik heb ook andere voorbeelden mat TBarSeries.Create(nil) o.i.d. gevonden als parameter)

  8. #8
    beste,
    ik heb dit geprobeerd, maar haal hieruit geen andere resultaten dan een access violation foutmelding.
    waarom dit niet goed gaat is mij een raadsel.

  9. #9
    iedereen bedankt voor het meedenken, ik heb het uiteindelijk gevonden
    blijkbaar miste het programmadeel een onderdeel (wel vreemd want de melding wijst daar totaal niet op).
    door een programmadeel, waarin Fastreport wordt gebruikt, er aan toe te voegen (alleen maar toekenning (Uses), geen aanroep) zijn alle fouten opgelost.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •