AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Listview SelectItem verhinden?

Ein Thema von e-gon · begonnen am 29. Mai 2018 · letzter Beitrag vom 8. Jun 2018
Antwort Antwort
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
154 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
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Listview SelectItem verhinden?

  Alt 30. Mai 2018, 10:40
opps sorry war Blödsinn falsch interpretiert.

gruss
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
793 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Listview SelectItem verhinden?

  Alt 30. Mai 2018, 18:03
Delphi-Referenz durchsuchenOnChanging
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.709 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Listview SelectItem verhinden?

  Alt 30. Mai 2018, 18:15
Das ist bei vielen Komponenten so.

OnChanging = Before (abbrechen, bevor es passiert)
OnChanged = After (oder zurücksetzen, nachdem es jetzt falsch steht)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
e-gon

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

AW: Listview SelectItem verhinden?

  Alt 8. Jun 2018, 09:51
Danke für die Antworten!

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

Danke
e-gon
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf