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