Delphi-PRAXiS
Seite 1 von 2  1 2      

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 aus einer fremden Anwendung durchsuchen/anklicken (https://www.delphipraxis.net/107057-listview-aus-einer-fremden-anwendung-durchsuchen-anklicken.html)

Innos 21. Jan 2008 15:41


ListView aus einer fremden Anwendung durchsuchen/anklicken
 
Hi!

Ich versuche mich gerade an einem prog, dass ein ListView aus einem fremden Programm ausliest...
ich benutze den code von toms, den ich hier iwo gefunden habe,um das listView überhaupt einmal auszulesen und alles in mein eigenes ListView zu übertragen.

Jetzt möchte ich aber, wenn ich in meinem Programm, in meinem ListView eine Zeile anklicke, der selbe klick auch auf dem listview in dem fremden Programm ausgeführt wird. Das heißt ich muss die fremde listview nach der angeklickten´Caption durchsuchen und dieses item anklicken...

also die cation von der angeklickten zeile kriege ich so heraus:

Delphi-Quellcode:
label2.Caption:=(listview1.Selected.Caption);
nur wie durchsuche ich jetzt die fremde listview danach und klicke das item danach an?
ist das überhaupt möglich?

vielen Dank schonma im Vorraus :)

mfg

DeddyH 21. Jan 2008 16:02

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
Schau mal nach LVM_FINDITEM und LVM_SETITEM (zumindest klingen die Beschreibungen recht vielversprechend).

toms 21. Jan 2008 16:07

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
Hallo Innos,

Zitat:

Ich versuche mich gerade an einem prog, dass ein ListView aus einem fremden Programm ausliest...
ich benutze den code von toms, den ich hier iwo gefunden habe,um das listView überhaupt einmal auszulesen und alles in mein eigenes ListView zu übertragen.
Suchen kannst du ein Item mit LVM_FINDITEM. Da du jedoch die fremde Listview kopierst, kannst du ja
gleich direkt auf den entsprechenden Itemindex zugreifen. (ausser in der fremde Listview wurden die Items und somit Reihenfolge
in der Zwischenzeit geändert.


Zitat:

Jetzt möchte ich aber, wenn ich in meinem Programm, in meinem ListView eine Zeile anklicke, der selbe klick auch auf dem listview in dem fremden Programm ausgeführt wird. Das heißt ich muss die fremde listview nach der angeklickten´Caption durchsuchen und dieses item anklicken...
Kann ich nicht genau sagen, was für eine Nachricht dem entsprechenden Item geschickt werden muss
oder ob es nur genügt, das Item zu markieren?

Nachtrag: So sollte es funktionieren. Vielleicht gibt's noch eine elegantere Methode?

1. Item sichtbar machen LVM_ENSUREVISIBLE
2. Item Position herausfinden (mit LVM_GETITEMRECT / LVM_GETITEMPOSITION)
3. Mit mouse_event WM_LBUTTONDOWN/WM_LBUTTONUP senden.

Innos 21. Jan 2008 16:14

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
also ich lese diese listbox aus, klicke dann ein beliebiges item an... (die original listbox in dem fremden prog KÖNNTE geändert worden sein, aber das item ist immernoch enthalten) und dann soll es quasi nach der angeklickten cation aus meinem prog suchen... und das dazu gehörige item in dem fremden prog an klicken...

so THX erstma für eure tips ich schaus mir gleich ma an

Innos 21. Jan 2008 16:30

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
mmhh check grade nicht wie ich das machen soll...

also
Delphi-Quellcode:
sendmessage(w,LVM_FINDITEM,0,0);
nur diese nullen dahinten sind alle integer werte xD sry dass ich son noob bin :D aber wo kommt da mein string hin, nachdem ich suchen will?

toms 22. Jan 2008 07:10

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
Zitat:

Zitat von Innos
mmhh check grade nicht wie ich das machen soll...

also
Delphi-Quellcode:
sendmessage(w,LVM_FINDITEM,0,0);
nur diese nullen dahinten sind alle integer werte xD sry dass ich son noob bin :D aber wo kommt da mein string hin, nachdem ich suchen will?

Du kannst ja die items per Iteration suchen, d.h du nimmst in etwa den gleichen Code wie zum auslesen der Listview und ermittelst so nach dem item / itemindex.

Innos 22. Jan 2008 11:54

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
so ich habs jetzt soweit, dass ich mithilfe deines streams, toms, dieses ListView durchsuchen kann... ich habe also die nummer des Items aus dem original ListView... wie sende ich jetzt einen klick genau auf dieses item?

also quasi:

Delphi-Quellcode:
sendmessage(w,WM_LBUTTONDOWN,0,0);
sendmessage(w,WM_LBUTTONUP,0,0);
nur wo gebe ich jetzt dieses item an, dass er in dem handle (die ListView) anklicken soll?

danke schon mal für eure hilfe :thumb:

toms 22. Jan 2008 14:18

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
Mir ist keine Möglichkeit bekannt, einem bestimmten Item eine "onclick" Nachricht zu schicken.
Eine Möglichkeit wäre es, das gefundene Item zu markieren und dann Enter der Listview zu senden. Dies funktioniert sogar dann, wenn das Fenster, auf welchem sich die Listview befindet, nicht sichtbar ist.

Die Click Funktion könnte dann grob etwa so aussehen:

Delphi-Quellcode:
function LVClickItem(hwndLV: HWND; sItemText: string): Boolean;
const
  MaxTextLen = 1024;
var
  MemMgr: TProcessMemMgr;
  Item: TLVItem;
  i: Integer;
  PrItemText: PChar;
  PrItem: PLVItem;
begin
  Result := False;
  MemMgr := CreateProcessMemMgrForWnd(hwndLV);
  try
    PrItemText := MemMgr.AllocMem(MaxTextLen);
    PrItem := MemMgr.AllocMem(SizeOf(TLVItem));
    i := ListView_GetNextItem(hwndLV, -1, LVNI_ALL);
    while i >= 0 do
    begin
        //Item Eigenschaften setzen
        Item.mask := LVIF_TEXT;
        Item.iItem := i;
        Item.iSubItem := 0;
        Item.pszText := PrItemText;
        Item.cchTextMax := MaxTextLen;
        MemMgr.Write(Item, PrItem, SizeOf(TLVItem));
        if not ListView_GetItem(hwndLV, PrItem^) then Break;
        MemMgr.Read(PrItem, Item, SizeOf(TLVItem));
        //Überprüfen, ob Item mit gesuchtem Item übereinstimmt.
        if MemMgr.ReadStr(Item.pszText) = sItemText then
        begin
          //Item "Selected" Eigenschaften setzen
          Item.state := LVIS_SELECTED;
          Item.stateMask := LVIS_SELECTED;
          //Item markieren
          MemMgr.Write(Item, PrItem, SizeOf(TLVItem));
          if Boolean(SendMessage(hwndLV, LVM_SETITEMSTATE, i, LongInt(PrItem))) then
          begin
            //Enter senden
            PostMessage(hwndLV, WM_KEYDOWN, VK_RETURN, 0);
            PostMessage(hwndLV, WM_KEYUP, VK_RETURN, 0);
            Result := True;
          end;
          Break;
        end;
        i := ListView_GetNextItem(hwndLV, i, LVNI_ALL);
    end;
  finally
    MemMgr.Free;
  end;
end;

Innos 22. Jan 2008 15:00

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
:thumb: wooooww thx :D

ich werde deinen code noch bisl ändern zB geht das mit dem Enter nicht.... also atm markiere ich das item so wie du und dann sene ich den doppelklick aus :)

GANZ großes Kino :thumb:

toms 22. Jan 2008 15:07

Re: ListView aus einer fremden Anwendung durchsuchen/anklick
 
Zitat:

Zitat von Innos
:thumb: wooooww thx :D

ich werde deinen code noch bisl ändern zB geht das mit dem Enter nicht
GANZ großes Kino :thumb:

Um was für ein Programm handelt es sich denn? Wie sendest du den "doppelklick"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.
Seite 1 von 2  1 2      

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