Autor Beitrag
Thomas_1110
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win Vista
Delpi 7 Personal
BeitragVerfasst: Do 03.07.03 20:14 
Hallo Forum
In meinem Programm hab ich ein Listview das beim Start per
ausblenden Quelltext
1:
2:
ListItem := Listview1.items.Add;  ListItem.Caption := PSatz(Liste.Items[i])^[j];
ListItem.SubItems.Add(PSatz(Liste.Items[i])^[j]);
fülle.

Klappt alles sehr gut.
Aus irgendeinem Grund schreib ich dann per Win Api Lvm_Setitemtext in meinem Listview.
Will ich aber den Text aus dem betreffenden Item per
ListView1.Items.Item[1]lesen, bekomme ich aber den String zurück der beim Start des Programmes gestanden hat. Aber per WinApi Lvm_Getitemtext bekomme
ich den richtigen String (der auch im Listview sichtbar ist).
Gibts dafür irgendeine Erklärung?
Gruß Thomas
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Do 03.07.03 21:14 
Jo, die ListView (bzw. deren property TListItems) speichert in jedem TListItem die Caption als String ab. Über das property TListItem.Caption greifst Du dann auf diesen String zu, es wird nicht Lvm_Getitemtext aufgerufen. Und da das ListItem seinen String nicht aktualisierst, wenn Du hinter seinem Rücken die Caption per API veränderst, bekommst Du dann immer den alten String.

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
Thomas_1110 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win Vista
Delpi 7 Personal
BeitragVerfasst: Do 03.07.03 21:20 
Danke Worm, hat mir meinen Verdacht bestätigt.
Hab jetzt meinen Code wieder umgeschrieben. Lesen und schreiben im Lv ohne Api.
Nur weils mich interresiert: Läßt sich das Listview aktualisieren?
Gruß Thomas
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.07.03 23:21 
worm hat folgendes geschrieben:
Über das property TListItem.Caption greifst Du dann auf diesen String zu, es wird nicht Lvm_Getitemtext aufgerufen.

Was denn dann?
Thomas_1110 hat folgendes geschrieben:

Lesen und schreiben im Lv ohne Api.

Interessant. Wie hast du denn das gemacht?
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Fr 04.07.03 00:53 
Luckie hat folgendes geschrieben:
Was denn dann?
Der String, den das ListItem sozusagen lokal speichert, in einem als private deklarierten Feld FCaption vom Typ String. Ich weiß nicht, ob es sich davon große Vorteile verspricht ;), aber es speichert die Caption lokal, anstatt sie sich immer mit Lvm_Getitemtext zu holen. Schreibt man in die Caption, dann speichert das ListItem die neue Caption (falls sie wirklich neu ist, sie wird erst mit dem gespeicherten String verglichen) in FCaption und ruft dann erst Lvm_Setitemtext auf. Liest man die Caption, greift man direkt auf FCaption zu, weshalb Änderungen an der Caption über die API keine Auswirkungen auf TListItem.Caption haben. Alles klar? :D

Luckie hat folgendes geschrieben:
Interessant. Wie hast du denn das gemacht?
Naja, wohl über VCL. Also auch zum Schreiben das Caption-property der ListItems benutzt, dann gibt es auch keine Probleme, wenn man das Caption-property zum Lesen benutzt.

Thomas_1110 hat folgendes geschrieben:
Nur weils mich interresiert: Läßt sich das Listview aktualisieren?
Inwiefern?

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.07.03 01:52 
Ach und was meinst du, was die VCL macht? Die wird auch nur API Funktionen aufrufen.
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Fr 04.07.03 02:03 
Ja das ist klar. Er meinte auch nur, dass er nicht mehr direkt die API nutzt. Er hatte ja bloß die Situation, dass er eine ListView per VCL erstellt hat und direkt per API bearbeiten wollte, nur leider verhinderte die Implementierung in der VCL, dass das reibungslos ablief.

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
Thomas_1110 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win Vista
Delpi 7 Personal
BeitragVerfasst: Fr 04.07.03 16:53 
Zitat:
Ja das ist klar. Er meinte auch nur, dass er nicht mehr direkt die API nutzt.

Genau so wars gemeint.
Zitat:
Inwiefern?

Das daß was ich tatsächlich in meinem Lv sehe, also 'direkt' über die WinApi eingefügt habe, dann auch tatsächlich in meinem Lv habe.
War vielleicht ein dummer Gedanke, Delphi bietet ja alles (fast alles) was die WinApi kann.
Gruß Thomas
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Fr 04.07.03 18:52 
Also Du meinst, dass das VCL-Objekt (TListView) die Änderungen übernimmt, die Du per API durchgeführt hast? Nö, das geht nicht, zumindest gibt es dafür nichts vorgefertigtes. Du müsstest in einer Schleife alle Items durchlaufen, per ListView_GetItemText die Caption ermitteln und Items[i].Caption zuweisen. Dabei würden die TListItems aber immer denken, die Caption hätte sich geändert, und würden noch einmal ListView_SetItemText aufrufen. Ist alles ziemlich ungünstig. Api und VCL lässt sich eben nicht beliebig mischen. Willst Du ListView_SetItemText nutzen, dann musst Du auch ListView_GetItemText nutzen. :mahn:

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.