![]() |
Zwischen virtuellen Formularen wechseln und suchen
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:
Beim Anklicken eines Nodes werden dann die einzelnen Formulare angezei
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; 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:
Ist das der richtige Ansatz oder gibt es einen eleganteren Weg ein anderes Formular aufzurufen?
// 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; |
AW: Zwischen virtuellen Formularen wechseln und suchen
Ich würde das Ganze völlig anders organisieren.
Definiere einen enumerated type, der die Entitäten listet, die Du anzeigen und bearbeiten mußt: Type TBusinessEntity = (beKunde, beRechnung, ....); In deinem TTreeData-Record würde ein Feld dieses Typs beschreiben, welche Art von Daten der Record enthält, als Ersatz für deinen FormIndex. Für jede dieser Entities baust Du ein Form (oder besser ein Frame), das die zugehörigen Daten anzeigen kann. Alle diese Forms/Frames sind von einer Basisklasse abgeleitet (Stichwort visual form inheritance), von der sie eine public Methode oder ein interface erbene, mit deren Hilfe man dem Form/Frame z. B. ein TTreenode übergeben kann, um es mit Daten zu füllen. Dann brauchst Du noch eine Factory für diese Forms, in der jede der Klassen sich registriert, zusammen mit dem TBusinessEntity-Wert, für das sie gedacht ist. Das erfolgt jeweils im Initialization-Teil der zugehörigen Unit; die Factory selbst (eine Singleton) sitzt in einer eigenen Unit. Dein case NodeData.FormIndex of wird dann ersetzt durch NewForm := Factory.CreateUIFor(Nodedata.Entity); Wenn das Kundenform eines für eine Rechnung braucht, verwendet es einfach RechnungsForm := Factory.CreateUIFor(beRechnung); Damit hast Du nicht nur eine vollständige Entkopplung von Mainform und den anderen (die mainform-Unit kennt nur die Factory,den enumerated type und die Basisklasse für die Forms), das Gerüst ist auch einfach erweiterbar, wenn Du neue Entities unterstützen mußt. |
AW: Zwischen virtuellen Formularen wechseln und suchen
Danke erstmal.
Hört sich gut an, muss mich aber da erst mal reindenken. Ob ich das selber hinkriege bezweifle ich:shock: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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