Guten Tag Delphianer,
folgendes Problem mit der Suche im Virtualstringtree bekomme ich nicht gelöst:
Beim Suchen werden werden die Child-Nodes nicht mehr angezeigt.
Der Aufbau ist Ordnung. Es werden die Nodes auch richtig aufgebaut. D. H. Parent-Node und Child-Node werden korrekt angezeigt.Beim Expand der Nodes werden die Child-Nodes auch richtig angezeigt.
---------------------------------------------------------------------------------------
Die beiden Records aus denen das VST aufgebaut wird.
Delphi-Quellcode:
TOVSTAngebote = class(TObject)
public
FPKAngebotsNr: string;
FAngebotstitel: string;
FKuSuchCode: string;
FKundenNr: string;
FAdressID: LongInt;
FSuchCode: string;
FName: string;
FAGGedruckt: string;
FKostenStelle: string;
FfNetto: Currency;
FfMwst: Currency;
FfBrutto: Currency;
FDatum: TDateTime;
FPauschal: string;
FfPauschalPreis: Currency;
FfMenge: double;
FAbgerechnet: string;
end;
//============================================================================
// Dokumentenklasse für Angebote Anzeige im VST
//============================================================================
TOAngeboteDokumente = class(TOVSTAngebote)
public
FDokumentName: string;
FAdressOrdner: string;
FDokumentWert: Currency;
FDokumentDatum: TDateTime;
FDokumentNr: string;
end;
---------------------------------------------------------
Delphi-Quellcode:
procedure TOVSTFuerAngeboteAufbauen.BauVSTAuf;
var
aAngebotsNr: string;
pKostenstelle: string;
pDokumentPfadName: string;
pDokumentName: string;
pNode1: PVirtualNode;
pSQLDok: TIBSQL;
angebote: TOVSTAngebote;
pDokumente: TOAngeboteDokumente;
begin
dmain.pStartTransAction;
FVST.BeginUpdate;
FVST.Clear;
Application.CreateForm(TIBSQL, pSQLDok);
pSQLDok.Database := DMAIN.dbmain;
pSQLDok.Transaction := DMAIN.tranmain;
FSQLA.Close;
FSQLA.SQL.Clear;
FSQLA.SQL.Add('select * from Angebote ');
FSQLA.SQL.Add('where abgerechnet = :pAbgerechnet ');
FSQLA.SQL.Add('and geloescht = ' + #39 + 'N' + #39);
FSQLA.SQL.Add('and fkadressid = :pAdressID ');
FSQLA.SQL.Add(' order by titel');
FSQLA.Prepare;
FSQLA.ParamByName('pAbgerechnet').Value := FAlleZeigen;
FSQLA.ParamByName('pAdressid').Value := FAdressID;
FSQLA.ExecQuery;
while not FSQLA.Eof do
begin
aAngebotsNr := FSQLA.FieldByName('pkAngebote').AsString;
pKostenstelle := FSQLA.FieldByName('kostenstelle').AsString;
angebote := TOVSTAngebote.Create;
angebote.FPKAngebotsNr := FSQLA.FieldByName('pkAngebote').AsString;
angebote.FAngebotstitel := FSQLA.FieldByName('titel').AsString;
angebote.FAdressID := FSQLA.FieldByName('fkadressid').AsInt64;
angebote.FSuchCode := FSQLA.FieldByName('suchcode').AsString;
angebote.FName := FSQLA.FieldByName('ReName').AsString;
angebote.FfNetto := FSQLA.FieldByName('angebotnettosumme').AsFloat;
angebote.FfMwst := FSQLA.FieldByName('mwstbetrag').AsFloat;
angebote.FfBrutto := FSQLA.FieldByName('bruttobetrag').AsFloat;
angebote.FDatum := FSQLA.FieldByName('datum').AsDateTime;
angebote.FKostenStelle := FSQLA.FieldByName('kostenstelle').AsString;
angebote.FAbgerechnet := FSQLA.FieldByName('abgerechnet').AsString;
pNode1 := FVST.AddChild(nil, angebote);
if pKostenstelle <> '' then
begin
pSQLDok.Close;
pSQLDok.SQL.Clear;
pSQLDok.SQL.Add('select * from alledokumente ');
pSQLDok.SQL.Add('where fkadressid = :pAdressID ');
pSQLDok.SQL.Add('and kostenstelle = :pKostenStelle');
pSQLDok.SQL.Add('order by dokumenttyp ');
pSQLDok.Prepare;
pSQLDok.ParamByName('pAdressID').Value := FAdressID;
pSQLDok.ParamByName('pKostenStelle').Value := pKostenstelle;
pSQLDok.ExecQuery;
while not pSQLDok.Eof do
begin
pDokumentPfadName := pSQLDok.FieldByName('dokumentPfad').AsString;
pDokumentName := pSQLDok.FieldByName('dokumentName').AsString;
pDokumente := TOAngeboteDokumente.Create;
pDokumente.FDokumentName := pDokumentName;
pDokumente.FAdressOrdner := IntToStr(FAdressID);
pDokumente.FDokumentWert :=
pSQLDok.FieldByName('rebetrag').AsCurrency;
pDokumente.FDokumentDatum :=
pSQLDok.FieldByName('dokumentdatum').AsDateTime;
pDokumente.FDokumentNr := pSQLDok.FieldByName('dokumentnr').AsString;
FVST.AddChild(pNode1, pDokumente);
pSQLDok.Next;
end;
end;
FSQLA.Next;
end; // alle angebote
pSQLDok.Close;
pSQLDok.Free;
FSQLA.Close;
FSQLA.Free;
FVST.EndUpdate;
dmain.tranmain.CommitRetaining;
end;
--------------------------------------------------------------------------
Aufbau des VST:
Delphi-Quellcode:
procedure TMSFrmAngebote.vstAngeboteGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
pDaten: TOVSTAngebote;
begin
pDaten := TOVSTAngebote(vstangebote.GetNodeData(Node)^);
case column of
0:
begin
if pDaten is TOVSTAngebote then
celltext := TOVSTAngebote(pDaten).FAngebotstitel
+ ' (' + TOVSTAngebote(pDaten).FPKAngebotsNr + ')';
if pDaten is TOAngeboteDokumente then
CellText := TOAngeboteDokumente(pDaten).FDokumentName;
end;
1:
begin
if pDaten is TOVSTAngebote then
CellText := TOVSTAngebote(pDaten).FSuchCode;
end;
2:
begin
if pDaten is TOVSTAngebote then
celltext := FormatDatetime('dd.mm.yyyy',
TOVSTAngebote(pDaten).FDatum);
if pDaten is TOAngeboteDokumente then
begin
pJahr := ZerlegeJahr(TOAngeboteDokumente(pDaten).FDokumentDatum);
if pJahr <> 1899 then
CellText := FormatDatetime('dd.mm.yyyy',
TOAngeboteDokumente(pDaten).FDokumentDatum);
end;
end;
3:
begin
if pDaten is TOVSTAngebote then
Celltext := FloatToStrF(TOVSTAngebote(pDaten).FfBrutto, ffCurrency, 8,
2);
if pDaten is TOAngeboteDokumente then
CellText := FloatToStrF(TOAngeboteDokumente(pDaten).FDokumentWert,
ffCurrency, 8, 2);
end;
end;
end;
------------------------------------------------------------------------------
Gesucht wird über ItereeSubTree, über das OnChange-Ereignis eines Editfeldes.
Die gefundenen Nodes werden angezeigt. Die Parent-Nodes haben auch ein Pluszeichen für das Aufklappen,
aber beim Klick auf das Pluszeichen sind die Child-Daten nicht vorhanden!
Warum nicht???
Delphi-Quellcode:
procedure TMSFrmAngebote.SucheCallback(Sender: TBaseVirtualtree;
Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
cSuche: string;
pDaten: TOVSTAngebote;
begin
cSuche := AnsiUpperCase(edtSuche.Text);
pDaten := TOVSTAngebote(vstangebote.GetNodeData(Node)^);
case AdvOfficeRadioGroupSuchenach.ItemIndex of
0:
begin
vstangebote.IsVisible[Node] := (cSuche = '')
or (pos(cSuche,
AnsiUpperCase(pDaten.FAngebotstitel)) > 0);
end;
1:
begin
vstangebote.IsVisible[Node] := (cSuche = '')
or (pos(cSuche, pDaten.FSuchCode) > 0);
end;
end;
end;
---------------------------------------------------
Hat jemand eine Lösung für dieses Problem? Wie kann ich dieses Problem lösen??
Mit Gruß
HPB