![]() |
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:
usw...
Edit2.Text:= Item.Subitem[0]
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:
) 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.Text=''
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:
. 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.
Button1.Enabled:= False
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:
Ich hoffe, ich konnte dieses Mal das Problem deutlich machen.
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. Gruß e-gon |
AW: Listview SelectItem verhinden?
opps sorry war Blödsinn falsch interpretiert.
gruss |
AW: Listview SelectItem verhinden?
|
AW: Listview SelectItem verhinden?
Zitat:
OnChanging = Before (abbrechen, bevor es passiert) OnChanged = After (oder zurücksetzen, nachdem es jetzt falsch steht) |
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 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz