Autor Beitrag
awzvm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 21.11.08 17:57 
Hallo,

ich möchte in Delphi 2009 alle Einträge eines TreeView markieren. Dazu habe ich hier im Forum diesen Code gefunden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var  
  X: Integer;  
begin  
  for X := 0 to TreeView1.Items.Count - 1 do  
    TreeView1.Subselect(TreeView1.Items[X]);  
  TreeView1.SetFocus;  
end;


Leider bringt mir Delphi bei der Ausführung immer den Fehler "Listenindex überschreitet das Maxikum (1)". Woran kann das liegen, und wie kann ich alles markieren.
Ist bestimmt nur was Kleines, aber was *gübel*

LG
awzvm
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.11.08 18:49 
Den Fehler kann ich mit Delphi 2009 leider nicht reproduzieren.

Was habe ich gemacht?
TreeView aufs Formular, MultiSelect an, 3 Einträge erzeugt, bei zwei Einträgen davon Untereinträge hinzugefügt, nen Button dazu und deinen Code eingefügt.
Funktioniert wunderbar ohne Fehler. :nixweiss:

Machst du was wenn ein Eintrag markiert wird? Dann wird der Fehler in diesem Event liegen. Kommt dein Code mit Multiselect nicht klar vielleicht?
awzvm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 21.11.08 20:25 
Wenn ein Eintrag markiert wird, werden weitere Aktion ausgeführt. Selbst, wenn ich diese unterbinde, kommt weiterhin dieser Fehler :-(
In der Einzelanweisung steigt er auch in der ersten Zeile aus "TreeView.Subselect(TreeView.Items[i]);"

Woran kann das liegen? Kann man hier einen Fehler sehen?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
function TMain.ShowTree(typ:integer):Integer;
var node1,node2,node3,node4,node5,node6,node7,node8,node9:TTreeNode;
    i,vorher:integer;
    Code:String;
    Expansion,Selection:Array of Boolean;
begin

if TreeView.Items.Count>0 then if T_Selected.Text='0' then T_Selected.Text:='1';
vorher:=StrToIntDef(T_Selected.Text,1);

if ((typ=2AND (TreeView.Items.Count>0) ) then        
begin
  //lesen der Knoten, welche expandiert und selektiert sind.
  SetLength(Expansion, TreeView.Items.Count);
  SetLength(Selection, TreeView.Items.Count);
  for i:=0 to TreeView.Items.Count-1 do
  begin
    Expansion[i]:=TreeView.Items[i].Expanded;
    Selection[i]:=TreeView.Items[i].Selected;
  end;
end;

//initalisieren
 node1:=nil;
 node2:=nil;
 node3:=nil;
 node4:=nil;
 node5:=nil;
 node6:=nil;
 node7:=nil;
 node8:=nil;
 node9:=nil;

TreeView.Items.Clear;

//Aufbau der Struktur 
//...


T_Selected.Text:=IntToStr(vorher);

if ((typ=2AND (TreeView.Items.Count>0)) then   
begin

//Knoten expandieren, welche zuvor expandiert waren
for i:=0 to TreeView.Items.Count-1 do
  begin
    TreeView.Items[i].Expanded:=Expansion[i];
  end;

//Node selektieren, welche zuvor schon selektiert waren
for i:=0 to TreeView.Items.Count-1 do
  begin
    TreeView.Subselect(TreeView.Items[i]);               // Hier steigt Delphi aus ..........................
    TreeView.SetFocus;
  end;
awzvm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Di 25.11.08 09:15 
Das Problem ist mehr oder wenig gelöst:

Ich habe für das Markieren der Einträge eine extra Procedure angelegt, welche nach dem erstellen des Trees und nach dem Expandieren der Knoten aufgerufen wird.
Wichtig ist dabei, das der Tree zuvor den Forcus erhält, da sonst der Fehler wieder erscheint. ERhält er den Focus, so markiert er selbstständig den ersten (0ten) node.
Um das zu umgehen habe ich den ersten zu markierten gesucht und eigenständig markiert, Alle weiteren werden mit subSelect markiert.

Hier meine Lösung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TMain.MarkierenImLeistungsbaumClick(Sender: TObject);
var i,j:integer;
begin

if Length(Selection)>0 then
begin

j:=0;

//finden vom ersten True in Selection und setzen
for i:=0 to Length(Selection)-1 do
 if Selection[i]=TRUE then begin TreeView.Items[i].Selected:=TRUE; j:=i; break; end;

TreeView.SetFocus;

//Ab nächsten Node bis Ende weitere Subselecten
for i:=j to TreeView.Items.Count-1 do
  begin
    if Selection[i]=TRUE then TreeView.Subselect(TreeView.Items[i]);
  end;
end;

end;