Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TreeView mit Anzahl der Datensätze im Text (https://www.delphipraxis.net/118830-treeview-mit-anzahl-der-datensaetze-im-text.html)

DevStar 15. Aug 2008 18:18

Datenbank: Firebird • Version: 2.1 • Zugriff über: Delphi, IBX

TreeView mit Anzahl der Datensätze im Text
 
Hallo,

habe einen TreeView erstellt für meine Datenbank.

Jetzt möchte ich gerne die Anzahl der Datensätze im Text anzeigen lassen.


-- Kunden (74)
-- Aufträge (25)

Wie kann ich das machen?

Hat da jemand einen Tip?

Gruß DevStar

mkinzler 15. Aug 2008 18:25

Re: TreeView mit Anzahl der Datensätze im Text
 
Einfach den text der Node dementsprechend erweitern. Erstellst du diese manuell oder hast verwendest du ein TDBTreeView

omata 15. Aug 2008 18:30

Re: TreeView mit Anzahl der Datensätze im Text
 
Hier mal ein Schnellschuss...

Delphi-Quellcode:
function addChildCount(Node:TTreeNode):integer;
begin
  Result:=0;
  if assigned(Node) then begin
    repeat
      if Node.HasChildren then
        Node.Text:=Node.Text + ' (' + inttostr(addChildCount(Node.getFirstChild)) + ')';
      inc(Result);
      Node:=Node.getNextSibling;
    until not assigned(Node);
  end;
end;
Aufruf:
Delphi-Quellcode:
addChildCount(TreeView.Items.GetFirstNode);

DevStar 15. Aug 2008 20:45

Re: TreeView mit Anzahl der Datensätze im Text
 
Hallo, vielen lieben dank erstmal.

Es ist kein dbTreeView.

Habe es selber erstellt zur Laufzeit.

Funktioniert soweit ganz gut. Nur kann ich meine Datensätze nicht mehr auswählen, da ich für den SELECT-Befehl den Node.Text abgreife:

Delphi-Quellcode:
Node := TreeView1.Selected;
sSQL_Table := 'SELECT * FROM VIEW_KUNDEN ';

sSQL_Bedinung := 'WHERE KOSTENBEZEICHNUNG = ''' + Node.Parent.Text + ''' ' +
                 'AND KASSENNAME = ''' + Node.Text + ''' ' +
                 'ORDER BY NUMMER';

sSQL := sSQL_Table + sSQL_Bedinung;
Ich müsste also eine Funktion finden die dien Klammerwert wieder entfernt. "(xx)"
Das geht aber nicht, weil ich ja nicht weiß wieviel Zeichen xx haben wird.
Sonst müsste das doch mit Pos und Delete gehen??

mkinzler 15. Aug 2008 20:46

Re: TreeView mit Anzahl der Datensätze im Text
 
Dafür würde ich den Tag nehmen

DevStar 15. Aug 2008 20:49

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von mkinzler
Dafür würde ich den Tag nehmen

Äh..und wie? Weiß nicht genau was Du meinst.

mkinzler 15. Aug 2008 20:50

Re: TreeView mit Anzahl der Datensätze im Text
 
Ich würde den PK-Wert in der Eigenschaft Tag des Knotens ablegen

omata 15. Aug 2008 20:53

Re: TreeView mit Anzahl der Datensätze im Text
 
Hier noch ein anderer Vorschlag...
Delphi-Quellcode:
function DeleteCount(Text:string):string;
var Posi:integer;
begin
  Result:=Text;
  repeat
    Posi:=pos(' (', Text);
    if Posi > 0 then
      delete(Text, 1, Posi);
  until Posi = 0;
  delete(Result, length(Result) - length(Text), length(Result));
end;

mkinzler 15. Aug 2008 20:55

Re: TreeView mit Anzahl der Datensätze im Text
 
Wobei ich eine Bezeichnung niemals als Schlüsselkriterium verwenden würde.

DevStar 15. Aug 2008 21:16

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von mkinzler
Wobei ich eine Bezeichnung niemals als Schlüsselkriterium verwenden würde.

Schon klar, aber das läßt sich mit einem selbsterstellten dbTreeView schlecht darstellen.

Zu Omata's Funktion:

Diese liefert mir leider nur die ersten beiden Zeichen des Textes.

Edit: Muss nochmal nerven. Gibt es eine Möglichkeit den Klammerwert in einer anderen Farbe dazustellen? So wie in IBExpert.

omata 15. Aug 2008 21:22

Re: TreeView mit Anzahl der Datensätze im Text
 
Das sollte so eigentlich gehen...
Delphi-Quellcode:
function DeleteCount(Text:string):string;
var Posi:integer;
begin
  Result:=Text;
  repeat
    Posi:=pos(' (', Text);
    if Posi > 0 then
      delete(Text, 1, Posi);
  until Posi = 0;
  delete(Result, length(Result) - length(Text), length(Result));
end;

function addChildCount(Node:TTreeNode):integer;
begin
  Result:=0;
  if assigned(Node) then begin
    repeat
      if Node.HasChildren then
        Node.Text:=DeleteCount(Node.Text) + ' (' + inttostr(addChildCount(Node.getFirstChild)) + ')';
      inc(Result);
      Node:=Node.getNextSibling;
    until not assigned(Node);
  end;
end;
Aufruf:
Delphi-Quellcode:
addChildCount(TreeView.Items.GetFirstNode);

DevStar 15. Aug 2008 21:27

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von omata
Das sollte so eigentlich gehen...

Ja jetzt geht es. Hast Du was geändert an der function oder hab ich nur falsch abgetippt.

Super.Danke. Ihr seit die besten.

Jetzt muss ich den Klammerwert nur noch in blau darstellen und ich bin glücklich.

Danke nochmal.

omata 15. Aug 2008 22:39

Re: TreeView mit Anzahl der Datensätze im Text
 
Hier mal ein Vorschlag...
Delphi-Quellcode:
TForm = class(TForm)
:
private
  { Private-Deklarationen }
  FBitmap:TBitmap;
:
:
procedure TForm.FormCreate(Sender: TObject);
begin
  FBitmap:=TBitmap.Create;
end;

procedure TForm.FormDestroy(Sender: TObject);
begin
  FBitmap.free;
end;

procedure TForm.TreeViewAdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
var Rect:TRect;
    Text, Zahl:string;
begin
  Rect:=Node.DisplayRect(true);
  FBitmap.Height:=Rect.Bottom - Rect.Top;
  FBitmap.Width:=Rect.Right - Rect.Left;
  Text:=DeleteCount(Node.Text);
  Zahl:=Node.Text;
  delete(Zahl, 1, length(Text));
  if cdsFocused in State then begin
    FBitmap.Canvas.Font.Color:=clWhite;
    FBitmap.Canvas.Brush.Color:=clActiveCaption;
  end
  else begin
    FBitmap.Canvas.Font.Color:=clBlack;
    FBitmap.Canvas.Brush.Color:=clWhite;
  end;
  FBitmap.Canvas.FillRect(FBitmap.Canvas.ClipRect);
  FBitmap.Canvas.TextOut(2, 1, Text);
  FBitmap.Canvas.Font.Color:=clBlue;
  FBitmap.Canvas.TextOut(FBitmap.Canvas.TextWidth(Text)+8, 1, Zahl);
  Sender.Canvas.Draw(Rect.Left, Rect.Top, FBitmap);
end;

DevStar 15. Aug 2008 23:00

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von omata
Hier mal ein Vorschlag...

Hast Du auch mal ein Beispiel wie ich diese Procedure aufrugen kann?

Das klappt leider nicht:

Delphi-Quellcode:
TreeViewAdvancedCustomDrawItem (TreeView1, TreeView1.Selected, cdsDefault, true, true);

omata 15. Aug 2008 23:02

Re: TreeView mit Anzahl der Datensätze im Text
 
Doppelklick im Objektinspektor auf der Ereignisseite vom TreeView. Dort gibt es das Ereignis.

DevStar 15. Aug 2008 23:23

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von omata
Doppelklick im Objektinspektor auf der Ereignisseite vom TreeView. Dort gibt es das Ereignis.

OK, tut sich aber nichts. Die Procedure wird ausgeführt, sehe aber jetzt keine Änderung im Tree.

omata 15. Aug 2008 23:30

Re: TreeView mit Anzahl der Datensätze im Text
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein Beispiel.

DevStar 15. Aug 2008 23:45

Re: TreeView mit Anzahl der Datensätze im Text
 
Zitat:

Zitat von omata
Hier mal ein Beispiel.

Klasse. Fehler gefunden. Funktioniert bestens.

D A N K E !!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz