![]() |
Listenelemente bedingt löschen
Nabend zusammen,
ich bräuchte mal ein ppar Optimierungsanstöße. Und zwar: In meiner Anwendung befindet sich eine Liste mit Elementen. Mit Hilfe einer procedure sollen nun entweder alle oder alle selektierten Elementen gelöscht werden. Wird jedoch mit einem zu löschenden Element gerade gearbeitet (Thread im Hintergrund), soll es übersprungen werden, es sei denn, der Benutzer will es trotzdem löschen. Hier mal mein Ansatz.
Delphi-Quellcode:
Mir kommt die Umsetzung von der Logik her viel zu aufgebläht und unschön vor.
procedure DeleteItems(AOnlySelected: boolean);
var i: integer; bIsBusy: boolean; // true, wenn Item gerade in Benutzung bDeleteAllBusy: boolean; // true, wenn der Benutzer Item trotzdem löschen will bCanDelete: boolean; begin for i := Items.Count - 1 downto do begin bIsBusy := IsItemBusy(i){prüft, ob Item gerade vom Thread bearbeitet wird}; if bIsBusy then bDeleteAllBusy := UserWantsToDeleteAllBusyItems{kümmert sich um UserAbfrage}; if bIsBusy and (not bDeleteAllBusy) then Continue; // Item überspringen, da busy und Benutzer nicht löschen will bCanDelete := not (AOnlySelected and not Items[i].Selected); if bCanDelete then Delete(i); end; end; Habt ihr einen besseren Weg? Sehr sinnvoll wäre es zusätzlich noch, wenn die Benutzerabfrage nur einmal erscheinen würde, so nach dem Motto "Zu löschende Elemente sind in Benutzung. Trotzdem alle (selektierten) löschen? Ja/Nein/Abbrechen" Meine Birne qualmt allein schon von der Problembeschreibung... :freak: Dankerli, Björn |
Re: Listenelemente bedingt löschen
Hat sich Delphi eigentlich nicht wegen des bDeleteAllBusy beschwert,
welches bei (not bIsBusy) nicht initialisiert wird? erste Zusammenfassung:
Delphi-Quellcode:
zweite/weitere Zusammenfassung:
for i := Items.Count - 1 downto 0 do
begin if IsItemBusy(i) and not UserWantsToDeleteAllBusyItems then Continue; bCanDelete := not (AOnlySelected and not Items[i].Selected); if bCanDelete then Delete(i); end;
Delphi-Quellcode:
und mit der Userabfrage eventuell so :gruebel:
var
i: integer; begin for i := Items.Count - 1 downto 0 do if not (IsItemBusy(i) and not UserWantsToDeleteAllBusyItems) and not (AOnlySelected and not Items[i].Selected) then Delete(i); end;
Delphi-Quellcode:
var
i: integer; UWD, CalledUWD: boolean; function GetUWD; begin if not CalledUWD then begin UWD := UserWantsToDeleteAllBusyItems; CalledUWD := true; end; Result := UWD; end; begin UWD := false; CalledUWD := false; for i := Items.Count - 1 downto 0 do if not (IsItemBusy(i) and not GetUWD) and not (AOnlySelected and not Items[i].Selected) then Delete(i); end; jetzt bleibt noch eine Frage: hat sich der himi da irgendwo vertan? [edit] OK, ein Fehlerchen in GetUWD war schonmal drinnen :angel2: |
Re: Listenelemente bedingt löschen
Danke für Deine so flotte Antwort.
Zitat:
Es gibt (nur) noch zwei Ungereimtheiten bei deiner Version: 1) Die Userabfrage wird genau andersrum gewertet, d.h. klickt der User auf Ja (= trotzdem entfernen) wird aufgehört, bei Nein wird munter weitergelöscht. Edit: Beim Klick auf Absenden kam mir der Geistesblitz, UWD := MessageBox({Weiterlöschen Ja/Nein?}) = ID_NO; :thumb: 2) Wenn nur selektierte Einträge gelöscht werden sollen, wird trotzdem über das Löschen von nicht selektierten, jedoch in Arbeit befindlichen Einträgen gefragt. Ich werd mich selbst auch mal versuchen, muss aber deinen, übrigens sehr viel hübscheren Code, erstmal vollständig verdauen. :stupid: |
Re: Listenelemente bedingt löschen
Zitat:
und wegen der Ungereimtheiten: eigentlich/theoretisch sollte sich nichts verändert haben, gegenüber deinem ursprünglichen Code :gruebel: Ach ja, normaler Weise wird in Delphi nicht immer ALLES ausgewertet
Delphi-Quellcode:
ist hier z.B. a = true, dann steht das Ergebnis schon fest
if a or b then
und b wird nicht mehr verarbeitet ... also wenn b eine Funktion ist, dann würde sie nicht aufgerufen. gut, da war och ein Fehler, aber auf beiden Seiten hab was falsch zusammengesetzt und wenn ich das jetzt nochmal versuche,
Delphi-Quellcode:
bIsBusy := IsItemBusy(i);
if bIsBusy then bDeleteAllBusy := UserWantsToDeleteAllBusyItems; if bIsBusy and (not bDeleteAllBusy) then Continue; //bCanDelete := not (AOnlySelected and not Items[i].Selected); //if bCanDelete then // Delete(i);
Delphi-Quellcode:
bIsBusy := IsItemBusy(i);
DeleteAllBusy := bIsBusy and UserWantsToDeleteAllBusyItems; if bIsBusy and (not bDeleteAllBusy) then Continue;
Delphi-Quellcode:
bIsBusy := IsItemBusy(i);
if bIsBusy and (not (bIsBusy and UserWantsToDeleteAllBusyItems)) then Continue;
Delphi-Quellcode:
dann kommt auch ein Problem deiner Seits raus
bIsBusy := IsItemBusy(i);
if bIsBusy and not (bIsBusy and UserWantsToDeleteAllBusyItems) then Continue; bIsBusy and not bIsBusy kann ja wohl nicht gehn und würde immer FALSE ergeben [add]
Delphi-Quellcode:
mal sehn, ob ich's jetzt kappiert hab
procedure DeleteItems(AOnlySelected: boolean);
var i: integer; UWD, CalledUWD: boolean; function GetUWD; begin if not CalledUWD then begin UWD := UserWantsToDeleteAllBusyItems; CalledUWD := true; end; Result := UWD; end; begin for i := Items.Count - 1 downto 0 do begin if (not IsItemBusy(i) or UserWantsToDeleteAllBusyItems) and (not AOnlySelected or Items[i].Selected) then Delete(i); end; end; - nur löschen wenn nicht IsItemBusy oder der User will es doch - und nur löschen wenn selektiert bzw. AOnlySelected=nein |
Re: Listenelemente bedingt löschen
Ja Du hast recht, jetzt wo ich das so aufgebröselt sehe, fällt mir das auch auf...
Danke für deinen letzten Vorschlag. Ein Fehlverhalten hat er noch, und zwar wenn ein Item selektiert ist, das gerade nicht bearbeitet wird, dazu ein nicht selektiertes Item, was bearbeitet wird. Nun ein DeleteItems(true) und es kommt trotzdem eine Abfrage. Problem lässt sich allerdings leicht beheben, nämlich einfach die beiden if Bedingungen vertauschen:
Delphi-Quellcode:
Jetzt läufts genau so wie ich mir das vorgestellt habe.
for i := Items.Count - 1 downto 0 do
if (not AOnlySelected or Items[i].Selected) and (not IsItemBusy(i) or GetUWD) then Delete(i); Vielen Dank himi! :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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 by Thomas Breitkreuz