Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

Ab und an AV bei VirtualStringTree

  Alt 1. Nov 2017, 16:51
Ich habe eine ObjectList die als Datenquelle für das VST dient.

Zu Aufbauen der VST dient folgen Procedure:
Delphi-Quellcode:
procedure TfrmMainServer.BuildList;
var
  i: Integer;
  Node: PVirtualNode;
begin
  vrtlstrngtrAnrufliste.BeginUpdate;
  try
    vrtlstrngtrAnrufliste.Clear;
    for i:=AnrufList.Count-1 downto 0 do
      Node:=vrtlstrngtrAnrufliste.AddChild(nil, AnrufList[i]);
  finally
    vrtlstrngtrAnrufliste.EndUpdate;
  end;
end;
Zur Anzeige dann:
Delphi-Quellcode:
procedure TfrmMainServer.vrtlstrngtrAnruflisteGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
var
  Anruf: TAnruf;
begin
  if node<>nil then
  begin
    Anruf:=TAnruf(vrtlstrngtrAnrufliste.GetNodeData(Node)^);
    case Column of
      0: CellText:=FormatDateTime('dd.mm.yy hh:nn:ss',Anruf.Zeit);
      1: if Anruf.name<>'then
           CellText:=Anruf.RN + ' ('+Anruf.name+')else
           CellText:=Anruf.RN;
      2: CellText:=Anruf.MSN;
      3: case Anruf.Service of
           csALL: CellText:='Alle';
           csTELEPHONY: CellText:='Telefonie';
           csANALOG_TELEPHONY: CellText:='Analogtelefonie';
           csDIGITAL_TELEPHONY: CellText:='Digitaltelefonie';
           csFAX3: CellText:='Fax G3';
           csFAX4: CellText:='Fax G4';
           csDATA_64K: CellText:='Daten 64k';
           csDATA_56K: CellText:='Daten 56k';
           csPACKET_MODE: CellText:='Packetmode';
           csUNKNOWN: CellText:='Unbekannt';
         end;
      4: Case Anruf.AMStatus of
           lsUnbekannt: CellText:='Unbekannte MSN';
           lsProtokolliert: CellText:='Nur Aufzeichnen';
           lsGesendet: CellText:='An Client senden';
         End;
    end;
  end;
end;
Mittels DblClick soll dann eine Eigenschaft des hinter dem Node stehenden Objects bearbeitet werden:
Delphi-Quellcode:
procedure TfrmMainServer.vrtlstrngtrAnruflisteNodeDblClick(
  Sender: TBaseVirtualTree; const HitInfo: THitInfo);
var
  anruf: TAnruf;
  oldname, newname: string;
  name: TName;
begin
  vrtlstrngtrAnrufliste.BeginUpdate;
  try
    anruf:=TAnruf(vrtlstrngtrAnrufliste.GetNodeData(HitInfo.HitNode)^);
    if anruf.name<>'then
      oldname:=anruf.name else
      if NameList.IndexOfRN(anruf.RN)>-1 then
        oldname:=NameList[NameList.IndexOfRN(anruf.RN)].name else
        oldname:='';
    newname:=InputBox('Namenzuordnung','Geben sie einen Namen zu der Rufnummer an:', oldname);
    if newname<>oldname then
    begin
      if newname='then
      begin
        if NameList.IndexOfRN(anruf.RN)>-1 then
          NameList.Delete(NameList.IndexOfRN(anruf.RN));
      end else begin
        if NameList.IndexOfRN(anruf.RN)>-1 then
        begin
          Name:=NameList[NameList.IndexOfRN(anruf.RN)];
        end else begin
          Name:=TName.Create;
          NameList.Add(name);
          name.rn:=anruf.RN;
        end;
        name.name:=newname;
      end;
      NameList.SaveToFile;
      AnrufList.ReplaceName(anruf.RN, newname);
      AnrufList.SaveToFile;
      BuildList;
    end;
  finally
    vrtlstrngtrAnrufliste.EndUpdate;
  end;
end;
Soweit alles schick. Ich kann auch mehrere Male TAnruf.name verändern.

Aber nach ein paar Veränderungen (unregelmäßig viele) tritt immer eine AV in der VST-Procedure GetPreviousVisibleNoInit aus der Unit VirtualTrees auf. Und über den Stack kann ich leider keine Rückschlüsse ziehen, auf Grund welches Ereignisses er in diese Procedure springt.

Hat jemand eine Tipp für mich, wie ich dem Fehler auf die Spur kommen könnte?
Den Aufruf-Stack habe ich mal als Image angehängt.
Miniaturansicht angehängter Grafiken
stack_av.png  
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat