Entwickler-Ecke

Datenbanken - VST und TBookmark


Coder - Fr 16.11.07 00:02
Titel: VST und TBookmark
Hi
Hab in der VirtualTreeView-Hilfe folgendes gefunden:
Zitat:
You could connect a TBookmark to the data. To display the name of your customer in a VT :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFRM_WWW_main.vFavTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: Integer; TextType: TVSTTextType; var Text: WideString);
begin
  // Column is -1 if the header is hidden or no columns are defined
  if Column < 0 then Exit;
  if TVirtualStringTree(Sender).Header.Columns[Column].Text = 'Customer Name' then
  begin
    Table.GotoBookmark(TBookmark(Sender.GetNodeData(Node)));
    Text := Table.FieldByName('Name').asString;
  end;
end;


Das is schonmal sehr schön.
Doch leider steht nicht da wie ich das TBookmark vorher in den Pointer des Nodes reinkriege.
Hab es so versucht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function TForm1.LoadFromDB: Boolean;
var
  Node: PVirtualNode;
  NodeData: Pointer;
begin
  ...
  Node := VSTAddNode(nil);
  NodeData := VST.GetNodeData(Node);
  NodeData := Table.GetBookmark;
end;

Wenn er im oberen Quellcode nun Zeile 7 erreicht gibt er aus
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt *.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Table: Datensatz nicht gefunden' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


Ich hab keine Ahnung wies gehn soll. :?!?:

MfG


CenBells - Sa 17.11.07 13:53

Hallo Coder,

ich glaube du musst den Bookmark anders in die NodeData schreiben.

Ich weise objekte immer so zu:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var  
  Node: PVirtualNode;  
  NodeData: Pointer;  
begin  
  ...  
  Node := VSTAddNode(nil);  
  NodeData := VST.GetNodeData(Node);  
  TObject(NodeData^) := ClientDataSet.GetBookmark;  
end;


Viele Grüße
Ken


Coder - So 18.11.07 21:07

Sorry das funktioniert auch nicht.
Gleiche Fehlermeldung.
Hab auch schon viel mit Pointern rumprobiert etc. ...


CenBells - Mo 19.11.07 13:28

Hi,

was machst du denn mit deinem ClientDataset und dem Table in der Zwischenzeit? Mal nen open und nen close? In deinem ersten Code-Schnippsel ist von Table.GotoBookmark die rede, in dem zweiten versuchst du aber den Bookmark von einer ClientDataset in den Node zu packen.

Sind das nur zwei namen für das selbe objekt? Ich bin mir nämlich nicht sicher, ob du nen bookmark zwischen unterschiedlichen instanzen bedenkenlos austauschen kannst.

Hast du mal geschaut, ob du überhaupt nen bookmark aus dem Node bekommst?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin  
  // Column is -1 if the header is hidden or no columns are defined  
  if Column < 0 then Exit;  
  if TVirtualStringTree(Sender).Header.Columns[Column].Text = 'Customer Name' then  
  begin  
    LBookMark := TBookmark(Sender.GetNodeData(Node));
    if assigned(LBookmark) then begin
      Table.GotoBookmark(LBookMark);  
      Text := Table.FieldByName('Name').asString;  
    end else
      MessageDlg('Kein Bookmark', mtInformation, [mbOk]);


Viele Grüße
Ken


Coder - Mo 19.11.07 21:41

Der erste CodeBlock ist aus der VirtualTreeView-Hilfe.
Sollte also funktionieren.
Den zweiten hab ich geschrieben und die Komponente nur anders genannt.
Habs mal verbessert.


CenBells - Di 20.11.07 01:27

hi,

schließt du die komponente zwischenzeitlich oder machst du nen refresh? Generell hast du recht, der code sollte funktionieren, aber 100% sicher ist das nicht.

Ich arbeite zwar seit jahren mit der TVirtualStringTree Komponente aber mit TBookmark habe ich in dem Zshg noch nicht gearbeitet. Einfach mal schauen, was mit den DB komponenten zwischenzeitlich passiert wäre ein erster Schritt.

Viele Grüße
Ken


Coder - Di 20.11.07 14:41

user profile iconCenBells hat folgendes geschrieben:
hi,

schließt du die komponente zwischenzeitlich oder machst du nen refresh? Generell hast du recht, der code sollte funktionieren, aber 100% sicher ist das nicht.

Ich arbeite zwar seit jahren mit der TVirtualStringTree Komponente aber mit TBookmark habe ich in dem Zshg noch nicht gearbeitet. Einfach mal schauen, was mit den DB komponenten zwischenzeitlich passiert wäre ein erster Schritt.

Viele Grüße
Ken


Ich schließe die Datenbank nicht.
Ich arbeite nur mit ein paar Datensätzen.

Naja, wenns nich klappt mach ich das einfach doch mit nem Record.