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 user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: 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 user profile iconTh69: (Voll-)Zitat entfernt.
Moderiert von user profile iconTh69: 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

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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