![]() |
Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)
hallo. ich habe momentan ein ganz seltsames problem. so etwas habe ich noch nie erlebt.
ich habe eine form mit einer listview. die items sind mit checkboxen versehen. parallel gibt es eine stringlist in welcher die selben "werte" zu finden sind. in einem ListView1MouseUp() ist nun folgende schleife enthalten:
Delphi-Quellcode:
der funktion ItemGefunden wird "i" übergeben und in der funnktion gibt es dann soetwas wie
Item := ListView1.GetItemAt(X, Y);
// ... for i := 0 to WerteListe.Count - 1 do begin if ItemGefunden(Item, i) then begin break; end; end;
Delphi-Quellcode:
in der weteren ausfhrung wird einfach nur geguckt ob dieser wert "Zeile" ein "_" als erstes zeichen hat oder nicht.
{* ... *}Zeile := WerteListe.Strings[i];
wenn ja, wird es entfernt anderenfalls wird es hinzugefügt:
Delphi-Quellcode:
und genau da ist das seltsame problem:
if WerteListe.Strings[i][1] = '_' then
WerteListe.Strings[i] := Copy(WerteListe.Strings[i], 2, Length(WerteListe.Strings[i])) else WerteListe.Strings[i] := '_' + WerteListe.Strings[i]; wenn ich alles so belasse wird der code niemals ausgeführt bzw. die liste WerteListe wird niemals geupdatet. wenn ich aber vor dem if ein
Delphi-Quellcode:
setze wird die if-bedingung abgerabritet und die liste WerteListe ändert sich.
showmessage();
aber ohne showmessage() funktioniert es nicht, warum? ich kann showmessage() auch in
Delphi-Quellcode:
unter die for-schleife packen, dann funktioniert es auch.
ListView1MouseUp()
aber ohne showmessage() ändert sich nichts. ich habe schon daran gedacht dass das vielleicht etwas mit dem abarbeten der messages zu tun haben könnte, aber da kenne ich mich nicht aus. |
AW: Code wird nicht ausgeführt - warum?
Ich glaube ein Minimalbeispiel dass man bei sich ausführen kann würde die Sache viel einfacher machen.
Spontan hätte ich gesagt dass der Code (natürlich) sehr wohl ausgeführt wird, nur nie grafisch auf der Form dargestellt wird da du an irgendwelchen Strings bastelst ohne dass der Listview etwas davon mitbekommt. Wenn jetzt einmal eine Messagebox drübergelegt wird muss sich der Listview neu zeichnen und tut das dann (mit den aktuellen Strings). |
AW: Code wird nicht ausgeführt - warum?
ein beispiel kann ich leider nicht anhängen da mein code an vielen ecken und enden mit vielen weiteren dingen verknüpft ist.
es ist lediglich eine stringlist mit ein paar werten und dieselben werte sind in der listview grafisch dargestellt. checke ich jetzt listview-1 dann sollte in der stringlist eigentlich item-1 ein "_" vorangestellt bekommen. mehr passiert hier nicht. aber warum so etwas einfaches nicht funktioniert weiß ich nicht. das schlimme ist dass es bis gestern noch funktioniert hat und jetzt ohne änderungen an der logik funktioniert es nicht mehr. grob kann man sagen dass die stringlist nicht angerührt wird wenn kein showmessage auftaucht. |
AW: Code wird nicht ausgeführt - warum?
Was verstehst du unter "nicht ausgeführt" (sorry für den Fall, dass du es geschrieben hast und ich es übersehen habe)?
//Edit Wie passt
Delphi-Quellcode:
in die Funktion? Was macht es da? Item ist vom Typ TListItem. So wie ich das sehen, bewegst du die Maus über ListView und je nachdem von wo du es ausführst, führt es bei jeder Masusbewegung pro Pixel deine Funktion aus? Ist das korrekt?
if ItemGefunden(Item, i) then begin
In dem Codeteil aus der Funktion taucht Item nicht auf. |
AW: Code wird nicht ausgeführt - warum?
Zitat:
Ich weiß nicht, ob ich da auf einem zu hohen Ross sitze. Aber ich finde, man sollte sich die drei Minuten Mühe machen, ein Minimalbeispiel für die Leute, die das Problem finden sollen, zu erstellen. |
AW: Code wird nicht ausgeführt - warum?
Zitat:
Delphi-Quellcode:
) auftaucht?
''
Wieso baut eigentlich "WertGefunden" den Wert um, wo es doch angeblich nur sucht? Entweder es gibt noch sowas wie "WertUmschalten", welched danach den Wert ändert, oder man gibt der "Gefunden"-Funktion einen entsprechenden Namen. Manchmal fragt man sich, warum keiner auf die blöde Idee kommt den Debugger auszuprobieren. Und eventuell auch mal die Index- und Bereichsprüfung in den Projektoptionen zu aktivieren. |
AW: Code wird nicht ausgeführt - warum?
Ich rate mal und sage: Ohne ShowMessage wird die ListView einfach nicht neu gezeichnet.... veranlasse doch nach der Änderung ein Neuzeichnen!
|
AW: Code wird nicht ausgeführt - warum?
Zitat:
Und Standardmäßig sollte sich die Anzeige von selbst aktualisieren. Aber Zitat:
|
AW: Code wird nicht ausgeführt - warum?
Zitat:
Zitat:
Zitat:
Zitat:
wie kann ich denn mit dem debuggen genau an dieser stelle anfangen? |
AW: Code wird nicht ausgeführt - warum?
Wo wir dabei sind, warum über
Delphi-Quellcode:
und
ListView1MouseUp()
Delphi-Quellcode:
?
ListView1.GetItemAt(X, Y)
Da gibt es doch bessere Möglichkeiten, z. B. OnClick oder OnDblClick:
Delphi-Quellcode:
Und um das zu steigern, warum Werte in einer Parallel-StringList? Warum nicht als Bagage an ListView?
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer; NewColumn: TListColumn; ListItem: TListItem; begin with ListView1 do begin ViewStyle := vsReport; NewColumn := Columns.Add; NewColumn.Caption := 'Caption'; NewColumn.Width := 150; for i := 1 to 10 do begin ListItem := Items.Add; ListItem.Caption := 'Caption #' + IntToStr(i); end; end; end; procedure Test(Item: TListItem; i: Integer); begin ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption])); end; procedure TForm1.ListView1DblClick(Sender: TObject); begin if not (Sender is TListView) then Exit; with TListView(Sender) do Test(Selected, 4711); end;
Delphi-Quellcode:
type
TMeineDaten = class Str: String; Int: Integer; end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; NewColumn: TListColumn; ListItem: TListItem; MeineDaten: TMeineDaten; begin with ListView1 do begin ViewStyle := vsReport; NewColumn := Columns.Add; NewColumn.Caption := 'Caption'; NewColumn.Width := 150; for i := 1 to 10 do begin MeineDaten := TMeineDaten.Create; MeineDaten.Str := '_Abc'; MeineDaten.Int := 123; ListItem := Items.Add; ListItem.Caption := 'Caption #' + IntToStr(i); ListItem.Data := MeineDaten; end; end; end; procedure Test(Item: TListItem; i: Integer; Daten: TMeineDaten); begin ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption])); ShowMessage(Format('Daten aus Bagage: %s und %d', [Daten.Str, Daten.Int])); end; procedure TForm1.ListView1DblClick(Sender: TObject); begin if not (Sender is TListView) then Exit; with TListView(Sender) do begin Test(Selected, 4711, TMeineDaten(Selected.Data)); end; end; //WICHTIG: bei löschen, der Items muss das Objekt vorher freigegeben werden!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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