Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Durch klick auf TTreeView in Tabelle DS Positionieren (https://www.delphipraxis.net/73086-durch-klick-auf-ttreeview-tabelle-ds-positionieren.html)

Christian18 12. Jul 2006 09:37

Datenbank: Access • Version: 2000 • Zugriff über: ADO

Durch klick auf TTreeView in Tabelle DS Positionieren
 
Hallo,

ich habe eine DB in der ich zwei Tabellen habe. Die Informationen, die in der Tabelle enthalten sind, importiere ich mit folgender Routine in meiner TreeView Komponente.

Delphi-Quellcode:
procedure TProgramm.FillTree(b : TTreeView; t1, t2 : TADOTable);
  var n     : TTreeNode;
      i1, i2 : Integer;
begin
  b.Items.Clear;
  i1:=t1.RecNo;
  i2:=t2.RecNo;
  t1.First;
  while not t1.Eof do
    begin
      n:=b.Items.AddChild(nil, t1.FieldByName('Feldname1').AsString);
      t2.First;
      while not t2.Eof do
        begin
          b.Items.AddChild(n, t2.FieldByName('Feldname2').AsString);
          t2.Next;
        end;
      t1.Next;
    end;
  t1.RecNo:=i1;
  t2.RecNo:=i2;
end;
Ich verwende diese Komponente, um eine hierarchische Darstellung meiner Tabelleninhalte zu erreichen. Das funktioniert auch problemlos. Es sieht auch richtig toll aus. Aber eine Funktionalität müsste ich jetzt noch haben. Wenn ich einen Knoten auswähle, durch einen Mouseklick, dann soll der Focus auch in der Tabelle auf diesen Datensatz gesetzt werden. Wie kann ich das tun? WICHTIG!!! Hierbei ist noch wichtig, wenn ich einen Knotenpunkt einmal anklicke, dann soll der Focus in der Master Tabelle auf den Datensatz gesetzt werden und wenn ich einen Knoten öffne, dann soll der Focus in der Detail Tabelle auf den ersten Datensatz gesetzt werden. Wenn ich einen Knoten offen habe, und ich einen Datensatz in einem Unterknoten auswähle, dann soll auch in der Detail tabelle der Focus in der Detail Tabelle aus diesen Datensatz Positioniert werden.

Über Lösungsansätze würde ich mich sehr freuen. Ich hoffe ich konnte mein doch etwas umfangreicheres Problem ein bisschen nahelegen.



Mit freundlichen Grüßen

Christian18

marabu 12. Jul 2006 10:02

Re: Durch klick auf TTreeView in Tabelle DS Positionieren
 
Hallo Christian,

vieles wird leichter, wenn du den Primärschlüssel (Annahme PK, Typ INTEGER) mitführst:

Delphi-Quellcode:
while not t1.Eof do
begin
  n := b.Items.AddChildObject(nil,
      t1.FieldByName('Feldname1').AsString,
      Pointer(t1.FieldByName('PK').AsInteger)
  );
  t2.First;
  while not t2.Eof do
  begin
    b.Items.AddChild(n,
        t2.FieldByName('Feldname2').AsString,
        Pointer(t2.FieldByName('PK').AsInteger)
    );
    t2.Next;
  end;
  t1.Next;
end;
Dann kannst du über die Ereignisse der TreeView die Positionierung in den DataSets vornehmen.

Grüße vom marabu

Christian18 12. Jul 2006 11:51

Re: Durch klick auf TTreeView in Tabelle DS Positionieren
 
Hallo,

erst einmal vielen dank für die schnelle antwort und für den Tip. Ich habe mir deinen Tip zu herzen genommen und dies entsprechend in meinem Quelltext geändert. Trotzdem habe ich noch ein kleines Problem. Wie kann ich nun die Position ermittln und dann den Focus auf den Datensatz setzen???

MFG Christian18

marabu 12. Jul 2006 14:42

Re: Durch klick auf TTreeView in Tabelle DS Positionieren
 
Hallo Christian,

du positionierst über die Methode Delphi-Referenz durchsuchenLocate() des DataSet auf den Satz mit dem gewünschten PK. Wenn du sicherstellen kannst, dass die beiden Queries immer offen sind, dann kannst du dir statt des PK auch die Delphi-Referenz durchsuchenRecNo merken und diese Eigenschaft dann wieder setzen.

marabu

Christian18 13. Jul 2006 07:38

Re: Durch klick auf TTreeView in Tabelle DS Positionieren
 
und wie komme ich wieder auf den Pointer raus den ich beim erzeugen setze???

EDIT: Hat jemand vieleicht auch ein paar Code schnipsel???

Peinhard 13. Jul 2006 10:17

Re: Durch klick auf TTreeView in Tabelle DS Positionieren
 
Zitat:

Zitat von Christian18
und wie komme ich wieder auf den Pointer raus den ich beim erzeugen setze???

Du 'castest' den Pointer wieder zurück in einen integer, das ist ja das praktische, daß sich die beiden Typen so schön gegenseitig 'mißbrauchen' können, so kann man umgekehrt zB auch in die Tag-property einer Komponente ein ganzes anderes Objekt 'reinhängen'.

Zitat:

Zitat von Christian18
EDIT: Hat jemand vieleicht auch ein paar Code schnipsel???

Bitt' schön:

Delphi-Quellcode:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var iKeyValue: integer;
begin
  if Assigned(Node.Data) then
  begin
    iKeyValue := LongInt(Node.Data);
    if (Node.Level = 1) then //gehört zu t1
      t1.Locate('FeldNamePKt1',iKeyValue,[])
    else if (Node.Level = 2) then //gehört zu t2
      t2.Locate('FeldNamePKt2',iKeyValue,[]);
  end;
end;
Dann mußt du in dem Gerüst natürlich noch deine Fokus-Wechsel und was du sonst noch so machen willst unterbringen.

peinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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