Einzelnen Beitrag anzeigen

e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#1

Listview SelectItem verhinden?

  Alt 29. Mai 2018, 14:32
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 Edit1.Text:= Item.Caption , 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. 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 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 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
  Mit Zitat antworten Zitat