Einzelnen Beitrag anzeigen

HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#1

Virtualstringtree suchen mit Child-Nodes

  Alt 11. Okt 2013, 12:20
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
  Mit Zitat antworten Zitat