Hallo, ich entwickle eine Multiformanwendung mit Hilfe eines Virtual Treeviews. Die Forms werden zur Laufzeit in ein Panel geladen.
Beim Klick auf bestimmte Nodes werden entsprechende Forms erzeugt und dann im MainPanel(Containerpanel) mit all seinen Komponenten angezeigt. Die Nodes des Virtual Treeviews werden durch Werte einer Datenbank gefüllt. Es wird eine Baumstruktur mit Jahren/Projekten/Kategorien gebildet. Das ganze sieht dann so aus:
Anhang 51016
Die einzelnen Forms werden bei Auswahl im Treeview so erzeugt:
Delphi-Quellcode:
type
PTreeData = ^TTreeData;
TTreeData = record
ID: Integer;
Jahr: String;
Projekt: String;
Kategorie: String;
FormIndex: Integer;
end;
Delphi-Quellcode:
procedure TfmMain.VSTClick(Sender: TObject);
var
NewFormClass: TFormClass;
NewForm: TForm;
NodeData: PTreeData;
Node: PVirtualNode;
begin
Node := VST.FocusedNode;
if not Assigned(Node) then
Exit;
NodeData := VST.GetNodeData(Node);
case NodeData.FormIndex of
0:
NewFormClass := TfmForm1; // Form für Positionen
1:
NewFormClass := TfmForm2; // Form für Kunden
2:
NewFormClass := TfmForm3; // Form für Rechnungen
3:
NewFormClass := TfmForm4; // Form für Listen
...
else
NewFormClass := nil;
end;
begin
if ContainerPanel.ControlCount > 0 then
ContainerPanel.Controls[0].Free;
if Assigned(NewFormClass) then
begin
NewForm := NewFormClass.Create(Self);
NewForm.Hide;
NewForm.BorderStyle := bsNone;
NewForm.Parent := ContainerPanel;
NewForm.Align := alClient;
NewForm.Show;
end;
end;
end;
Beim Anklicken eines Nodes werden dann die einzelnen Formulare angezei
Wie kann ich jetzt von Form2(Kunde) Form3(Rechnungen) aufrufen?
Hab mal folgenden Ansatz versucht:
Beim Anklicken eines Buttons wird der gewünschte Node fokusiert und selektiert.
Dann wird die OnClick Methode von VST aufgerufen. So als hätte ich mit der Maus auf den entsprechenden Node des VST geklickt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
MyNewFocusedNode: PVirtualNode;
begin
MyNewFocusedNode := GetNodeByFormIndex(VST,145); // (145 wäre hier z.B. der Node für Rechnungen)
if Assigned(MyNewFocusedNode) then
VST.FocusedNode := MyNewFocusedNode;
VST.Selected[MyNewFocusedNode] := true;
VST.OnClick(Sender);
end;
Delphi-Quellcode:
// Funktion zum Auffinden des Formindex
function GetNodeByFormIndex(AVST: TCustomVirtualStringTree; FINDEX: Integer): PVirtualNode;
var
Data: PTreeData;
Node: PVirtualNode;
begin
Result := nil;
begin
Node := AVST.GetFirst();
while Assigned(Node) and (Result = nil) do
begin
Data := AVST.GetNodeData(Node);
if Assigned(Data) and (Data.FormIndex = FINDEX) then
Result := Node;
Node := AVST.GetNext(Node);
end;
end;
end;
Ist das der richtige Ansatz oder gibt es einen eleganteren Weg ein anderes Formular aufzurufen?