Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ein Control per Procedure selektieren (https://www.delphipraxis.net/58264-ein-control-per-procedure-selektieren.html)

torud 4. Dez 2005 13:12


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?

marabu 4. Dez 2005 13:43

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:
procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(Node) then
    TWinControl(Node.Data).SetFocus;
end;
Grüße vom marabu

torud 4. Dez 2005 13:47

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?

marabu 4. Dez 2005 14:02

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:
Node.Text := Form2.Edit1.Name;
Node.Data := Form2.Edit1;
marabu

Draußen waren es heute vormittag +8 Grad Celsius, aber seit es in der DP schneit friere ich...

torud 4. Dez 2005 14:05

Re: Ein Control per Procedure selektieren
 
Jo, danke, ich werde das gleich mal probieren!

torud 4. Dez 2005 14:16

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:
AktNode:=Obj_list.TreeView1.Items.AddChild(Obj_list.GetTreeItems(Obj_list.TreeView1.Items, 'Kameras'),(CompListCam.Strings[i]));
AktNode.Data:=Form2.FindComponent(CompListCam.Strings[i]);
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'.

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...

marabu 4. Dez 2005 20:20

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:
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;
Grüße vom marabu

jim_raynor 4. Dez 2005 20:21

Re: Ein Control per Procedure selektieren
 
Zitat:

Zitat von torud
---------------------------
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.

Du hast irgendwo einen Format Befehl drin, dem du als Paramater keinen Pointer sondern irgendwas anderes übergibts.

torud 5. Dez 2005 08:53

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:
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;
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...

marabu 5. Dez 2005 11:14

Re: Ein Control per Procedure selektieren
 
Hallo Tom,

Zitat:

Zitat von torud
Also das mit dem Rahmen für die Selektierung übernimmt die Komponente von Creatis. Das ist also meine Sorge nicht.

ich wollte dich nicht vom Weg abbringen, sondern habe nur beschrieben wie ich vorgehe, da ich die von dir verwendeten Komponenten nicht auf meiner Maschine installiert habe.

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 16:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz