Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi listview on change problem (https://www.delphipraxis.net/62936-listview-change-problem.html)

Wadim 11. Feb 2006 18:00


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:
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
label1.Caption := listview1.Items.Item[0].SubItems.strings[0];
end;
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 :(

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:
if listview1.Items.Item[0].SubItems.strings[0] <> '' then
  begin
   //quelltext
  end;
kann mir evtl. jemand helfen??

mfg wadim

Christian Seehase 11. Feb 2006 18:08

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.

sir-archimedes 11. Feb 2006 18:44

Re: listview on change problem
 
Noch ein Tipp:

Probiere mal

ListView.Items.BeginUpdate;
...
ListView.Items.EndUpdate;

Das sollte dein Problem lösen!

Gruß

Wadim 11. Feb 2006 19:47

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:
procedure TForm1.Button1Click(Sender: TObject);
var eintrag: tlistitem;
begin
eintrag:= listview1.Items.Add;
eintrag.SubItems.Add('geht');
eintrag.Caption := 'ok';
end;
danke nochmal

mfg wadim

sir-archimedes 11. Feb 2006 20:25

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.

Wadim 11. Feb 2006 20:51

Re: listview on change problem
 
Zitat:

Zitat von dominik.boehm
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.

kannst du es evtl. bisschen genauer beschreiben mit einem beispiel...versteh das irgendwie nicht ganz...bin hier am probieren mit deiner metohde aber irgendwie immer wieder der selbe fehler :/

mfg wadim

sir-archimedes 11. Feb 2006 21:59

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:
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.
Viele Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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