Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listview SelectItem verhinden? (https://www.delphipraxis.net/196537-listview-selectitem-verhinden.html)

e-gon 29. Mai 2018 13:32

Listview SelectItem verhinden?
 
Hallo,

in meinem Programm verwende ich ein Listview mit mehreren Subitems im vsReport-Modus. Wenn nun der Benutzer ein Item auswählt, werden die Inhalte (Caption und Subitems) des ausgewählten Items in der Funktion ListView1SelectItem zur Bearbeitung an andere Komponenten (alle vom Typ TEdit) übertragen.

Also
Delphi-Quellcode:
Edit1.Text:= Item.Caption
,
Delphi-Quellcode:
Edit2.Text:= Item.Subitem[0]
usw...

Wird nun der Eintrag diesen Komponenten verändert (z.B. Edit2.Text), kann diese Änderung mit Hilfe eines Speicher-Buttons (Button1), über die Funktion 'Speichern', an das Listview-Item übermittelt werden.

Außerdem gibt es Pflichtfelder, die Inhalte haben müssen. Sind diese Felder leer (also z.B.
Delphi-Quellcode:
Edit2.Text=''
) bekommt der User beim Betätigen des Speicher-Buttons eine Fehlermeldung, es werden keine Daten an in das Listview geschrieben und die Komponente mit dem fehlenden Eintrag erhält den Cursor (also
Delphi-Quellcode:
Edit2.SetFocus
).

Das funktioniert auch alles ganz gut. Allerdings vergessen die Benutzer nach der Änderung manchmal den Speicher-Button zu benutzen und bei der Auswahl eines anderen Listview-Eintrags sind die Änderungen dann verloren.

Um das zu verhindern setze ich den Speicher-Button zunächste auf
Delphi-Quellcode:
Button1.Enabled:= False
. Und bei Änderungen (z.B. von Edit1.Text), wird über Edit1Change Button1.Enabled auf True gesetzt. Wenn der User nun einen anderen Listview-Eintrag wählt, muss ich voher in ListView1SelectItem prüfen, ob Button1.Enabled auf True ist. Falls ja, bekommt der Benutzer eine Abfrage ob die geänderten Daten gespeichert werden sollen. Falls ja, wird die Speicherfunktion 'Speichern' aufgerufen.

Das Ganze geht so lange gut, bis der Benuter ein Pflichtfeld vergisst. Dann darf ListView1SelectItem ja eigentlich nicht auf ein neues Item gesetzt werden. Aber wie soll ich das verhindern? Oder gibt es eine andere elegante Lösung? Wie würdet Ihr sowas angehen?

Und hier der Code:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private-Deklarationen }
    function Speichern(Item: TListItem): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Speichern(Item: TListItem): Boolean;
begin
  Result:= True;

  if Result and (Edit2.Text='') then begin
    Result:= False;
    Messagedlg('Feld 2 muss ausgefüllt sein!',mtError,[mbOk],0);
    Edit2.SetFocus;
  end;

  if Result and (Edit4.Text='') then begin
    Result:= False;
    Messagedlg('Feld 4 muss ausgefüllt sein!',mtError,[mbOk],0);
    Edit4.SetFocus;
  end;

  if Result then begin
    ListView1.Selected.Caption:= Edit1.Text;
    ListView1.Selected.SubItems[0]:= Edit2.Text;
    ListView1.Selected.SubItems[1]:= Edit3.Text;
    ListView1.Selected.SubItems[2]:= Edit4.Text;

    Button1.Enabled:= False;
  end;
end;

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var Ok: Boolean;
begin
  Ok:= True;

  if Button1.Enabled=True then begin
    if Messagedlg('Der Eintrag wurde verändert. Soll diese Änderung übernommen werden?',
                  mtConfirmation,[mbYes,mbNo],0)=mrYes then begin
      Ok:= Speichern(Item);
      // Was tun, wenn Ok=False ist??????
    end;
  end;

  if Selected then begin
    Edit1.Text:= Item.Caption;
    Edit2.Text:= Item.SubItems[0];
    Edit3.Text:= Item.SubItems[1];
    Edit4.Text:= Item.SubItems[2];
  end
  else begin
    Edit1.Text:= '';
    Edit2.Text:= '';
    Edit3.Text:= '';
    Edit4.Text:= '';
  end;

  Button1.Enabled:= False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Speichern(ListView1.Selected);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Enabled:= False;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Button1.Enabled:= True;
end;

end.
Ich hoffe, ich konnte dieses Mal das Problem deutlich machen.

Gruß
e-gon

EWeiss 30. Mai 2018 09:40

AW: Listview SelectItem verhinden?
 
opps sorry war Blödsinn falsch interpretiert.

gruss

Redeemer 30. Mai 2018 17:03

AW: Listview SelectItem verhinden?
 
Delphi-Referenz durchsuchenOnChanging

himitsu 30. Mai 2018 17:15

AW: Listview SelectItem verhinden?
 
Zitat:

Zitat von Redeemer (Beitrag 1403466)

Das ist bei vielen Komponenten so.

OnChanging = Before (abbrechen, bevor es passiert)
OnChanged = After (oder zurücksetzen, nachdem es jetzt falsch steht)

e-gon 8. Jun 2018 08:51

AW: Listview SelectItem verhinden?
 
Danke für die Antworten!

Richtig! An OnChanging habe ich gar nicht gedacht. Damit wird es wohl gehen.

Danke
e-gon


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz