![]() |
AW: Code wird nicht ausgeführt - warum?
Zitat:
PS: wenn da steht "auf Daten können wegen der Optimierung nicht zugegriffen werden", dann ist die Variable entweder unwichtig und oder bereits wieder entfernt, aber auf jeden Fall wegoptimiert. |
AW: Code wird nicht ausgeführt - warum?
Zitat:
ich habe dein beispiel mit OnClick mal ausprobiert und es funktioniert. mein code macht nichts anderes aber es funktioniert nicht. ich glaube das liegt daran dass ich mich im OnMouseUp-Event befinde. aber wenn ich tatsächlich auf OnClick umsteige, wie komme ich an den klick auf die checkbox dran? --- ich habe das jetzt mal geändert: es wird nicht mehr geprüft ob ich auf eine checkbox klicke und und und. sobald ich das fenster mit der listview bestätige um den prozess danach zu starten rufe ich folgendes auf:
Delphi-Quellcode:
selbst bei einer sortierten liste nach klick auf eine column wird so genau der string aus der stringlist entfernt welcher in der listview nicht checked ist.
for i := 0 to WerteListe.Count - 1 do
begin for j := 0 to ListView1.Items.Count - 1 do begin if (not ListView1.Items[j].Checked) and ItemGefunden(ListView1.Items[j], i) then begin break; end; end; end; aber warum das nicht in OnMouseUp nicht funktioniert sondern nur mit showmessage ist mir ein großes rätsel. |
AW: Code wird nicht ausgeführt - warum?
Delphi-Quellcode:
EDIT:
procedure Test(Item: TListItem; i: Integer; Daten: TMeineDaten);
const Schwadawum: array[Boolean] of String = ('nicht gesetzt.', 'gesetzt'); begin //ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption])); //ShowMessage(Format('Daten aus Bagage: %s und %d', [Daten.Str, Daten.Int])); ShowMessage(Format('Die Checkbox ist %s', [Schwadawum[Item.Checked]])); end;
Delphi-Quellcode:
Warum gehst du alle Items durch. Du hast doch das eine Item, das du angeklickt hast, doch geschickt. Du mußt nur das abfragen.
for j := 0 to ListView1.Items.Count - 1 do
begin if (not ListView1.Items[j].Checked) and ItemGefunden(ListView1.Items[j], i) then |
AW: Code wird nicht ausgeführt - warum?
es tut mir leid dass ich kein beispiel posten wollte und das was ich gepostet habe schwachsinn zu sein scheint.
ich werde mich mal einlesen ob bei OnMouseUp irgendwelchen speziellen messages gepostet werden und ob da was geblockt hat. nur noch eine sache zur bagage: die daten liegen in einer externen stringlist da ich diese stringlist noch an anderer stelle sehr häufig brauche. |
AW: Code wird nicht ausgeführt - warum?
Doppelte Pflege ist niemals gut.
NACHTRAG: OnMouseUp ist für das was du vorhast nicht das optimale Ereignis, es gibt bessere. GetItemAt bietet zwar die Möglichkeit, aber dafür ist es nicht gedacht. Wenn dir ein OnDblClick nicht passt, es gibt noch OnClick. Wie gesagt, das ListItem auf das du geklickt hast kannst du auch über Selected ermitteln, statt mit GetItemAt. Das eine sagt welches ListItem aktuell ausgewählt ist (bei MultiSelected = False, sonst ist es das Erste), das andere über welchem ListItem sich gerade die Maus befindet. Guck dir mal die Ereignisse mal der Reihe mal durch. |
AW: Code wird nicht ausgeführt - warum?
Delphi-Quellcode:
diese for-schleife befindet sich in einem ButtonOnClick. ich frage ganz zum schluss ab welche items checked sind und welche nicht.
Warum gehst du alle Items durch. Du hast doch das eine Item, das du angeklickt hast, doch geschickt. Du mußt nur das abfragen.
zur bagage nochmal: kann es sein dass ich mir diese doppelte for-schleife zum finden eines items und dem passendem stringlist-eintrag mit dem bagage sparen kann da die daten direkt am item hängen? |
AW: Code wird nicht ausgeführt - warum?
ich melde mich noch ein letztes mal. die letzte stunde habe ich mir das mit dem bagage mal genauer angeguckt.
wenn ich vorher ein item angeklickt habe, habe ich mir das dazu passende item in der stringlist mit zwei verschachtelten for-schleifen gesucht. bei wenigen dateien kein problem. aber dann habe ich es mit 13.000 probiert. rein rechnerich beenden sich die schleifen nicht für 13.000 * 13.000 duchläufe. das war aber alles zu lange. ein durchlauf war noch nach 5 minuten nicht beendet. jetzt gebe ich jedem listitem bei der erstellung (Items.Add) daten bei .Data mit auf dem weg. suche ich nun den passenden eintrag in der stringlist sieht das so aus:
Delphi-Quellcode:
statt 13.000 * 13.000 durchläufen gibt es nun nur noch 13.000 und statt 5 minuten und mehr dauert das alles nur noch 400 millisekunden.
with ListView1 do
begin for i := 0 to Items.Count - 1 do begin if not Items[i].Checked then begin IndexInSL := TMeineDaten(Items[i].Data).MeinIndex; WertInSL := WerteListe.Strings[IndexInSL]; if WertInSL[1] = '_' then WerteListe.Strings[IndexInSL] := Copy(WertInSL, 2, Length(WertInSL)) else WerteListe.Strings[IndexInSL] := '_' + WertInSL; end; end; end; |
AW: Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)
Welche Delphi-Version hast du?
EDIT:
Delphi-Quellcode:
Was passiert eigentlich wenn der WertInSL leer ist? Kabum? Oder gibt es keine leeren Strings? Wie wäre es vorher zu prüfen ob die Länge größer 0 ist?
if WertInSL[1] = '_' then
|
AW: Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)
ich hatte vorher delphi 7 und 2005 personal, habe danach turbo delphi getestet und bin am ende doch bei delphi 2005 personal geblieben.
|
AW: Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)
Ich kenne mich mit 2005 nicht aus. Prüfe mal bitte ob TListView evtl. die Eigenschaft OwnsObjects hat und wenn ja, ob True oder False gesetzt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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