Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi listview selected schleife? (https://www.delphipraxis.net/51129-listview-selected-schleife.html)

jolomino 6. Aug 2005 15:43


listview selected schleife?
 
hi,
hab mal wieder ein problem. wahrscheinlich ist es überhaupt keines, sonder ich glotze nur schon zu langre drauf :-)

also, ich habe ein listview gefüllt mit daten. wenn ich nun mit einer zeile etwas machen möchte, benutze ich folgenden befehl

Delphi-Quellcode:
if (ListView.Selected <> nil) then
  begin
//blablabla
nun möchte ich aber per multiselect, das alle markierten einträge bearbeitet werden, sprich er soll oben anfangen und nach unten hin alle selektierten bearbeiten. da ich aber listviewselected benutze, funzt es nicht. ich dachte ich würde mit folgendem code klar kommen, aber dem ist nicht so :-(

Delphi-Quellcode:
for i := 0 to ListView.SelCount -1 do // Alle Einträge durchlaufen
    begin
   if (ListView.Selected <> nil) then
  begin
  //mach was
problem ist, nach einer weile wird der erste markierte eintrag bearbeitet, danach ist aber schluss. kann mir einer mal meine denkblokade nehmen :-)

gruss jolomino

ps: upss, habe mich im forum versehen, kann es mal jemand verschieben?

Matze 6. Aug 2005 15:46

Re: listview selected schleife?
 
Ich habe es njetzt nicht gestestet, ob es geht, aber wenn, dann würde ich es so aufrufen:

Delphi-Quellcode:
if ListView1.Items[i].Selected then

jolomino 6. Aug 2005 16:04

Re: listview selected schleife?
 
Zitat:

Zitat von Matze
Ich habe es njetzt nicht gestestet, ob es geht, aber wenn, dann würde ich es so aufrufen:

Delphi-Quellcode:
if ListView1.Items[i].Selected then

erstmal thx für den denkanstoss, aber leider ist das resultat das gleiche. ich könnt aus dem fenster springen :-(
so funktioniert nicht einmal ein einzelner markierter eintrag

gruss jolomino

marabu 6. Aug 2005 16:23

Re: listview selected schleife?
 
Hallo jolomino,

der Hinweis von Matthias war schon in Ordnung, aber es gibt mehrere Vorgehensweisen um alle markierten Items einer ListView zu bearbeiten:

Delphi-Quellcode:
with ListView do
  while Assigned(Selected) do begin
    ProcessItem(Selected); // das ist deine Routine
    Selected.Selected := false; // muss sein bei dieser Vorgehensweise
  end;

with ListView do
  for i := Items.Count - 1 downto 0 do
    if Items[i].Selected then begin
      ProcessItem(Items[i]);
      Selected.Selected := false; // nur wenn du die Markierung aufheben willst
    end;
Grüße vom marabu

jolomino 6. Aug 2005 16:44

Re: listview selected schleife?
 
Delphi-Quellcode:
with ListView do
  while Assigned(Selected) do begin
    ProcessItem(Selected); // das ist deine Routine <---- das verstehe ich noch nicht so ganz
    Selected.Selected := false; // muss sein bei dieser Vorgehensweise
  end;
[/quote]

erstmal thx, aber was meinst du mit processitem und das dieses meine routine wäre? sorry das ich so ein noob bin :-(

gruss jolomino

marabu 6. Aug 2005 16:55

Re: listview selected schleife?
 
Na ja, du wirst doch irgendetwas mit dem markierten ListItem machen wollen? Ich hielt es für keine schlechte Idee das in einer Prozedur ProcessItem() zu tun, weil dann deine Schleifenkonstruktion besser zu lesen ist, als wenn du 42 Statements mit in die Schleife zwängst.

marabu

jolomino 6. Aug 2005 16:58

Re: listview selected schleife?
 
jou danke, bin auch gerade drauf gekommen, habe nur zu voreilig gepostet....naja, nach so vielen stunden vorm pc, ist es ja kein wunder das die birne weich wird :-)

danke leute für eure unterstützung

gruss jolomino

jolomino 6. Aug 2005 19:30

Re: listview selected schleife?
 
boah, das thema lässt mir keine ruhe :-(

benutze ja nun folgendes, erstmal thx nochmal :-)

Delphi-Quellcode:
listview.SelectAll;
 with ListView do

  while Assigned(Selected) do begin
    MultiPart.Start(GetSelectedFile(), True); // das ist deine Routine
    Selected.Selected := false; // muss sein bei dieser Vorgehensweise
    UpdateControls();
  end;
nun habe ich aber folgendes problem:
wenn ich nun alle markiere, dauerts ewig und 3 tage bis sich mal am anfang etwas tut. dabei findet mit "MultiPart.Start(GetSelectedFile(), True);" sofort ein aufruf statt, der vorher immer sofort bearbeitet wurde.
wie kann ich denn dieses nun umgehen?
wenn es keine lösung gibt, kann man dann immer 5 markieren vom listview und wenn einer davon fertig ist wieder einen dazu?

gruss jolomino

marabu 6. Aug 2005 19:44

Re: listview selected schleife?
 
Verstehe ich dich richtig, SelectAll() dauert ewig? Vielleicht wird irgendein Ereigniscode (OnSelectItem?) abgearbeitet? Wenn du alle ListItems bearbeiten willst, warum markierst du sie dann vorher? Solange du noch nicht alle markierten ListItems bearbeitest, solltest du auf die Aktualisierung der ListView verzichten. Wenn du sehr viele ListItems markierst, dann solltest du eine Fortschrittsanzeige einbauen.

marabu

jolomino 6. Aug 2005 19:55

Re: listview selected schleife?
 
du hast natürlich recht :-)
aber das selectall() dauert nicht lange, nur die anzeige das etwas im MultiPart.Start(GetSelectedFile(), True); passiert. deswegen war meine überlegung, 5 einträge selecten und wenn einer fertig ist, wieder einen dazu selecten, damit immer 5 einträge beaarbeitet werden. aber das bringt ja wohl auch nichts, da das ja das gleiche in grün ist :-( ob ich nun erst 5 und dann immer welche drauf selecte oder gleich all, das bleibt sich gleich...oder etwa nicht ?

gruss jolomino

marabu 6. Aug 2005 20:11

Re: listview selected schleife?
 
Ich weiß immer noch nicht, warum du die ListItems vor der Bearbeitung überhaupt markieren willst...

marabu

jolomino 7. Aug 2005 01:03

Re: listview selected schleife?
 
also ich kann auf die auszuführende procedure nur zugreifen wenn ein oder mehrere zeilen markiert sind. alle sind aber zuviel, deswegen ist nun die überlegung, einen eintrag nach dem anderen zu markieren.
bloss wie bekomme ich den dieses hin?
mit
Delphi-Quellcode:
with ListView do
  for i := 0 To Items.Count -1  do
    Items[i]. Selected := true ;
//hier dann die procedure
werden immer alle markiert.

gruss jolomino

marabu 7. Aug 2005 12:54

Re: listview selected schleife?
 
Zitat:

Zitat von jolomino
aber das selectall() dauert nicht lange, nur die anzeige das etwas im MultiPart.Start(GetSelectedFile(), True); passiert.

Damit sich deine Anzeige ändert, musst du in der Verarbeitungsschleife "Application.ProcessMessages" aufrufen.

Grundsätzlich macht ein SelectAll() vor deiner Verarbeitungsschleife keinen Sinn. SelectAll() ist ein Befehl der innerhalb einer Action aufgerufen wird, die üblicherweise im Hauptmenü über "Bearbeiten | Alle markieren" zu erreichen ist. Die Verarbeitung der markierten ListItems geschieht in einer Action, die einem Menüpunkt im Kontextmenü deiner ListView zugeordnet ist.

marabu

DGL-luke 7. Aug 2005 13:10

Re: listview selected schleife?
 
auch ist ein selectall mit nachfolgender bearbeitung aller selektierten items herzlicxh sinnlos - da kann man auch gleich die selektion lassen wie sie ist und einfach alle bearbeiten. wenn die selektion nur was kosmetisches ist, kann man das anders machen.

jolomino 13. Aug 2005 20:05

Re: listview selected schleife?
 
also,
ich versuche es momentan ohne zeilen zu markieren

Delphi-Quellcode:
var
    i : integer;
    Item : TListItem;

begin
   for i:=0 to ListView1.Items.Count-1 do begin

       Item := ListView1.Items.Item[i]
       // Hier soll dann die verarbeitung sattfinden
   end;
end;
nun möchte ich aber, das wirklich step by step das listview abgearbeitet wird. es sollen max. 3 zeilen im listview bearbeitet werden, ist eine fertig, soll die nächste bearbeitet werden. so das immer 3 zeilen in bearbeitung sind. wie stelle ich das an, muss ich da nen zähler oder so setzen? muss ich da das abarbeiten in der schleife überwachen, mit rüchgabewert? hab keinen blassen :cry:

gruss jolomino

marabu 13. Aug 2005 20:14

Re: listview selected schleife?
 
Hallo jolomino,

Zitat:

Zitat von jolomino
es sollen max. 3 zeilen im listview bearbeitet werden, ist eine fertig, soll die nächste bearbeitet werden. so das immer 3 zeilen in bearbeitung sind

was meinst du damit?

Grüße vom marabu

jolomino 14. Aug 2005 07:53

Re: listview selected schleife?
 
nun ja,
mit
Delphi-Quellcode:
for i:=0 to ListView1.Items.Count-1 do begin

       Item := ListView1.Items.Item[i]
       // Hier soll dann die verarbeitung sattfinden
   end;
wird ja die ganze listview aufeinmal abgearbeitet. nun möchte ich nur die ersten 3 zeilen bearbeiten, wegen der übersicht. wenn die drei zeilen fertig sind, sollen die nächsten 3 bearbeitet werden. oder besser gesagt, wen die ersten 3 zeilen in bearbeitung sind und eine davon ist eher fertig als die anderen 2, soll wieder eine zeile dazu in bearbeitung gehen. naja, wie gesagt, das halt immer 3 zeilen in bearbeitung sind, bis ich am ende der liste angekommen bin.

gruss jolomino

Sharky 14. Aug 2005 08:11

Re: listview selected schleife?
 
Hai jolomino,

das was Du vorhast kannst Du nur mit Threads lösen. Du müsstest also für jede "Item-Bearbeitung" einen Thread erzeugen dem Du die Daten für die Bearbeitung übergibst. Wenn nun ein Thread fertig ist bekommt er die Daten von dem nächsten Item.

Von der Geschwindigkeit dürfte das aber kaum schneller sein als die sequentielle Abarbeitung der Daten.

tigerman33 14. Aug 2005 09:20

Re: listview selected schleife?
 
Im Gegenteil, sogar noch langsamer. Oder sagen wir mal zumindest aufwändiger (neue Rechtschreibung? Schreibt man doch jetzt so, oder? :?: ). Denn jetzt müsstest du noch zusätzlichen Code schreiben, der verhindert, dass die Threads gleichzeitig auf ein Item zugreifen. Dazu musst du sie "synchronisieren", also kurz unterbrechen. Dann bist du mit einer sequentiellen Bearbeitung aber schon mal schneller...

DGL-luke 14. Aug 2005 11:45

Re: listview selected schleife?
 
ich finde auch, dass das nur zusatzarbet ist.

einfach die liste komplett durchlaufen.

alzaimar 14. Aug 2005 12:18

Re: listview selected schleife?
 
Nicht unbedingt:
Angenommen, er hat nur 3 Numsis (Nordazerbaidzanischer Fachausdruck für ein 'Ding'), die jeweils ein Item verarbeiten können. Die Verarbeitung eines Items dauert manchmal lange, manchmal geht sie schnell. Also würde die parallele Abarbeitung von jeweils 3 Items Sinn machen. Das Problem ist durchaus interessant, weil es hier um die optimale Verteilung von (naturgemäß knappen) Resourcen geht.
Der Lösungsansatz mit Threads ist schon richtig. Ein Thread nimmt sich das nächste Item, verarbeitet es mit Hilfe eines Numsis und holt sich dann das nächste Item ab, und zwar so lange, bis kein Item mehr übrig ist.
Man erzeugt N (in diesem Falle 3) Threads und weist jedem Thread eine andere Resource zu. Das wars.

jolomino 15. Aug 2005 19:46

Re: listview selected schleife?
 
ich versteh nur bahnhof :wall:

kommt leute, vergessen wirs, so etwas bekomme ich eh nicht gebacken :(

gruss jolomino

tigerman33 16. Aug 2005 15:30

Re: listview selected schleife?
 
@alzaimar:
Warum sollte denn das schneller gehen? Dem Prozessor ist es doch letztlich egal, ob er drei Item "gleichzeitig" oder seriell vernumsist. Der Zeitgewinn durch die zusätzlichen Multitasking-Zeitscheiben (wenn du auf den anspieltest) dürfte sich wohl im kaum noch messbaren Bereich bewegen, wenn du den von mir angesprochenen Zeitaufwand für Synchronize sowie den ganzen Verwaltungsoverhead abziehst.

Threads würden hier nur Sinn machen, wenn die Items jeweils auf ihre Ergebnisse angewiesen wären. Sind sie aber ja nicht.

@jolomino:
Das ist, denke ich, ein bisschen die falsche Einstellung. Wenn du was nicht verstehst, beschreib was genau, und dir wird geholfen werden. Das ist der Sinn dieses Forums.


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