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
Seite 1 von 2  1 2      
NicoleWagner

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

ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 16:28
Delphi-Version: 5
Hallo Leute,

gegeben ist eine TListbox. Mit Icons und anderem werden Zeilen hinein- und hinausgeschoben und vertauscht. Ein Button bietet mir an: "Listbox sichern". Jetzt möchte ich gerne, dass die Aufschrift sich verändert in "gesichert", sobald gesichert ist. So weit so fein. Ich erspare mir, das lästige ShowMessage wegzuklicken, das mir den Sicherungserfolg kündet.

Doch: 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.


Danke für Tips!

Nicole
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 16:36
Hast du eine zentrale Methode, die dir die Listbox neu bestückt oder sie modifiziert? Wenn ja, würde ich dort anfangen zu suchen.
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 16:38
Danke für die Idee. Das wäre ein dorniger Weg, weil es viele Methoden sind. Trotzdem ein gangbarer, wenn es keinen anderne Weg gäbe. Ich müsste in jede einzelne Methode diese Zeile einfügen.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 16:51
Setzt du zufällig auch TActionList ein?
Ralph
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 17:36
Danke für die Idee. Das wäre ein dorniger Weg, weil es viele Methoden sind. Trotzdem ein gangbarer, wenn es keinen anderne Weg gäbe. Ich müsste in jede einzelne Methode diese Zeile einfügen.
Eigentlich sollte es für das Befüllen der ListBox nur eine zentrale Methode geben die von allen anderen Methoden aufgerufen wird. Demzufolge müsstest du dann nur an einer Stelle das Label oder den Button oder was auch immer aktualisieren.

Ohne deinen genauen Code jetzt zu kennen ist es natürlich schwierig Tipps zu geben. Aber für mich hört sich das ein bisschen danach an, als ob ein Refactoring nicht schaden könnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 18:21
Die ListBox selber bietet keine direkten Notification hierfür, drum hat die TListBox auch kein Event.
https://docs.microsoft.com/en-us/win...-notifications

Wenn/da die ListBox ausschließlich vom eigenen Programm (Delphi) geändert wird, könntest du dich in ListBox.Items reinhängen, was ein TStrings-Nachfahre ist (quasi eine TStringList).
Bei einer ComboBox ist diese Instanz schön gekapselt und lässt sich über eine überschreibbare GetItemsClass leicht austauschen,
aber bei der ListBox ist das leider echt bescheiden implementiert und es wird nicht leicht den Constructor und darin das TListBoxStrings.Create zu ersetzen, um dort die Methoden Insert und Delete zu überschreiben und das neue Event auszulösen.


Bliebe also noch auf Messages zu lauschen.
CB_ADDSTRING und WM_DELETEITEM, wobei Bearbeiten/Ändern über Delete+Insert behandelt wird, also nur Add und Delete zu beachten sind.

Da diese Messages aber über SendMessage laufen, hilft TApplicationEvents.OnMessage nicht, da dort nur PostMessage ankommt und auch nur, wenn es über die MainLoop der VCL eintrudelt. (ist grade eine andere Message-Behandlung aktiv, wie z.B. im MSDN-Library durchsuchenMessageBox, dann geht OnMessage garnicht)
Somit läuft es hier wohl eher auf einen MessageHook hinaus.


Oder eben sich das Event selbst zu implementieren, bei seiner (einen) eigenen ListBox-Befüll-Prozedur.
$2B or not $2B

Geändert von himitsu (16. Jun 2020 um 19:00 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: ListBox - "OnChange" gesucht

  Alt 16. Jun 2020, 21:02
@himitsu: Danke für die Idee und auch die Links, die mich wieder etwas gelehrt haben, wie dieses Ding mit den bunten Bildern (PC) funktioniert.

Danke auch allen anderen für die Antworten.
Nein, es gibt keine Action List.

Sondern da ist ua. eine Edit-Zeile, die es mir erlaubt, Zeilen "reinzuholen" und "auszutauschen" und "löschen".... Das alles mit Icons. Als ich genau hinsah, waren es nur drei Click-Events die die Box auch veränderten. Was hin- und herkopiert wird, verändert den Listbox-Inhalt nicht.
In die drei Methoden habe ich jetzt die Zeile für die neue Caption hineingeschrieben. Ist ganz nett geworden. Ich sehe sofort, ob ich ungesicherte Inhalte habe oder nicht.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 08:20
Lagere doch wie von mir vorgeschlagen die Procedure zum Hinzufügen der Items in eine neue Procedure aus. In dieser Procedure setzt du das Label.
In den Klick Events löschst du den Code der mit der neuen Procedure identisch ist und rufst diese stattdessen auf. Zukünftig brauchst du dann immer nur noch an einer Stelle etwas zu ändern.
Die Procedure braucht dann am Parameter eine Ziel-ListBox und den Text der zur Anzeige benutzt werden soll.

Erweiterungsmöglichkeit (wird noch nicht benötigt):
Später kannst du diese Procedure dann ganz leicht überladen damit du an das ListBox Item auch noch ein Objekt mit anhängen kannst.

Stichwort: DRY (Don't Repeat Yourself)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#9

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 08: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 08:54 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: ListBox - "OnChange" gesucht

  Alt 17. Jun 2020, 10: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
Antwort Antwort
Seite 1 von 2  1 2      


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 01:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz