![]() |
Listen vergleichen
Sorry habe irgendwie wieder was an der Waffel.
Ich erstelle eine Liste von Prozessen und eine Liste von ProzessId's Die Prozessliste hat 55 Einträge die ich mit meine ProzessId's Liste vergleichen muss (diese hat 4 Einträge). Habe wieder irgendwo einen Denkfehler wie vergleiche ich die liste nun mit unterschiedlichen Counter? Ok ;) Schlagt mich ruhig.. LOL
Delphi-Quellcode:
Überschreitet das Maximum logisch vProzessID hat ja nur 4 Einträge.
// prüfen ob aktiver prozess existiert
for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin if proc.ID = vProzessID[K].ID then bFound := true; end; end; gruss |
AW: Listen vergleichen
Du musst mit zwei geschachtelten Schleifen arbeiten.
Oder nimmst gleich ein TDictionary. EDIT: Oder schreibst einfach:
Delphi-Quellcode:
Nehme an, das es sich um TStringList handelt?
// prüfen ob aktiver prozess existiert
bFound := false; for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin bFound := true; end; end; |
AW: Listen vergleichen
Zitat:
Wie sind Deine Listen definiert? |
AW: Listen vergleichen
Zitat:
Delphi-Quellcode:
procedure CheckProzessID;
var IntI, K, M: Integer; vProcList: TProcesses; proc: TProcess; bFound: BOOL; begin bFound := false; // ProcList initialisieren vProcList := TProcesses.Create; // Prozesse einlesen vProcList.ReadSystem; // prüfen ob aktiver prozess existiert for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin if proc.ID = vProcList[K].ID then bFound := true; end; end; if not bFound then begin // Timer deaktivieren KillTimer(HSprMaster, ID_MRENDER); // Alle Objekte die mit diesen verbunden sind löschen for M := 0 to Length(AudioVolumeArr) - 1 do begin gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + M); // TAudioVolume freigeben AudioVolumeArr[M].free; end; // Array löschen SetLength(AudioVolumeArr, 0); // Session erstellen MainClass.CreateSession; // Window aktualisieren gSprSession.GI_UpdateWindow(HSprSession, false); // Timer aktivieren SetTimer(HSprMaster, ID_MRENDER, 60, nil); end; // Prozessliste löschen vProcList.Clear; // Prozessliste freigeben FreeAndNil(vProcList); end;
Delphi-Quellcode:
Im Anhang die *.pas mit ihren Möglichkeiten (ist nicht von mir)
vProzessID: TProcesses;
gruss |
AW: Listen vergleichen
Zitat:
Und wenn dann ist er falsch. gruss |
AW: Listen vergleichen
So wie ich das sehe hat TiGü recht,
sein Code sollte reichen, könnte man sogar noch etwas beschleunigen wenn man nach dem Finden abbricht.
Delphi-Quellcode:
// prüfen ob aktiver prozess existiert
bFound := false; for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin bFound := true; break; // Abbrechen da wir den Process haben end; end; |
AW: Listen vergleichen
vProzessID wird von wem mit was befüllt?
|
AW: Listen vergleichen
Zitat:
Wenn ich nur so prüfe ist bFound immer true und das Ergebnis wäre mein Task mit der ID die nicht mehr existiert wird nicht beendet. gruss |
AW: Listen vergleichen
Wenn es so ist steht der Process in vProcessID.
Dein Problem ist in diesem Fall ein anderes...... Wie wäre es mit Debuggen? |
AW: Listen vergleichen
Zitat:
Delphi-Quellcode:
vProzessID.Add(ProcId, MainClass.DeviceName);
Wenn mein Control entfernt wird und CreateSession wird erneut auf gerufen wird die Liste geleert. Addiere ich eine Session zur Laufzeit dan nwird die Liste nicht geleert aber die neue ID zur Liste addiert. Wenn ich nun die Prozessliste mit den vorhandenen ID's vergleiche und ein Prozess wurde beendet soll das entsprechende Control entfernt werden. Das mache ich auf einfachem Wege indem ich alle lösche und aktive neu erstelle. gruss |
AW: Listen vergleichen
Zitat:
Ich muss alle Prozesse mit den ID's in der Liste vergleichen und auf dem wege geht es nicht weil beim ersten vergleich ich schon dein "Beispiele" mit break.. aus der Liste rausspringe. False wird nie auftreten. gruss |
AW: Listen vergleichen
Emil dann steht das auch da drin,
Delphi-Quellcode:
var
k, i: integer; begin bFound := false; for k := 0 to (vProcList.Count - 1) do begin for i := 0 to vProzessID.Count do vProcList[k].ID = vProzessID[i].ID then begin bFound := true; break; end; if bfound then break; end; end; Das ist jetzt das gleiche ohne die Find function..... |
AW: Listen vergleichen
Danke werde es gleich mal versuchen..
Nur nochmal zur vorherigen Version.. mit deinem Break Bilder sagen mehr als worte. Beim ersten prüfen durchlauf ich die Liste und wenn der erste Eintrag gefunden wurde schaltest du auf true und springst raus aus der Funktion es wird also niemals auf die anderen Einträge hin in meiner Liste geprüft. Deshalb wird false niemals eintreten. Was ist dann mit der ID 2260 und der 4932 ? die werden in deinem Fall niemals geprüft. Deine neue Version werde ich mal testen Danke. EDIT: vProcList[k].ID hat nur lese Eigenschaft. deshalb der Umweg über Find gruss |
AW: Listen vergleichen
Ok dann fassen wir zusammen, Du willst überprüfen ob einer der einträge in vProzessID in vProcList ist?
Dann lass das break einfach weg. |
AW: Listen vergleichen
Zitat:
Es sei denn ich mache es so.. aber dann ist der False Status falsch weil er immer auf False gesetzt wird wenn nichts gefunden.
Delphi-Quellcode:
gruss
for K := 0 to (vProcList.Count - 1) do
begin if vProzessID.Find(vProcList[K].ID, proc) then bFound := true else bFound := false end; |
AW: Listen vergleichen
Emil wir reden wieder mal aneinander vorbei...
Bei meiner Version wird das bfound nur true wenn etwas gefunden wurde. bfound wird ja vor der Schleife auf false gesetzt. Ich versteh echt nicht was Du eigentlich erreichen willst. |
AW: Listen vergleichen
Zitat:
Vier einträge 0, 1, 2, 3 50 Einträge in der Prozessliste. Wenn du alle durchgehst und diese ID's gefunden hast wird bfound auf true gesetzt. Jetzt beende ich eine Anwendung habe aber immer noch meine ID's dann wird neu geprüft. Du prüfst 0, 1, 2, 3 0,1,2 wird gefunden also ist bfound = true. Nun was ist mit dem vierten! ja er ist false weil nicht gefunden. Aber nirgends wird dann der Status bfound in dem Fall auf false gesetzt du verstehst was ich meine ? Also ist bfound immer true und wird niemals false. Ich prüfe danach auf
Delphi-Quellcode:
da es nie eintritt kann ich mein Control nicht entladen.
if not bFound then
begin gruss |
AW: Listen vergleichen
Sowas
Delphi-Quellcode:
procedure TForm11.DoProcessloop;
var loop, indexInList: integer; begin for i := vProzessID.Count - 1 downto 0 do begin indexInList := vProcList.IndexOf(vProzessID[loop].ID); if indexInList >= 0 then begin // Wir haben den Procces gefunden // Mach was damit end else begin // Der Process ist nicht mehr in der Processlist // Mach was // zb Löschen // vProzessID.delete(loop); end; end; end; |
AW: Listen vergleichen
Ja so geht's vielen Danke ;)
Delphi-Quellcode:
gruss
for K := vProzessID.Count - 1 downto 0 do
begin IntI := vProcList.IndexOf(vProzessID[K].ID); if IntI >= 0 then bFound := true else begin bFound := false; break; // damit es nicht wieder auf true springt hier raus. end; end; |
AW: Listen vergleichen
Dann fassen wir zusammen:
Es geht eigentlich darum herauszufinden ob vProzessID komplett in vProcList enthalten ist. Wenn ja true sonst false. Mit der richtigen Frage hättest Du auch gleich die richtige Antwort bekommen :-) |
AW: Listen vergleichen
Zitat:
Beide Listen vergleichen :) Danke auch an @TiGü gruss |
AW: Listen vergleichen
Ist bestimmt offtopic, ich nutze eine ListView für so etwas, verteilt über sub-items kann man sich vieles Speichern und easy wiederfinden da alles über den gleichen Index erreichbar ist, ob Visuell dargestellt oder nur Intern, ich mag die in beiden Fällen.
|
AW: Listen vergleichen
Was soll ich mit einem ListView? Wenn ich genau für meinen Fall die richtige Klasse habe.
Zudem war das Thema schon erledigt. Man muss doch nicht in jeden Thema und zu allen Fragen eine Antwort geben. Hmm... :roll: gruss |
AW: Listen vergleichen
Zitat:
Wenn du so etwas machst, obwohl es sehr viel einfachere, schnellere und sauberere Möglichkeiten gibt, bitte. Aber bitte gib doch so etwas nicht auch noch anderen als Tipp... :shock: |
AW: Listen vergleichen
Zitat:
Wenn du mit der VCL arbeitest mag es bessere und effektivere Möglichkeiten geben wie TStringList und Konsorten. Aber es ist durchaus legitim seine Daten in eine ListBox zu speichern ohne das diese sichtbar sein muss. Das ist allemal besser als im Code mit 100 von Arrays rum zu sortieren. Alle meine Propertys meiner Library werden in eine Listbox gespeichert um sie beim beenden der Anwendung freigeben zu können. Da ist nichts verwerfliches dran und mit Sicherheit kein schlechter Programmierstil. gruss |
AW: Listen vergleichen
Zitat:
|
AW: Listen vergleichen
Ich setze meine LV dann falsch ein. Unsichtbar ist meine LV Caption, da steht das Prozess-Handle drinn, sichbar ist Sub-Item, da steht der Titel drinnen.
Ich mag beides zusammen haben und habe so immer das exakte Handle zum Eintrag ohne weitere Probleme oder mit anderen StringLists oder Arrays oder oder oder. Wenn dies schlechter Stil ist dann will ich nichts gesagt haben. Kann ja jeder dutzende anderer Listen intern füllen und verwalten, für das simple was ich mache, da finde ich so eine Funktion Klasse um sich eben nicht für jeden Eintrag dutzende Zweitlisten zu erstellen und abzuarbeiten. Ich pers. sehe daran nichts verwerfliches da eine LV sich alleine entleert kann es auch Vorteilhaft sein. |
AW: Listen vergleichen
Was hat eine TStringList in einer NonVCL Anwendung zu suchen?
Ehrlich jetzt. Und welche Möglichkeiten bleiben dann noch? Richtig so etwas wie eine ListBox gleichzusetzen mit TStringList NUR und das ist es ich brauche die unit Classes nicht einzubinden. Das sind die kleinen Feinheiten und um vom Overhead zu sprechen zeig mir einen wenn ich meine liste nur als Zwischenspeicher verwende. Zitat:
Und ja es machen viele von denen weil am einfachsten, sinnvollsten und bequemsten. Aber das sind Leute die noch in der Lage sind Anwendungen in 45K zu schreiben wo du vielleicht 2MB und up benötigst. EDIT: Ohne den neumodischen schnick, schnack den niemand braucht um eine funktionstüchtige Anwendung zu schreiben. Alte Schule halt. gruss |
AW: Listen vergleichen
Zitat:
Eine TStringList ist dagegen ein reiner schlanker Datenspeicher. |
AW: Listen vergleichen
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
ist. Bin mir recht sicher, dass sich da schon deutliche Unterschiede zeigen.
TStringList
Zitat:
Delphi-Quellcode:
,
std::vector
Delphi-Quellcode:
und etliche weitere extrem einfach zu verwendende (sogar generische) Container-Typen, die in der Standard-Lib enthalten sind. Auf diese zu verzichten und stattdessen eine Windows ListView zu missbrauchen, macht ehrlich gesagt wenig Sinn.
std::list
Wie gesagt, jeder soll machen, wie er will, aber unüblich ist dieses Verfahren allemale :) |
AW: Listen vergleichen
Zitat:
Ihr immer mit euren "T" zu beginn. ;) Meine ListBox, nix mit T und nix mit Classes.
Delphi-Quellcode:
Die frage ist doch immer der Anwendungsbereich.
hLISTFNAME := CreateWindowEx(0, 'LISTBOX', nil, UseStyle, 0, 0, 0, 0, ParentHandle,
ID_LISTFNAME, skInstance, nil); Nicht was schön beliebt oder angeblich schlechter Programmierstil ist. Zitat:
Das wäre ein Nonsens. Zitat:
Aber habe Verständnis dafür das es Menschen gibt die halt sowenig wie möglich Lib's verlinken wollen wenn es nicht nötig ist. Denn diese bauschen den Code unnötig auf. Ja ich weis! Ist doch egal ob das Compilat 5 oder mehr an MB benötigt. Nun aber einigen Leuten eben nicht. Zitat:
Aber unter VCL TListView, TListBox als Datenspeicher zu missbrauchen ja da gebe ich euch recht ist ein Nonsens. gruss |
AW: Listen vergleichen
Zitat:
Finde es aber auch wichtig darauf hinzuweisen, dass es sagen wir mal weiter verbreitete, etabliertere Wege bzw. Konventionen gibt, die zu verwenden die Arbeit in Teams deutlich erleichtern. Deshalb wollte ich die Aussage von KodeZwerg an dieser Stelle nicht unkommentiert stehenlassen. |
AW: Listen vergleichen
Zitat:
Deshalb habe ich auch diesen Satz noch hinzugefügt. Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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