[Erledigt] Seltsames Verhalten mit MessageDlg und Objekt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[Erledigt] Seltsames Verhalten mit MessageDlg und Objekt

Beitrag von MacWomble »

Code: Alles auswählen

  idx := GetArtikelIndex;
  if idx < 0 then               // idx hat den richtigen Wert
    exit;
  A := ArtikelListe[idx];   
 
// A hat den richtigen Inhalt
 
  // wenn die folgende Zeile ausgeklammert ist, funktioniert es wie gewünscht !
  if MessageDlg('Diesen Artikel wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
 
  begin
 
// hier hat A einen anderen Inhalt --- Warum?
// Anm. A hat nun den Inhalt des letzten Artikels in der Artikelliste.
 
    ArtikelListe.DeleteByID(A.ID);
    ArtikelListe.Delete(idx);             // idx noch immer richtig !
    dgArtikel.RowCount := dgArtikel.RowCount - 1;
    if idx >= ArtikelListe.Count then
      idx := ArtikelListe.Count - 1;
    dgArtikel.Row := dgArtikel.FixedRows + idx;
    dgArtikel.Invalidate;
  end;                                         
 


Mir ist schon klar, dass ich die Zeilen einfach nach unten ziehen kann, aber das Verhalten ist seltsam.
Ist dies irgendwie erklärbar?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: [Erledigt] Seltsames Verhalten mit MessageDlg und Objekt

Beitrag von MacWomble »

Manchmal fällt einem kurz nach dem Posten auf, woran es liegen könnte:

Code: Alles auswählen

  idx := GetArtikelIndex;
  if idx < 0 then               // idx hat den richtigen Wert
    exit;
   // Durch den Aufrufe des Dialogs wird das Grid neu gezeichnet und A neu zugewiesen  :oops:
   // A ist zu öffentlich definiert ...
   if MessageDlg('Diesen Artikel wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    A := ArtikelListe[idx]// Die Zuweisung MUSS hier stattfinden ! 
    ArtikelListe.DeleteByID(A.ID);
    ArtikelListe.Delete(idx);             // idx noch immer richtig !
    dgArtikel.RowCount := dgArtikel.RowCount - 1;
    if idx >= ArtikelListe.Count then
      idx := ArtikelListe.Count - 1;
    dgArtikel.Row := dgArtikel.FixedRows + idx;
    dgArtikel.Invalidate;
  end;                                         
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten