Autor Beitrag
hawiwo
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 06.05.22 13:52 
Hallo,

ich habe in meiner Anwendung eine TControlListe nach der Video-Anleitung TControlList - New in Delphi 10.4.2 programmiert.

In einem TControlListButton (OnClick) möchte ich einen Datensatz (TClientDataSet) löschen mit:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4571
Erhaltene Danke: 1004

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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 wird das nochmal dargestellt.
Jedoch ohne AIndex zu inkrementieren. Lässt man das weg, wird immer nur der eine erste Datensatz angezeigt.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4571
Erhaltene Danke: 1004

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden 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