|
Registriert seit: 2. Jun 2008 365 Beiträge Delphi XE7 Professional |
#1
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 |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |