![]() |
Ein Control per Procedure selektieren
Hallo Wissende!
Ich benutze von Creatis die Komponente FormDesPro zum Verschieben von Komponenten. Das klappt alles super, aber ich müsste auch realisieren können, dass ich die Controls, welche ich in einen Treeview reinparse, per Klick auf den Item des Treeview selektiere. Wie kann man sowas realisieren? |
Re: Ein Control per Procedure selektieren
Hallo Tom,
wenn du beim Aufbauen der TreeView eine Referenz auf das jeweilige Control in der property Data des zugehörigen TTreeNode ablegst, dann kannst du im Ereignis OnChange() der TreeView das Control fokusieren:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin if Assigned(Node) then TWinControl(Node.Data).SetFocus; end; |
Re: Ein Control per Procedure selektieren
Hallo Marabu!
Also so habe ich es noch nicht versucht, denn ich habe es so gemacht, dass ich den Node.Text=Control.Name aufgebaut habe. Vielleicht geht das auch!? Ich werde also mal Node.Data versuchen Problem ist nur, dass das Control natürlich auf einem andern Formular liegt. Müsste ich dann also beispielsweise in Node.Data:=Control.Name schreiben, oder Node.Data:=Formular.Control.Name? |
Re: Ein Control per Procedure selektieren
Auf welcher Form dein Control liegt ist egal, da du ja den Zugriff immer qualifizieren kannst. Wenn du für deinen Ansatz über die name property der Controls keine gewichtige Motivation hast, dann ist eine direkte Referenz doch einfacher zu verwenden. Den Namen (oder ClassName, wenn kein Name existiert) des Control wirst du wohl weiter als Node.Text verwenden. Ich schlage dir nur vor zusätzlich einen Zeiger auf das Control in der property Node.Data abzulegen:
Delphi-Quellcode:
marabu
Node.Text := Form2.Edit1.Name;
Node.Data := Form2.Edit1; Draußen waren es heute vormittag +8 Grad Celsius, aber seit es in der DP schneit friere ich... |
Re: Ein Control per Procedure selektieren
Jo, danke, ich werde das gleich mal probieren!
|
Re: Ein Control per Procedure selektieren
Leider hat das nicht funktioniert. Ich habe direkt noch beim Starten eine Fehlermeldung erhalten, welche ich dann erstmal weggeklickt habe und beim Selektieren eines Eintrages kam folgendes:
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Projekt1.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: 'Format '%p' ungültig oder nicht kompatibel mit Argument'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- Woran kann das nun liegen? Ich muss nun noch zugeben, dass ich Node.Data wie folgt befüllt habe:
Delphi-Quellcode:
In CompListCam befinden sich alle Controls, die eine Kamera darstellen. CompListCam ist eine Stringliste. Vielleicht ist nun FindComponent nicht geeignet, um einen Zeiger für Data zu erstellen??? AktNode ist in diesem Falle auch noch ein Child des Nodes 'Kameras'.
AktNode:=Obj_list.TreeView1.Items.AddChild(Obj_list.GetTreeItems(Obj_list.TreeView1.Items, 'Kameras'),(CompListCam.Strings[i]));
AktNode.Data:=Form2.FindComponent(CompListCam.Strings[i]); Und vielleicht ist es mit der OnChange-Methode nicht so glücklich? Warum kann ich es eigentlich nicht mit der OnClick-Methode erledigen? Und vielleicht ist es auch noch wichtig zu wissen, dass es sich zumeist nur um Labels und Images handelt, welche beim Selektieren einen eigenen Rahmen erhalten. Vielleicht ist es deshalb ein Problem, weil TImage kein SetFocus hat!? und leider hat es mit dem Label auch nicht funktioniert... |
Re: Ein Control per Procedure selektieren
Hallo Tom,
mein Beispiel war auf Nachfahren von TWinControl ausgerichtet - kein Wunder, wenn es bei dir nicht funktioniert. Ich weiß zwar nicht wie du die Hervorhebung von Image und Label machen willst, wenn der entsprechende Knoten in der TreeView selektiert wird, aber ich habe mir ein Test-Szenario aufgebaut, bei dem jedes Control auf einem Panel liegt. Beim Selektieren des entsprechenden Knotens schalte ich die Farbe des Panels um und mein Image bzw. Label (ParentColor = False) erhält eine rötliche Aura:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.FormCreate(Sender: TObject);
var node: TTreeNode; begin node := TreeView.Items.AddChildObject(nil, 'DemoLabel', DemoLabelPanel); TreeView.Items.AddChildObject(node, 'DemoImage', DemoImagePanel); end; procedure TDemoForm.TreeViewChanging(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); begin if Assigned(TreeView.Selected) then TPanel(TreeView.Selected.Data).Color := clBtnFace; end; procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode); begin if Assigned(Node) then TPanel(Node.Data).Color := clRed; end; |
Re: Ein Control per Procedure selektieren
Zitat:
|
Re: Ein Control per Procedure selektieren
Hallo!
Also das mit dem Rahmen für die Selektierung übernimmt die Komponente von Creatis. Das ist also meine Sorge nicht. Und nun zum Punkt mit dem Format. Ich erstelle wie schon beschrieben eine Stringliste, in die ich die Namen bestimmter Controls aufnehme. hier mein Code, wie ich beispielsweise folgendes Liste befülle.
Delphi-Quellcode:
Also ich denke, dass hieraus ersichtlich werden sollte, dass ich nichts an den Inhalten irgendwie formatiere. Wer hat noch eine Idee nen Tipp, oder findet gar einen Fehler? Das ich teilwese umständlich arbeite, ist meinem gefährlichen Halbwissen geschuldet...
TreeListCam:=TStringlist.Create; //stringliste für inhalt des treeview
CompListCam:=TStringlist.Create; //stringliste für componenten //Liste mit inhalt des treeviews wird erstellt for i:= 0 to obj_list.TreeView1.Items.Count-1 do begin if obj_list.TreeView1.Items.Item[i].HasAsParent(obj_list.GetTreeItems(Obj_list.TreeView1.Items, 'Kameras')) then TreeListCam.Add(obj_list.TreeView1.Items.Item[i].Text); end; //befüllen der Liste, wenn Tag des Controls = 1 for i:= 0 to ComponentCount-1 do begin //kameraliste 1 if (Components[i] is TImage) and ((Components[i] as TImage).Name<>'') and ((Components[i] as TImage).Tag = 1) then CompListCam.Add((Components[i] as TImage).Name); end; //Listen werden verglichen und die einträge erstellt for i:=0 to CompListCam.Count-1 do begin if (TreeListCam.IndexOf(CompListCam.Strings[i])=-1) then begin AktNode:=Obj_list.TreeView1.Items.AddChild(Obj_list.GetTreeItems(Obj_list.TreeView1.Items, 'Kameras'),(CompListCam.Strings[i])); AktNode.Data:=Form2.FindComponent(CompListCam.Strings[i]); AktNode.ImageIndex := 39; AktNode.SelectedIndex := 39; end; end; //Listen werden verglichen und die einträge gelöscht for i:=0 to TreeListCam.Count-1 do begin if (CompListCam.IndexOf(TreeListCam.Strings[i])=-1) then begin Obj_list.TreeView1.Items.Delete(Obj_list.GetTreeItems(Obj_list.TreeView1.Items, TreeListCam.Strings[i])); end; end; |
Re: Ein Control per Procedure selektieren
Hallo Tom,
Zitat:
Hast du zum Testen mal deine Debugger-Optionen so eingestellt, dass bei Delphi-Exceptions angehalten wird? Du könntest so die Stellen lokalisieren, an denen Übles geschieht. Setze dann einfach einen BreakPoint und inspiziere die beteiligten Variablen, dann solltest du recht schnell erkennen, wo dein Fehler im Code steckt. Vielleicht solltest du auch das Ergebnis von FindComponent() noch nach TWinControl casten, bevor du es in der Data property des TreeNode verankerst. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz