![]() |
listview on change problem
hi leute,
ich hab ein dickes problem und zwar hab ich folgendes vor...hier mal zuerst mein beispiel quellocode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eintrag: tlistitem; begin eintrag:= listview1.Items.Add; eintrag.Caption := 'ok'; eintrag.SubItems.Add('geht'); end;
Delphi-Quellcode:
so nun wenn ich auf den button klicke bekomme ich sofort eine fehlermeldung das der listindex überschritten ist...zuerst hab ich mich gefragt wie das zustande kommt aber inzwischen hab ich das problem gefunden, und zwar sobald der den eintrag 'ok' einfügt beginnt der sofort mit dem onchange ereigniss, und weil ja beim subitem [0] noch kein eintrag vorhanden ist gibt der mir ein error aus :(
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange); begin label1.Caption := listview1.Items.Item[0].SubItems.strings[0]; end; so nun zu meiner frage...gibts irgendwie ein befehl das der den onchange erst ausführt sobald die erste zeile vollständig ausgefüllt ist?? hab auch schon mit dieser variante probiert jedoch logischerweise der selbe fehler :(
Delphi-Quellcode:
kann mir evtl. jemand helfen??
if listview1.Items.Item[0].SubItems.strings[0] <> '' then
begin //quelltext end; mfg wadim |
Re: listview on change problem
Moin Wadim,
statt den Inhalt des SubItems[0] zu prüfen, solltest Du prüfen, ob SubItems.Count > 0 ist. |
Re: listview on change problem
Noch ein Tipp:
Probiere mal ListView.Items.BeginUpdate; ... ListView.Items.EndUpdate; Das sollte dein Problem lösen! Gruß |
Re: listview on change problem
danke für eure hilfe aber irgendwie hat es nicht so geklappt wie ich es wollte, zwar hat er kein error mehr rausgegen aber der hat danach den eintrag nicht bearbeitet...erst wenn ein zweiter eintrag hinzugekommen ist...naja egal, ich hab das problem anders gelöst, und zwar hab ich zuerst die subitems hinzugefügt und am ende caption...jetzt geht es wunderbar
hier nochmal der veränderte quelltext:
Delphi-Quellcode:
danke nochmal
procedure TForm1.Button1Click(Sender: TObject);
var eintrag: tlistitem; begin eintrag:= listview1.Items.Add; eintrag.SubItems.Add('geht'); eintrag.Caption := 'ok'; end; mfg wadim |
Re: listview on change problem
Also eigentlich klappt das mit BeginUpdate und EndUpdate immer ziemlich gut: du musst zwischen diesen beiden Methodenaufrufen alles machen. Wenn du anschließend EndUpdate aufgerufen hast, musst du "von Hand" noch das OnChange-Ereignis anstoßen.
Begin/EndUpdate sorgen auf jeden Fall dafür, dass nicht ständig "störende" OnChange-Ereignisse aufgerufen werden und dass nicht die ganze Zeit die Komponente neu gezeichnet wird - denn das kostet Zeit und flackert. |
Re: listview on change problem
Zitat:
mfg wadim |
Re: listview on change problem
So, habe das selber jetzt mal getestet (Test in D5) und herausbekommen, dass das, was ich vorgeschlagen habe hier wohl doch nicht funktioniert. Den Fehler will ich wieder gutmachen, also ein kleiner Workaround ;-)
Delphi-Quellcode:
Viele Grüße
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) ListView1: TListView; Button1: TButton; Label1: TLabel; procedure ListView1Change(Sender: TObject; Item: TListItem; Change: TItemChange); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } ListViewInUpdate : Boolean; procedure UpdateLabel; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem; Change: TItemChange); begin if not ListViewInUpdate then UpdateLabel; end; procedure TForm1.UpdateLabel; begin if (ListView1.Items.Count > 0) AND (ListView1.Items.Item[0].SubItems.Count > 0) then Label1.Caption := ListView1.Items.Item[0].SubItems.strings[0]; end; procedure TForm1.Button1Click(Sender: TObject); var Eintrag : TListItem; begin ListViewInUpdate := true; Eintrag := ListView1.Items.Add; Eintrag.Caption := 'ok'; Eintrag.SubItems.Add('geht'); ListViewInUpdate := false; UpdateLabel; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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