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
[Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben
-
- 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
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben
Poste doch bitte ein kleines Projekt, so dass man sieht, was du genau machst.
-
- 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
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.
Das Problem trat auch nicht bei meinem Rechner auf.
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben
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:
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).
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;
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).
-
- 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
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.
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
Re: [Bug] TValueListEditor und OnSelectEditor -> der Editor wird nicht freigegeben
Wer ein Objekt erzeugt, muss es auch wieder freigeben. (Stimmt nicht immer, aber in den allermeisten Fällen)