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 in Richedit kopieren (https://www.delphipraxis.net/49272-listview-richedit-kopieren.html)

FriFra 8. Jul 2005 00:18


ListView in Richedit kopieren
 
Ich will irgendwie einen Listview in ein Richedit kopieren. Dabei sollen alle Images und Statusimages mit kopiert werden :roll:
Hat jemand eine Idee, wie man da am besten heran gehen könnte?

Luckie 8. Jul 2005 01:14

Re: ListView in Richedit kopieren
 
Speicher im Prozess des Listwies reservieren (MSDN-Library durchsuchenVirtualAllocEx, dort in eine TListItem Struktur alles reinkopieren (MSDN-Library durchsuchenWriteProcessMemory) und dann mittels MSDN-Library durchsuchenReadProcessmemory in eine identsiche Struktur im eigenen Prozess kopieren. Dann kannst du damit machen, was du willst. Für Details guck dir meine LuckieDIPS an.

FriFra 8. Jul 2005 05:20

Re: ListView in Richedit kopieren
 
Zitat:

Zitat von Luckie
Für Details guck dir meine LuckieDIPS an.

Der Server scheint down zu sein :roll: ...
Im Moment weiß ich überhaup noch nicht, worauf das ganze hinaus laufen soll? Ohne ein Beispiel, oder eine Erklärung, wie mich das Schreiben im Prozess des Listview weiter bringen soll kann ich damit nichts anfangen :gruebel: ...

Luckie 8. Jul 2005 12:23

Re: ListView in Richedit kopieren
 
Geht wieder.

Na ist doch ganz klar, du kannst ja nicht direkt auf den Speicher im fremden Prozess zugreifen, sondern nur auf Speicher, den du dir im fremden Prozess auch reserviert hast. Und nachrichten wie LVM_GETITEM und so funktionieren nicht, weil:
Zitat:

Zitat von Luckie
Der Listview gehört zu den neuen 32-Bit Steuerelementen (Commoncontrols). Das vor weg. Früher, unter 16-Bit Windows, waren die Speicherbereiche der Prozesse noch nicht getrennt, das heißt, ich konnte ohne weiteres auf den Speicherbereich eines anderen Prozesses zugreifen. Mircosoft hat, aus Kompatibilitätsgründen, dieses Verhalten auch unter 32-Bit Windows für die damals schon vorhandenen und unter 32-Bit Windows immer noch vorhandenen Kontrolls implememntiert. Aufrufe wie WM_GETTEXT für Edit-Felder usw. werden dazu in einen gemeinsamen Speicherbereich gemappt. Für die neu hinzugekommen Kontrolls (Listview, Treeview, Statusbar, ...) sah Microsoft diese Notwendigkeit nicht. Da Listview_Gettext eigentlich nur einen Zeiger auf einen Buffer zurückliefert, schlägt logischerweise dieser Aufruf fehl, wenn es sich um einen Listview in einem fremden Prozess handelt. Listview_GetItemCount funktioniert, da der konkrete Wert zurückgeliefert wird und kein Zeiger auf einen Buffer.

Lösung: Reserviere Speicher im fremden Prozess, fülle ihn mit MSDN-Library durchsuchenWriteProcessmemory und kopier ihn mit MSDN-Library durchsuchenReadProcessMemory in eine identische Struktur in den Adressraum deines Prozesses. Wie das genau geht kannst du dir bei meinen LuckieDIPS ( http://programme.luckie-online.de ) ankucken.


FriFra 12. Jul 2005 14:44

Re: ListView in Richedit kopieren
 
Worauf das ganze hinaus laufen soll ist mir immer noch nicht klar... Ich könnte ja genauso gut mit einer Schleife übr alle Items laufen und deren Inhalt in mein RichEdit kopieren :roll:
Ich hatte halt gehöfft, man könne den ListView quasi "on the fly" als Tabelle in das RichEdit kopieren...

Luckie 12. Jul 2005 14:47

Re: ListView in Richedit kopieren
 
Zitat:

Zitat von FriFra
Ich könnte ja genauso gut mit einer Schleife übr alle Items laufen und deren Inhalt in mein RichEdit kopieren :roll:

Genau darauf läuft es hinaus. Nur eben, dass du den Umweg über den reservierten Speicher im Fremden Prozess gehen musst. Mit den LuckieDIPS hast du ja schin die halbe Miete, nämlich die Captions. Statt sie in eine Ini-Datei zu schreiben, wie ich es mache schreibst du sie in dein RichEdit.
Zitat:

Ich hatte halt gehöfft, man könne den ListView quasi "on the fly" als Tabelle in das RichEdit kopieren...
Diese Funktionalität bringt der SystemListview eben nicht mit. Da musst du eben, wie oben beschrieben, selbst Hand anlegen.


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