AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Control per Procedure selektieren

Ein Thema von torud · begonnen am 4. Dez 2005 · letzter Beitrag vom 5. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 14:12
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?
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 14:43
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
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 14:47
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?
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 15:02
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...
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 15:05
Jo, danke, ich werde das gleich mal probieren!
Danke
Tom
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 15:16
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...
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 21:20
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
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: Ein Control per Procedure selektieren

  Alt 4. Dez 2005, 21:21
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Ein Control per Procedure selektieren

  Alt 5. Dez 2005, 09:53
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...
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Ein Control per Procedure selektieren

  Alt 5. Dez 2005, 12:14
Hallo Tom,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.
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