Autor Beitrag
Freiberger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Do 14.05.09 21:13 
Hallo,

gibt es eine Möglichkeit, von der aktuell gezeichneten Zelle die direkten Koordinaten zum VST anzuzeigen ?

Ich möchte bei manchen Nodes ein Object (TEdit, TImage usw) in die Zelle des Nodes (zB in Spalte 3) setzten.
Dachte an Object.Parent = VST und setzt dann Object.Top & .Left auf die Koordinaten.

Das war mein Ansatz, aber mit CellRect geht es irgendwie nicht...
ausblenden Delphi-Quelltext
1:
procedure VST1.BeforeCellPaint(Sender: TBaseVirtualTree;TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;CellPaintMode: TVTCellPaintMode; CellRect: TRect;var ContentRect: TRect);					
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 14.05.09 21:17 
Das ist aber das richtige, aber von deinem eigentlichen Quelltext hast du ja nichts gezeigt, wie soll ich dazu jetzt etwas sagen?
Was hast du versucht und was ist passiert?
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Do 14.05.09 21:24 
ich habe einfach gesagt folgendes gemacht...
ausblenden Delphi-Quelltext
1:
2:
TEdit1.Top:= CellRect.Top;
TEdit1.Left:= CellRect.Left;

Das ganze nur, bei nem bestimmten Node...
Aber das Object wird immer ganz oben im VST angezeigt...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 14.05.09 21:28 
// EDIT:
:oops: verlesen.

Ich probiere es einmal aus. Das Ereignis wird aber ausgelöst, also du hast angegeben, dass es ausgeführt werden soll?
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Do 14.05.09 21:34 
es sollen mal verschiedene Objecte in bestimmten Zellen angezeigt werden.
Ich habe zu jedem Node im PTreeData ein Object hinterlegt, welches ich dann in einer bestimmten Spalte anzeigen möchte.
Das mit der Spalte klappt auch, aber alle Objecte sind in dem obersten Node angezeigt...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure VST1.OnBeforeCellPaint(Sender: TBaseVirtualTree;TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;CellPaintMode: TVTCellPaintMode; CellRect: TRect;var ContentRect: TRect);
begin
  if Column=1 then begin
     VSTData:= TBaseVirtualTree(Sender).GetNodeData(Node);
     If VSTData.FObject <> nil then begin
        TControl(VSTData.FObject).Parent:= TVirtualStringTree(Sender);
        TControl(VSTData.FObject).Top:= CellRect.Top;
        TControl(VSTData.FObject).Left:= CellRect.Left;
        TControl(VSTData.FObject).Width:= CellRect.Right - CellRect.Left;
        TControl(VSTData.FObject).Height:= CellRect.Bottom - CellRect.Top;
     end;
  end;
end;


---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

OK, das Ereignis heißt eigentlich OnBeforeCellPaint...
Ich habe es nur weitergeleitet, da es von verschiedenen VST genutz wird...


Zuletzt bearbeitet von Freiberger am Do 14.05.09 21:50, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 14.05.09 22:52 
Das Problem ist, dass CellRect nur für das Zeichnen auf dem übergebenen Canvas gedacht ist. Und der beinhaltet nur die aktuelle Zeile.
Wenn du also absolute Koordinaten benötigst, dann musst du dir die extra holen. So sollte es gehen, die Casts sollten doch auch nicht nötig sein:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure VST1.OnBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  MyCellRect: TRect;
begin
  if Column = 1 then
  begin
    MyCellRect := Sender.GetDisplayRect(Node, Column, False);
    VSTData := Sender.GetNodeData(Node);
    if VSTData.FObject <> nil then
    begin
      TControl(VSTData.FObject).Parent := Sender;
      TControl(VSTData.FObject).Top := MyCellRect.Top;
      TControl(VSTData.FObject).Left := MyCellRect.Left;
      TControl(VSTData.FObject).Width := MyCellRect.Right - MyCellRect.Left;
      TControl(VSTData.FObject).Height := MyCellRect.Bottom - MyCellRect.Top;
    end;
  end;
end;
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 16.05.09 11:54 
Wunderbar, es wird alles richtig positioniert.
Genau das habe ich gesucht.

Leider blenden sich die Objekte nicht aus, wenn ich einen Node einklappe.
Ich habe es so gelöst, dass beim einklappen alle Objekte der Childs ausgeblendet werden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure VST1.OnCollapsing(Sender: TBaseVirtualTree; Node: PVirtualNode; var Allowed: Boolean);
var Data: PTreeData;
    t: integer;
    PNode: PVirtualNode;
begin
    PNode:= Node;
    for t:= 0 to Node.TotalCount-1 do begin
        Data:= Sender.GetNodeData(PNode);
        if Data.FObject <> nil then TControl(Data.FObject).Visible:= false;
        PNode:= Sender.GetNext(Pnode);
    end;
end;


Aber trotzdem werden manche Objekte beim Scrollen fehlerhaft angezeigt. (wahrscheinlich, weil OnBeforeCellPaint nicht durchläuft, wenn die Nodes nicht mehr sichtbar sind.
Demzufolge bleiben die Objekt auf der alten (falschen) Position stehen. )

Habe auch schon versucht, mit dem AfterPaint-Ereignis alle Objekte zu positionieren und ein/auszublenden,
je nachdem, ob MyRect einen Wert im VST-Bereich hat.
Aber das klappte nicht, weil AfterPaint viel zu öfter aufgerufen wird...
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 16.05.09 19:52 
mir fällt gerade noch auf, dass ich es doch mit dem OnAfterPaint Ereignis machen muß,
da OnBeforeCellPaint auch nicht auslöst, wenn ich ein Node auf Visible=False setzt.

Warum wird OnBeforePaint & OnAfterPaint mehrmals ausgelöst ?
Welches Ereignis löst nur einmal aus oder wie kann ich OnAfterPaint nur das erste mal nutzen ?