AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListBox - "OnChange" gesucht

Ein Thema von NicoleWagner · begonnen am 16. Jun 2020 · letzter Beitrag vom 17. Jun 2020
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#1

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 07:51
Welches Event ist das meine, wenn ich die Aufschrift wieder zurückändert auf "Listbox sichern", sobald es wieder etwas zu sichern gibt?
"onChange" scheint es nicht zu geben.
Sichere nicht die Listbox. Die Listbox ist eine Visuelle Komponente zur Gestaltung der GUI. Und genau dafür sollte man sie auch nehmen.
Ist ist zwar möglich, aber nicht sinnvoll, diese auch zur Datenhaltung zu nehmen.

Besser ist es, die eigentliche Datenhaltung zum Beispiel in eine eigene Klasse auszulagern, und in einer Routine lediglich die Listbox mit Items zur Anzeige zu füllen.
Du kannst dann in deiner Klasse eigene Events erzeugen, die dann wieder die Routine zum Füllen der ListBox anstoßen, aber auch z.B. einen Button enabled.

Delphi-Quellcode:
Type
  // Erstmal die Datendefinition als Klasse
  TBeispiel=class
  private
    FName: string;
    FFarbe: TColor;
    FAge: Integer;
    proceudre SetName(value: string);
    procedure SetFarbe(value: TColor);
    procedure SetAge(value: Integer);
  published
    property Name: string read FName write SetName;
    property Farbe: TColor read FFarbe write SetFarbe;
    property Age: Integer read FAge write SetAge;
  end;

  // Und eine generische Liste, zur eigentlichen Datenhaltung.
  // TBeispiel und TBeispielList können je nach Umfang natürlich in eine eigene Unit
  TBeispielList=class(TObjectList<TBeispiel>)
  private
    FOnChange: TNotifyEvent;
  public
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    procedure AddData(sName: string; cFarbe: TColor; iAge: Integer);
  end;

  //Hier eine Miniform
  TForm1=class(TForm)
    ListBox: TListBox;
    ButtonSpeichern: TButton;
    ButtonAdd: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ButtonAddClick(Sender: TObject);
  private
    BeispielList: TBeispielList;
  public
    procedure DataToGUID(Sender: TObject);
  end;

implementation

//Eine Beispielmethode um Daten in die Liste zu bekommen.
procedure TBeispielList.AddData(sName: string; cFarbe: TColor; iAge: Integer);
var
  b: TBeispiel;
begin
  b:=TBeispiel.create;
  b.Name:=sName;
  b.Farbe:=cFarbe;
  b.Age:=iAge;
  self.Add(b);
  if Assigned(FOnChange) then
    FOnChange(self);
end;

//Alles anderen verbleibt in der Form
procedure TForm1.FormCreate(Sender: TObject);
begin
  BeispielList:=TBeispielList.Create;
  BeispielList.OnChange:=DataToGUI;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BeispielList.free;
end;

proceudre TForm1.DataToGUI(Sender: TObject);
var
  i: Integer;
begin
  ListBox1.clear;
  for i:=0 to BeispielList.count-1 do
    ListBox1.Items.Add(BeipielList[i].Name);
  ButtonSpeichern.Enable:=True;
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
begin
  BeispielList.AddData('Das ist ein Name', clRed, 30);
end;
Über den ButtonAdd wird der BeispielList ein Objekt mit den notwendigen Daten hinzugefügt. Die Datenhaltung übernimmt die Klasse TBeispielList.
Beim hinzufügen wird das Event OnChange ausgelößt, welches die Aktualisierung der GUI anstößt.
Jetzt kannst du beliebige Methoden der Klasse hinzufügen und immer wenn es notwendig ist, das OnChange auslösen.
Alles weitere geschieht dann automatisch.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (17. Jun 2020 um 07:54 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#2

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 09:48
@Hobbycoder: Danke für den Code!
Der ist aber fein!
Im Grunde hätte ich den am Anfang gebraucht. Denn was Du so elegant in eine Hülle packst, löste ich im Laufe der sich ergebenden Bedürfnisse mit StringLists, Methodenklassen uam.
Werde das Ding einmal in meine Code-Schnipsel-Bibliothek legen.

Sollte hier jemand eines Tages nach Listboxen suchen, dann hoffe ich, dass es dieses Link noch gibt, das mir viel half:
http://www.tech-ecke.de/index_querei...i/tlistbox.htm
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#3

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 10:25
@Hobbycoder: Danke für den Code!
Der ist aber fein!
Im Grunde hätte ich den am Anfang gebraucht. Denn was Du so elegant in eine Hülle packst, löste ich im Laufe der sich ergebenden Bedürfnisse mit StringLists, Methodenklassen uam.
Werde das Ding einmal in meine Code-Schnipsel-Bibliothek legen.

Sollte hier jemand eines Tages nach Listboxen suchen, dann hoffe ich, dass es dieses Link noch gibt, das mir viel half:
http://www.tech-ecke.de/index_querei...i/tlistbox.htm
Immer wieder gerne. Freut mich dir geholfen zu haben. Ist nichts außergewöhnliches.
Ob das nun in die Code-Schnipsel-Bibliothek muss....kann ich nicht beurteilen.
Ich wollte dir damit eines verdeutlichen: Trenne immer GUI von den Daten. Sicherlich kommt man, aus Bequemlichkeit, ab und an in die Versuchung eine sehr kleine Datenstruktur mal in der GUI zu halten. Aber leider rächt sich sowas oftmal irgendwann, wenn das Programm und die Datenstrukturen wachsen.
Weiterhin ist die Wiederverwendbarkeit der Algorithmen an anderen Programmstellen ein wichtiger Aspekt. Aber auch das Debugging gestaltet sich durchweg einfacher, weil man ganz klare Bereiche hat wo man Fehler such muss.
Die Trennung hat zusätzlich den großen Vorteil, dass man auch die direkte Datenmanipulation mittels Private, Public, etc. sehr schön einschränken oder freigeben kann. Heißt, du kannst z.B. durch die Setter bereits vor dem Schreiben eine Variable die Daten auf Plausibilität prüfen und somit auch bestimmte Fehler von vorne herein ausschließen.

Eine Erweiterung der Datenstruktur ist ebenfalls einfacher. Einfach eine neue Property hinzufügen z.B. property speed: Integer; dann [STRG]+[Shift]+C und private Variable und Setter werden automatisch erstellt.

Und, was vielleicht für dich noch interessant ist: Du kannst mittels der Events auch gleich Daten an deine GUI mit übergeben.
Beispiel:
Delphi-Quellcode:
Type
  TDataAdd=procdure(Sender: TObject; NewName: string; NewFarbe: TColor; NewAge: Integer) of object;

  TData=class
  private
    FOnDataAdd: TDataAdd;
    procedure DoDataAdd(NewName: string; NewFarbe: TColor; NewAge: integer);
  published
    property OnDataAdd: TDataAdd read FOnDataAdd write FOnDataAdd;
  end;

implementation

TData.DoDataAdd(NewName: string; NewFarbe: TColor; NewAge: integer);
begin
  if Assigned(FOnDataAdd) then
    FOnDataAdd(self, NewName, NewFarbe, NewAge);
end;

TData.IrgendeineMethode;
begin
  //diese Methode wird von irgendwoher aufgerufen
  //und gibt über des Event seine Daten mit
  DoDataAdd(self.FName, self.FFarbe, self.FAge);
end;
Solche Event kannst du nach Belieben definieren und nutzen. Ich hoffe das hilft dir das ganze noch etwas zu "verfeinern".
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  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 06:23 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