Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listview.OnMouseMove löst AV aus, ich weiß nicht warum (https://www.delphipraxis.net/153871-listview-onmousemove-loest-av-aus-ich-weiss-nicht-warum.html)

juergen 18. Aug 2010 14:15

Delphi-Version: 2007

Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
Hallo zusammen,
bin nun schon einige Zeit zugange und finde das Problem einfach nicht.
Andere Fehler konnte ich beseitigen mit Assigned.
Ziel ist es, wenn die Maus den Itemindex wechselt innerhalb der 1. Spalte(!), soll eine andere Form geschlossen werden.
Sowie ich aber mit der Maus aus der ersten Spalte (caption!) in den Bereich einer anderen Spalte (SubItem[x]) komme, gibt es eine Zugriffsverletzung.
Im Moment verwende ich folgendes:
Delphi-Quellcode:
procedure TMain_Form.ListView1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  Item: TListItem;
begin
  Item := ListView1.GetItemAt(0, Y);
  if Assigned(item) then begin
    if ((ListView1.GetItemAt(X, Y).Index) <> (ListView1.ItemIndex)) then begin
      with Sender as TListView do begin
        if Assigned(Fotovorschau_am_Mauszeiger_Form) then begin
          Preview_Form.Close;
        end;
      end;
    end;
  end;
end;
Ich erkenne anscheinend das Problem nicht und weiß somit auch nicht wie ich reagieren muss.

Kann jemand das Problem erkennen?

Vielen Dank schon mal vorab!

DeddyH 18. Aug 2010 14:28

AW: Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
Wie ist es so?
Delphi-Quellcode:
procedure TMain_Form.ListView1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  Item: TListItem;
begin
  Item := ListView1.GetItemAt(0, Y);
  if Assigned(item) then begin
    Item := ListView1.GetItemAt(X, Y);
    if Assigned(Item) and (Item.Index <> ListView1.ItemIndex) then begin
      with Sender as TListView do begin
        if Assigned(Fotovorschau_am_Mauszeiger_Form) then begin
          Preview_Form.Close;
        end;
      end;
    end;
  end;
end;

juergen 18. Aug 2010 14:40

AW: Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
Hallo Detlef,
super, das funktioniert. Vielen Dank!:thumb:

Ich setze mich seit den letzten Tage mit der Listview auseinander und wir "sind noch keine Freunde".
Aber je mehr man sich damit beschäftigt, desto mehr erkennt man auch die Strukturen und wie es zusammenhängt.

Einen schönen Tag noch!


Ps.:
Deinen Lösungsvorschlag finde ich übrigens ziemlich interessant, wäre da nie drauf gekommen.

DeddyH 18. Aug 2010 14:47

AW: Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
GetItemAt kann auch nil zurückgeben, deshalb muss man immer daraufhin prüfen, bevor man mit dem Item weiterarbeitet. Du hast das nur im 2. Aufruf vergessen ;)

juergen 18. Aug 2010 15:05

AW: Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
genau, aus der Hilfe hatte ich mir das so auch erlesen.
Nur dachte ich dass diesbezüglich damit ALLES erledigt wäre.

Zitat:

Zitat von DeddyH (Beitrag 1043102)
...Du hast das nur im 2. Aufruf vergessen ;)

Dein Zwinker sagt es schon:
Natürlich hatte ich es nur "vergessen".... :mrgreen:

:dp:

himitsu 18. Aug 2010 15:07

AW: Listview.OnMouseMove löst AV aus, ich weiß nicht warum
 
'ne Meldung ala "Zugriffsverletzung bei Adresse $000000xx" weist eigentlich fast immer auf irgendeine Art von NIL-Pointer hin.
(Ja, den genauen Fehlertext hat man uns wieder mal verschwiegen, aber was soll's manchmal funktioniert unsere Glaskugel :glaskugel: doch mal)

Da hatte man sich also mal fragen können wo ein NIL auftreten könnte.

Außerdem wäre es keine schlechte Idee gewesen sich mal anzusehn in welcher Zeile der Fehler auftritt (notfalls über das, welches man Debuggen nennt).

In der entsprechenden Zeile gab es nun nur noch 2 Stellen, welche nil sein könnten, wobei man eine davon (das ListView1) schonmal ausschließen konnte. :zwinker:



OK, nun noch was Anderes.
Warum verwendest du einmal Sender und ansonsten ListView1


PS:
Delphi-Quellcode:
if Assigned(Fotovorschau_am_Mauszeiger_Form) then
.
Dieses sollte man besser als Erstes abfragen, da dann alle anderen Abfragen eingespart werden könnten, falls dieses False ist.

PSS:
Ist die Abfrage von
Delphi-Quellcode:
ListView1.GetItemAt(0, Y);
überhaupt notwendig?


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