AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TObjectList reagiert nicht auf ModifyAction
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList reagiert nicht auf ModifyAction

Ein Thema von RWarnecke · begonnen am 18. Jun 2011 · letzter Beitrag vom 18. Jun 2011
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 13:05
Delphi-Version: 2010
Hallo zusammen,

ich habe folgendermassen eine Klasse und eine TObjectList deklariert :
Delphi-Quellcode:
  TModifyActionList = (lnNone, lnChange, lnDelete);
  //
  // Event zur Erstellung eines neuen Datensatzes für die Ansprechpartner
  //
  TAnsprechpartnerListe = class;
  TAnsprechpartnerListeAddEvent = procedure(Sender: TObject; Gesellschafter: TAnsprechpartnerListe) of object;
  //
  // Zur Speicherung der Ansprechpartnerliste
  //
  TAnsprechpartnerListe = class
  private
    FOnChange : TAnsprechpartnerListeAddEvent;
    FModifyAction : TModifyActionList;
    FKundenNr : string;
    FVorname : string;
    FNachname : string;
    FTelefon1 : string;
    FTelefon2 : string;
    FFax : string;
    FMobil : string;
    FEMail : string;
    procedure SetKundenNr(Value: string);
    procedure SetVorname(Value: string);
    procedure SetNachname(Value: string);
    procedure SetTelefon1(Value: string);
    procedure SetTelefon2(Value: string);
    procedure SetFax(Value: string);
    procedure SetMobil(Value: string);
    procedure SetEMail(Value: string);
    function GetKundenNr: string;
    function GetVorname: string;
    function GetNachname: string;
    function GetTelefon1: string;
    function GetTelefon2: string;
    function GetFax: string;
    function GetMobil: string;
    function GetEMail: string;
  public
    constructor Create;
    property KundenNr : string read GetKundenNr write SetKundenNr;
    property Vorname : string read GetVorname write SetVorname;
    property Nachname : string read GetNachname write SetNachname;
    property Telefon1 : string read GetTelefon1 write SetTelefon1;
    property Telefon2 : string read GetTelefon2 write SetTelefon2;
    property Fax : string read GetFax write SetFax;
    property Mobil : string read GetMobil write SetMobil;
    property EMail : string read GetEMail write SetEMail;
    property ModifyAction : TModifyActionList read FModifyAction write FModifyAction;
    property OnChange: TAnsprechpartnerListeAddEvent read FOnChange write FOnChange;
  end;
  //
  // Erstellen und Speichern der Kundenliste
  //
  TAnsprechpartnerObjListe = class(TObjectList)
  private
    FOnChange : TAnsprechpartnerListeAddEvent;
    FModifyAction : TModifyActionList;
    FNewRecord : Boolean;
    procedure DeleteRecord(Klasse: TAnsprechpartnerListe);
  protected
    function getItem(Index: Integer): TAnsprechpartnerListe; virtual;
    procedure setItem(Index: Integer; Objekt: TAnsprechpartnerListe); virtual;
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    function Add(Objekt: TAnsprechpartnerListe): Integer; virtual;
    function NewRecord(Objekt: TAnsprechpartnerListe): Integer; virtual;
    function Remove(Objekt: TAnsprechpartnerListe): Integer; virtual;
    function IndexOf(Objekt: TAnsprechpartnerListe): Integer; virtual;
    procedure Insert(Index: Integer; Objekt: TAnsprechpartnerListe); virtual;
    property Items[index: Integer]: TAnsprechpartnerListe read getItem write setItem; default;
    property ModifyAction : TModifyActionList read FModifyAction write FModifyAction;
    property OnChange: TAnsprechpartnerListeAddEvent read FOnChange write FOnChange;
  end;
In dem Programm wo diese TObjectList eingesetzt wird, wir die ObjectList beim Erstellen des DataModuls miterstellt und die Procedure für das OnChange-Event übergeben.
Delphi-Quellcode:
  AnsprechpartnerListe := TAnsprechpartnerObjListe.Create(True);
  AnsprechpartnerListe.OnChange := AnsprechpartnerListeChange;
Wenn ich jetzt das Property ModifyAction mit dem Wert "lnChange" aufrufe, passiert garnicht. Keine Fehlermeldung oder Hinweis. In einem anderen Programm, welches ich unter 2007 geschrieben habe, funktioniert diese Variante sehr gut. Normal sollte das Setzen von lnChange auf die Eigenschaft ModifyAction die procedure getItem aufrufen,was aber unter Delphi 2010 nicht funktioniert.

Hat jemand eine Idee, wieso es nicht klappt ? Gibt es irgendwelche Unterschiede zwischen Delphi 2007 und Delphi 2010 bei der Benutzung der TObjectList ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 13:47
Ich habe mal versucht, deinen Ausschnitt nachzuvollziehen.

Irgendwo müsstest Du sicher prüfen, ob eine Ereignisbehandlung zugewiesen ist:
Delphi-Quellcode:
if Assigned(OnChange) then
  OnChange(...);
Wird dieser Aufruf erreicht? Ist dies möglicherwise abhängig von einer Zeichnung einer sichtbaren Komponente?
Ich denke, Du müsstest mal etwas mehr zeigen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 13:59
Also ich sehe da einige Fehler im Design:
1.) Die Klasse TAnsprechpartnerListe muss in Wirklichkeit TAnsprechpartner heissen, denn es handelt sich um keine "Liste"!!
Nur eine Namensänderung aber daraus folgen weitere Dinge
2.) Die Klasse TAnsprechpartner kann im Grunde genommen nur ein OnChange-Event besitzen, denn sie weiss nicht, ob sie irgendwo hinzugefügt oder gelöscht wurde.
Das Property ModifyAction gehört auch nicht in diese Klasse.
Delphi-Quellcode:
TAnsprechpartner = class
protected
  procedure DoChange;
....
public
  property OnChange:TNotifyEvent read FOnChange write FOnChange;
end;

// Events sollte man immer über eine Hilfsprocedure auslösen
procedure TAnsprechpartner.DoChange;
begin
  if Assigned(FOnChange) then
    FOnChange(self);
end;
3.) Die Klasse TAnsprechpartnerObjListe bekommt natürlich mit, wenn ein Objekt hinzugefügt oder gelöscht wird.
Aber sie kann nicht erkennen wenn ein Objekt der Klasse TAnsprechpartner verändert wird.
Es ist dann aber möglich dass TAnsprechpartnerObjListe beim Hinzufügen eine TAnsprechpartner-Objekts das OnChange-Event auf einen interen Eventhandler richtet und so über Änderungen informiert wird.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.636 Beiträge
 
Delphi 12 Athens
 
#4

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 14:20
Normal sollte das Setzen von lnChange auf die Eigenschaft ModifyAction die procedure getItem aufrufen,
Wieso? Das Property ModifyAction hat als Setter lediglich das entsprechende Feld FModifyAction angegeben. Ein Schreiben auf das Property kann damit eigentlich gar nichts auslösen (zumindest nicht direkt). Ich behaupte auch mal, daß das unter D2007 nicht anders ist.

Wobei ich mir hier nebenbei die Frage stelle, warum das Setzen des Properties ModifyAction überhaupt getItem aufrufen sollte...

Ansonsten kann ich mich nur stahli anschließen: Ich denke, Du müsstest mal etwas mehr zeigen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 14:24
Es soll vermutlich den Modus umstellen, ähnlich wie bei TTable.Insert ... TTable.Post.
Ich denke auch, dass die Bezeichnungen nicht ganz schlüssig bzw. erst mal (im ersten Moment) etwas irreführend sind.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 14:46
Hallo zusammen,

danke erstmal für Eure Antworten. Ich habe den Fehler gefunden. Diese zwei folgenden Zeilen haben in den Set-Proceduren von TAnsprechpartnerListe gefehlt :
Delphi-Quellcode:
  if (Assigned(FOnChange)) and (FModifyAction = lnChange) then
    FOnChange(Self, Self);
Damit funktioniert jetzt alles so wie es soll. Eine vollständige Set-Procedure von TAnsprechpartnerListe sieht dann jetzt so aus :
Delphi-Quellcode:
procedure TAnsprechpartnerListe.SetMobil(Value: string);
begin
  FMobil := Value;
  if (Assigned(FOnChange)) and (FModifyAction = lnChange) then
    FOnChange(Self, Self);
end;
Wenn ich jetzt im Programm auf eine Änderung in einem Eingabefeld reagieren sieht das ganze so aus :
Delphi-Quellcode:
    with TAnsprechpartnerListe(AnsprechpartnerListe.Items[AdvLV_CustomerContacts.Selected.Index]) do
    begin
      ModifyAction := lnChange;
      KundenNr := TKundenListe(KundenListe.Items[MainForm.AdvLV_OverviewList.Selected.Index]).KundenNr;
      Vorname := CustomerContact.AdvEdt_CustomerContactsVorname.Text;
      Nachname := CustomerContact.AdvEdt_CustomerContactsNachname.Text;
      Telefon1 := CustomerContact.AdvEdt_CustomerContactsTelefon1.Text;
      Telefon2 := CustomerContact.AdvEdt_CustomerContactsTelefon2.Text;
      Fax := CustomerContact.AdvEdt_CustomerContactsFax.Text;
      Mobil := CustomerContact.AdvEdt_CustomerContactsMobil.Text;
      EMail := CustomerContact.AdvEdt_CustomerContactsEMail.Text;
      ModifyAction := lnNone;
    end;
Damit werden dann alle Änderungen in die Datenbank geschrieben.

Edit: Rechtschreibfehler korrigiert.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 15:01
Mal zwei Nachfragem zum grundsätzlichen Konzept:

Du nutzt eine Datenbank? Warum keine DB-Komponenten?

Dann überträgst Du mehrere ...Edit.Text händisch in zugehörige Objekteigenschaften.
Hast Du Dir schon einmal data binding angesehen, ob das etwas für Dich wäre?
Je nachdem, wie weit Du mit Deinem Projekt bist, könnte Dir so etwas evtl. die weitere Arbeit erleichtern...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 17:25
Du nutzt eine Datenbank?
Ja,ich nutze eine Firebird-Datenbank.
Warum keine DB-Komponenten?
Ich nutze deshalb keine DB-Komponenten, weil ich zum einen mit den Dingern nie richtig zurechtgekommen bin und zweitens habe ich im Moment in meinem Projekt lediglich nur zwei Units, die ich anpacken müsste, wenn denn mal eine andere Datenbank-Komponente zum Einsatz kommen müsste. Zum Beispiel, ich will mein Programm auch noch für ein anderes DBMS zugänglich machen.

Dann überträgst Du mehrere ...Edit.Text händisch in zugehörige Objekteigenschaften.
Hast Du Dir schon einmal data binding angesehen, ob das etwas für Dich wäre?
Je nachdem, wie weit Du mit Deinem Projekt bist, könnte Dir so etwas evtl. die weitere Arbeit erleichtern...
Mein Projekt ist noch nicht soweit. Habe bis jetzt lediglich die Kundenverwaltung angefangen.
Rolf Warnecke
App4Mission

Geändert von RWarnecke (18. Jun 2011 um 17:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 19:31
Ich habe den Fehler gefunden.
Aber dein Klassendesign bleibt weiterhin fehlerhaft.
Es fängt schon an beim falschen Klassennamen.
(Niemand würde auf die Idee kommen die Klasse TFont als TFontList zu bezeichen;
genau darf doch ein Klasse, die Daten zu einem Ansprechpartner nicht TAnsprechpartnerList heisen)
Das Property ModifyAction gehört nicht zum einzelnen Ansprechpartner-Objekt;
aber das habe ich ja schon in Betrag #3 erklärt.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

AW: TObjectList reagiert nicht auf ModifyAction

  Alt 18. Jun 2011, 19:48
Ich habe den Fehler gefunden.
Aber dein Klassendesign bleibt weiterhin fehlerhaft.
Es fängt schon an beim falschen Klassennamen.
(Niemand würde auf die Idee kommen die Klasse TFont als TFontList zu bezeichen;
genau darf doch ein Klasse, die Daten zu einem Ansprechpartner nicht TAnsprechpartnerList heisen)
Namen sind doch wie Schall und Rauch. Da ich alleine Programmiere, reichen mir die Namen so wie Sie sind. Deshalb habe ich ja die zweite Klasse auch noch mit einem Obj versehen, damit weiß ich dann, welches meine Klasse ist und welche meine TObjectlist ist.

Das Property ModifyAction gehört nicht zum einzelnen Ansprechpartner-Objekt;
aber das habe ich ja schon in Betrag #3 erklärt.
Wenn ich aber die Property ModifyAction beim einzelnen Ansprechpartner-Objekt rausnehme funktioniert mein Aufruf wie in Beitrag #6 geschrieben nichtmehr.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:07 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