[Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

[Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von MmVisual »

Hallo,

Beim TValueListEditor kann man mit OnSelectEditor ein eigenes Edit-Feld anhängen (z.B. TCombobox für eine Auswahl). Das funktioniert so weit auch.

Nur wenn ich Funktionen aufrufe wie z.B. .Clear oder .ClearSelections oder .ExecuteCancelAction dann wird das vom TValueListEditor ignoriert und das mit OnSelectEditor erzeugte Steuerelement wird nicht automatisch gelöscht.

Das einzge was ich heraus gefunden habe wo das Steuerelement sicher gelöscht wird ist bei .Enabled := False;

Also ich muss zum Leeren und neu aufbauen des TValueListEditor immer bevor ich ein .Clear ausführe ein .Enabled := False; setzen, ansonsten kann es passieren dass eine Exception kommt, da ansonsten ein Steuerelement ohne Bezug zum Editor herrscht.

Soll ich dazu ein Bugreport schreiben?

VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von wp_xyz »

Poste doch bitte ein kleines Projekt, so dass man sieht, was du genau machst.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von MmVisual »

Ich habe mal ein Testprojekt erstellt, doch damit lässt sich der Fehler leider nicht nachstellen. Es sieht alles korrekt aus.
Das Problem trat auch nicht bei meinem Rechner auf.
TestValueListEditor.zip
(3.71 KiB) 77-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von wp_xyz »

Erstmal: Ich meine, dass es nicht nötig ist, den Zelleditor in jedem OnSelectEditor neu zu erzeugen. TCustomGrid macht das auch nicht: die im Grid möglichen Zelleditor-Typen werden jeweils mit dem Erzeugen des Grid erzeugt, allerdings auf unsichtbar geschaltet. Zum Editieren wird der im OnSelectEditor ausgewählte Editor auf sichtbar geschaltet. Es reicht also, einmal zu Beginn die Combobox auf das Formular zu setzen und Visible=false einzustellen. In OnSelectEditor übergibt man dem Editor-Parameter die Combobox und setzt die Bounds des Editor auf die zu bearbeitende Zelle:

Code: Alles auswählen

procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if (aCol=3) and (aRow>0) then begin
    ComboBox1.BoundsRect:=StringGrid1.CellRect(aCol,aRow);
    ComboBox1.Text:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row];
    Editor:=ComboBox1;
  end;
end; 
Das ist aus dem "gridcelleditor" Beispielprojekt im Ordner examples/gridexamples der Lazarus-Installation. Mehr muss man nicht tun. Damit spart man sich auch die massive Speicherverschwendung in deinem Beispiel-Code, weil die Combobox mit jedem OnSelectEditor neu erzeugt, aber nie freigegeben wird. (HeapTrc meldet allerdings kein Speicherleck, weil die Comboboxen mit dem Formular als Owner erzeugt werden).

Nun zu deinem Problem: Ich denke, das liegt an der Standardeinstellung von TValueListEditor, die die Option goAlwaysShowEditor aktiviert (im Gegensatz zum den anderen Grids). Dadurch bleibt der Zell-Editor, also deine Combobox, immer sichtbar. Entferne diese Option, und der Editor verschwindet, wenn du ein anderes Control fokussierst. (Das erklärt auch, dass du in dem geposteten Projekt den Fehler nicht nachvollziehen kannst, denn hier wird goAlwaysShowEditor nicht verwendet - durch Setzen dieser Option kann ich den Fehler reproduzieren).

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von MmVisual »

Wenn das Grid den Editor nicht wieder frei gibt und ich das selbst irgendwie machen muss, da hatte ich wohl eine Wissenslücke über deren Funktionsweise.
Ich bin jetzt wohl erst mal eine weile beschäftigt das um zu bauen, da ich doch sehr viele diesen OnSelectEditor benutzt habe.

Dankeschön für das anschauen/analysieren von meinem Code.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben

Beitrag von wp_xyz »

MmVisual hat geschrieben:
Di 12. Dez 2023, 22:50
Wenn das Grid den Editor nicht wieder frei gibt und ich das selbst irgendwie machen muss, da hatte ich wohl eine Wissenslücke über deren Funktionsweise.
Wer ein Objekt erzeugt, muss es auch wieder freigeben. (Stimmt nicht immer, aber in den allermeisten Fällen)

Antworten