Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listview (gleiche Zeile- unterschiedliche Spalte) (https://www.delphipraxis.net/95929-listview-gleiche-zeile-unterschiedliche-spalte.html)

Testy 16. Jul 2007 09:49


Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo!

Ich habe eine Listview mit zwei Columns! In die 1. Spalte lasse ich zahlen mir RegExpr einlesen.
Im nächsten Schritt möchte ich etwas in der zweiten Spalte einlesen lassen.
Nun habe ich aber das Problem, dass er nicht in der ersten Zeile (in der zweiten Spalte) anfängt, sondern unter der letzten Zeile!
Die erste Spalte lese ich so ein:
Delphi-Quellcode:
    ListItem := listview1.Items.Add;
    listitem.Caption := (r.Match[0]);
Und die zweite dann so:
Delphi-Quellcode:
ListItem := listview1.Items.Add;
listitem.SubItems.Add('Eintrag zweite Spalte');
Wie bekomme ich es hin, das die eingelesenen Zahlen in Spalte 2 von der ersten Zeile an drin stehen???

Vielen Dank im voraus!

hoika 16. Jul 2007 09:56

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo,

du erzeugst per ListView.Items.Add immer neue Zeilen.

Um was in die 1. Zeile / 2. Spalte zu schreiben
Delphi-Quellcode:
ListItem:= ListView.Items[0];
ListItem.SubItems.Add('hoika is gut');
Um was in die 2. Zeile / 2. Spalte zu schreiben
Delphi-Quellcode:
ListItem:= ListView.Items[1];
ListItem.SubItems.Add('hoika is gut');
Heiko

bitsetter 16. Jul 2007 11:49

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hi,

oder so:
Delphi-Quellcode:
var
  ListItem: TListItem;
begin
  ListItem := listview1.Items.Add;
  Listitem.Caption := 'Eintrag erste Spalte';
  Listitem.SubItems.Add('Eintrag zweite Spalte');

Testy 17. Jul 2007 10:43

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Zitat:

Zitat von bitsetter
Hi,

oder so:
Delphi-Quellcode:
var
  ListItem: TListItem;
begin
  ListItem := listview1.Items.Add;
  Listitem.Caption := 'Eintrag erste Spalte';
  Listitem.SubItems.Add('Eintrag zweite Spalte');

So kann ich es nicht machen! Da ich mit RegExpr eine Spalte füllen lassen möchte!
Delphi-Quellcode:
 try
    r.Expression := '[0-9]{2}:[0-9]{2}:[0-9]{2}';
    if r.Exec(Memo1.Lines.Text) then
    repeat
      listbox1.items.Add(r.Match[0]); //hier soll er es in Zukunft in eine Spalte der Listview eintragen
    until not r.ExecNext;
  finally
    r.Free;
    l.Free;
  end;
Mein Problem ist jetzt: Nun soll er etwas aus einer Listbox in die zweite Spalte komplett füllen!

Gruß!

hoika 17. Jul 2007 11:16

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo,

was hast du an meinem Code nicht verstanden ??? Mensch !!! ;)

Du darfst kein ListView.Items.Add machen,
sondern musst dir das entsprechende ListItem raussuchen,
das steht ja schon drin.

Jeder Aufruf von ListView.Items.Add erzeugt ne neue Zeile,
und das soll es ja nicht.

Da dein Code nicht sher aussagekräftig ist,
mal nen Schuss ins Blöaue

Delphi-Quellcode:
var
  iRow    : Integer;
  ListItem : TListItem;
begin
  if r.Exec(Memo1.Lines.Text) then
  begin
    iRow:= 0;
    repeat
      ListItem:= ListView.Items[iRow];
      ListItem.SubItems.Add(r.Match[0]);
      Inc(iRow);
    until not r.ExecNext;
  end;
end;

Heiko

Testy 17. Jul 2007 12:08

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Bekomme aber mit diesem Code an der Stelle
Delphi-Quellcode:
ListItem.SubItems.Add(r.Match[0]);
eine AV!
Habe ich etwas vergessen? Zwei Columns habe ich auch erstellt! ViewStyle der Listview ist auf vsReport!

Hier nochmal ein längerer Auszug aus meinem Code:
Delphi-Quellcode:
WB_GetHTMLCode(Webbrowser1, Memo1.Lines);
  l := TStringList.Create;
  r := TRegExpr.Create;
  try
    r.Expression := '[0-9]{2}:[0-9]{2}:[0-9]{2}';
    if r.Exec(Memo1.Lines.Text) then
begin
    iRow:= 0;
    repeat
      ListItem:= ListView1.Items[iRow];
      ListItem.SubItems.Add(r.Match[0]); //hier kommt die AV
      Inc(iRow);
    until not r.ExecNext;
    end;

  finally
    r.Free;
    l.Free;
end;

hoika 17. Jul 2007 13:44

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo

und wo kommt mit folgendem geändertem Code ?

die Frage ist auch, ob es mehr matches als
items (Zeilen) gibt.


Delphi-Quellcode:
var
  sMatch: String;



  ListItem:= ListView1.Items[iRow];
  Assert(ListItem<>NIL);

  sMatch:= r.Match[0];
  ListItem.SubItems.Add(sMatch);

Heiko

Testy 17. Jul 2007 13:53

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Dann meldet er mir für diese Zeile
Delphi-Quellcode:
Assert(ListItem<>NIL);
Im Project ist eine Exception der Klasse EAssertionFailed aufgetreten!

Delphi-Quellcode:
WB_GetHTMLCode(Webbrowser1, Memo1.Lines);
  l := TStringList.Create;
  r := TRegExpr.Create;
  try
    r.Expression := '[0-9]{2}:[0-9]{2}:[0-9]{2}';
    if r.Exec(Memo1.Lines.Text) then
    repeat
      ListItem:= ListView1.Items[iRow];
      Assert(ListItem<>NIL);
      sMatch:= r.Match[0];
      ListItem.SubItems.Add(sMatch);
    until not r.ExecNext;
  finally
    r.Free;
    l.Free;
  end;
Es müssten im Moment 19 Zeilen in die Listview eingetragen werden!

SirThornberry 17. Jul 2007 13:56

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
du hast dir selbst die Antwort gegeben. Wenn Assert eine Exception wirft bei der Prüfung ist dein ListItem nil und somit kracht es wenn du damit rumhantieren willst. Ich glaub deine Programmlogic hakt irgendwo.

Testy 17. Jul 2007 14:00

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hier nochmal meine Vorstellung von dem Programm:

- ich habe ein Memo welches mit RegExpr nach bestimmten Zeichen durchsucht wird
- die Ergebnisse sollen in eine Spalte einer Listview
- danach soll eine zweite Spalte (von der ersten Zeile angefangen)der Listview einträge aus einer vorhandenen Listbox übernehmen!

hoika 17. Jul 2007 15:12

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo,

wie schon gesagt, deine Logik hat nen Knicks ;)
Wenn im ListView weniger Einträge stehen also in der Listbox,
musst du halt vorher noch ein paar ListItems eintragen.
Delphi-Quellcode:
iDiff:= ListBox.Items.Count-ListView.Items.Count; // oder so ähnlich
for i:= 1 to iDiff do
begin
  ListItem:= ListView.Items.Add;
end;
Danach kannst du die Routine so verwenden.

Heiko

Testy 17. Jul 2007 15:39

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Danke!!!! Nun geht es so wie ich möchte!
Wie kann ich denn jetzt den Inhalt prüfen. Ich hatte mir das so vorgestellt: Es wird in Spalte 1 Zeile für Zeile nachgeschaut. Wenn ein bestimmter Inhalt (bestimmte Zahl) gefunden ist dann soll er mit dem Inhalt in der zweiten Spalte (aber der gleichen Zeile) etwas machen!

Gruß!

SirThornberry 17. Jul 2007 15:40

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
wie sieht denn dein jetziger Ansatz dafür aus und woran scheiterst du genau?

Testy 17. Jul 2007 15:45

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Einen Ansatz habe ich noch nicht. Da ich voher noch ein Problem habe!
Habe ein dynamisches Array und will es mit dem Inhalt der zweiten Spalte füllen!
Delphi-Quellcode:
for i := 0 to zaehler-1 do
  DynArray[i] := StrToTime(li.subItems[i]);
Bekomme aber jedesmal ein "Überschreitet maximum(1). Das komische ist: Wenn ich mir li.subItems[0] anzeigen lasse, zeigt er mir den Inhalt der letzten Zeile an. Dann ist das mit dem Maximum klar. Wie schaffe ich es, dass er von oben anfängt?

Gruß!

SirThornberry 17. Jul 2007 15:47

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
caption = Spalte1
subitem[0] = Spalte2
subitem[1] = Spalte3
etc.
du hast doch aber nur 2 spalten :)
subitems[i] greift also, sobald i größer 0 ist, auf spalten zu welche nicht existieren

Testy 17. Jul 2007 15:50

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Ahhhh, stimmt!
Wie ist den die Syntax um die 2. Spalte von oben nach unten in mein Array zu lesen!

Danke.

Gruß!

SirThornberry 17. Jul 2007 15:51

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Delphi-Quellcode:
ListView.Items.Item[Zeile].SubItems[0]

Testy 17. Jul 2007 15:55

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Super! Jetzt klappt's! Nun muss ich mir mal Gedanken machen, wie ich das mit dem Prüfen des Inhalts hinbekomme! Und das er dann was mit dem Inhalt in der zweiten Spalte (gleiche Zeile macht).
Ist es sinnvoll die komplette erste Spalte mit RegExpr zu durchsuchen oder gibt es da etwas einfacheres?

Testy 17. Jul 2007 16:34

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Habe eine Lösung für mein Problem gefunden:
Delphi-Quellcode:
for i := 0 to zaehler-1 do
begin
if Trim(ListView1.Items.Item[i].caption)='+491' then
begin
DynArray2[i] := StrToTime(ListView1.Items.Item[i].SubItems[0]);
end;
end;

for i := Low(DynArray2) to High(DynArray2) do
begin
mobilzeit:=mobilzeit+DynArray2[i];
end;
So funktioniert es!

hoika 18. Jul 2007 06:56

Re: Listview (gleiche Zeile- unterschiedliche Spalte)
 
Hallo,

Delphi-Quellcode:
for i := 0 to zaehler-1 do
  DynArray[i] := StrToTime(li.subItems[i]);
Wenn du nicht immer so kleckerweise Code zeigen würdest,
könnte man auch helfen.

zaehler - auf was ist der gesetzt
DynArray - wie ist es initialisiert


Das dynamische Arrays sich nicht dynamisch vergrössern, weisst du ...
SetLength benutzen


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz