![]() |
Problem mit VST Node Löschen nach Edit
Liste der Anhänge anzeigen (Anzahl: 1)
Hi DPler,
Ich nutze Inplace Editors (IVTEditLink) und habe nun ein Problem damit: Ich möchte einen neuen Node, wenn der Benutzer keine Daten eingegeben hat gleich wieder löschen. Wo mache ich das am besten?
Delphi-Quellcode:
Das Problem ist jetzt: Es klappt genau 1x: Benutzer klickt hinzufügen, drückt ESC - alles ok soweit. Benutzer klickt nun erneut hinzufügen: AV, ListIndex Fehler (hier wird versucht bei der OL auf den Index 605800x zuzugreifen - obwohl es nur 4 Elemente gibt), EOutOfMemory - je nach Wahl und Ansatz.
procedure TEditPropertyLink.DoCancelEdit;
var NodeData: PGridNodeData; Item: TBLItemSizesObject; begin inherited; NodeData := FTree.GetNodeData(FNode); // delete added row if user has not entered any data if Assigned(NodeData) and (NodeData.FieldData.Name = '') then begin Item := NodeData.FieldData; FTree.DeleteNode(FNode, True); // Item.Delete; // remove Item from ObjectList end; end; Code zum Hinzufügen:
Delphi-Quellcode:
Der Record ist so definiert:
procedure TfrmEditItemSizes.actAddExecute(Sender: TObject);
var Idx: Integer; Node: PVirtualNode; NodeData: PGridNodeData; begin Idx := FItemSizes.Add; Node := vstList.AddChild(nil); vstList.ValidateNode(Node, False); NodeData := vstList.GetNodeData(Node); if Assigned(NodeData) then begin NodeData.FieldData := FItemSizes[Idx]; vstList.EditNode(Node, 0); end; end;
Delphi-Quellcode:
Node wird in InitNode zugewiesen:
type
TGridNodeData = record FieldData: TBLItemSizesObject; end; PGridNodeData = ^TGridNodeData;
Delphi-Quellcode:
Ich habe schon überlegt, die Nodes besser in vst.OnEditCancelled zu löschen.
procedure TfrmEditItemSizes.vstListInitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var NodeData: PGridNodeData; begin NodeData := Sender.GetNodeData(Node); NodeData.FieldData := FItemSizes[Node.Index]; end; Gesucht habe ich schon sehr lange, hier und in Google ;) Aber eine gute Beschreibung zum IVTEditLink finde ich nicht, ich habe mich an die interne Implementation vom TVTEdit und StringEditor gehalten. Hat jemand eine Idee? Edit: Ganz vergessen, setzte FastMM4 im FullDebugMode ein, alle Checks manuell eingeschaltet und ScanMemoryPoolForCorruption ist auch an. Der Stacktracke im Debugger ist für mich aber nicht nachvollziehbar an dieser Stelle: Gruß Assertor Stacktrace: Zitat:
|
Re: Problem mit VST Node Löschen nach Edit
Ich habe eben versucht dein Problem nachzuvollziehen:
Ich habe einen VirtualStringTree und einen Button auf eine leere Form in einem neuen Projekt platziert. Dazu habe ich die Eigenschaft MiscOptions --> toEditable des Trees auf True gesetzt. Events siehe unten. Im OnEditCancelled funktioniert es wunderbar...
Delphi-Quellcode:
Versuch mal in kleinen Einzelschritten deinen Code an diesen BeispielCode anzupassen.
procedure TForm1.Button1Click(Sender: TObject);
begin VirtualStringTree1.RootNodeCount := 1; end; procedure TForm1.VirtualStringTree1EditCancelled(Sender: TBaseVirtualTree; Column: TColumnIndex); begin VirtualStringTree1.DeleteNode(VirtualStringTree1.RootNode.FirstChild, True); end; Scheinbar hast du da einen kleinen Bug hinsichtlich des Indexes drin?! |
Re: Problem mit VST Node Löschen nach Edit
Hallo Marus,
danke für Deine Antwort! Zitat:
Ich werde mal jetzt ein Testprojekt erstellen, welches das Problem verdeutlich. Unter Umständen, sehe ich damit schon klarer ;) Ich werde auf jeden Fall hier nochmal posten. Gruß Assertor |
Re: Problem mit VST Node Löschen nach Edit
Vielleicht ist es ja auch sinnvoller den leeren Node an einer anderen Stelle wieder zu entfernen.
z.B. im OnExit oder OnFocusChanged des VST So hat der Benutzer immer noch die Chance in den leeren Node was einzugeben und muss nicht erneut auf den Add Button drücken. |
Re: Problem mit VST Node Löschen nach Edit
Hi,
Zitat:
Lösche ich außerhalb, also z.B. per PostMessage() im IVTEditLink an das Form und dann innerhalb des Forms, geht es :) Somit stelle ich das mal auf gelöst. Danke für die Hilfe! Gruß Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 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-2025 by Thomas Breitkreuz