Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TControlListButton
hawiwo - Fr 06.05.22 13:52
Titel: TControlListButton
Hallo,
ich habe in meiner Anwendung eine
TControlListe nach der Video-Anleitung
TControlList - New in Delphi 10.4.2 [
https://www.youtube.com/watch?v=PfHV9AhV2NM] programmiert.
In einem
TControlListButton (OnClick) möchte ich einen Datensatz (
TClientDataSet) löschen mit:
Delphi-Quelltext
1:
| ClientDataSet1->Delete(); |
der Datensatz verschwindet in der
TControlList. Nach einer Weile bzw. nach einem
ClientDataSet1->Refresh erscheint ein Fehlerdialog: "Am Ende der Tabelle."
Ausgelöst wird das im
BeforeDrawItem-Event an der einen Zeile:
Delphi-Quelltext
1:
| ClientDataSet1->RecNo = AIndex + 1; |
hier zählt der
BeforeDrawItem-Event offensichtlich noch den gelöschten Eintrag mit.
weiß jemand wie man das Problem löst?
Moderiert von Th69: Delphi-Tags hinzugefügt
Moderiert von Th69: URL-Titel hinzugefügt.
Th69 - Fr 06.05.22 16:21
Hallo und :welcome:
wie ist denn AIndex logisch programmiert? Also stellst du sicher, daß dieser Wert nicht größer als die ClientDataSet-Liste (also RecordCount) werden kann?
PS: Und warum das + 1?
hawiwo - Mo 09.05.22 21:33
Das weiß ich auch nicht so genau,weil ich bisher noch keine Doku zu
AIndex gefunden habe.
Auf
Using VCL TControlList Control [
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_VCL_TControlList_Control] wird das nochmal dargestellt.
Jedoch ohne
AIndex zu inkrementieren. Lässt man das weg, wird immer nur der eine erste Datensatz angezeigt.
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm2.ControlList1BeforeDrawItem(AIndex: Integer; ACanvas: TCanvas; ARect: TRect; AState: TOwnerDrawState); begin Label1.Caption := 'Label' + AIndex.ToString; end; |
Moderiert von Th69: (Voll-)Zitat entfernt.
Moderiert von Th69: Delphi-Tags hinzugefügt
Th69 - Di 10.05.22 09:04
Ich habe mir jetzt mal das Video dazu angeschaut.
Für die
TControlList wird ja in der
AfterOpen-Prozedur
ItemCount gesetzt, d.h. beim Löschen eines Datensatzes mußt du die Anzahl ja wieder reduzieren:
Delphi-Quelltext
1:
| ControlList.ItemCount := ControlList.ItemCount - 1; |
Der Wert
AIndex wird ja als Parameter übergeben und hat den aktuellen, null-basierten Index des zu zeichnenden Elements (und das
+1 benötigt mal wohl, weil
RecNo eins-basiert ist).
PS: So ein Control habe ich auch schon mal 2005 (auch in Delphi) erstellt, aber benutzt habe ich es für C++ Builder Projekte (es heißt bei mir
TCtrlGrids).
hawiwo - Mi 11.05.22 06:55
Th69 hat folgendes geschrieben : |
Ich habe mir jetzt mal das Video dazu angeschaut.
Für die TControlList wird ja in der AfterOpen-Prozedur ItemCount gesetzt, d.h. beim Löschen eines Datensatzes mußt du die Anzahl ja wieder reduzieren:
Delphi-Quelltext 1:
| ControlList.ItemCount := ControlList.ItemCount - 1; |
Der Wert AIndex wird ja als Parameter übergeben und hat den aktuellen, null-basierten Index des zu zeichnenden Elements (und das +1 benötigt mal wohl, weil RecNo eins-basiert ist).
PS: So ein Control habe ich auch schon mal 2005 (auch in Delphi) erstellt, aber benutzt habe ich es für C++ Builder Projekte (es heißt bei mir TCtrlGrids). |
Ja, Top. Funktioniert!
Danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!