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.