Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Integer als Adresse eines Records (https://www.delphipraxis.net/6133-integer-als-adresse-eines-records.html)

Chewie 30. Jun 2003 20:36


Integer als Adresse eines Records
 
Ich komm gerade nicht weiter. Ich speichere in einer Integer-Variable die Adresse eines Records (zumindest hoffe ich das):
Delphi-Quellcode:
LVItem.mask := LVIF_TEXT or LVIF_PARAM;
      LVItem.iItem := rowIndex;
      LVItem.iSubItem := 0;
      GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, @PacketRec.inTime, 'HH:mm:ss', @curTime, Length(curTime));
      LVItem.pszText := @curTime;
      LVItem.lParam := Integer(PacketRec); //hier
      SendMessage(hIncIPView, LVM_INSERTITEM, 0, Integer(@LVItem));
PacketRec ist eine Referenz auf PacketRec, ein Recordtyp.

Nun (etwas später) will ich den Record wieder auslesen:
Delphi-Quellcode:
PacketRec := PPacketRec(LVItem.lParam);
Leider bekomm ich hier eine AV. Kann mir jemand helfen?

Christian Seehase 30. Jun 2003 20:49

Moin Chewie,

Delphi-Quellcode:
LVItem.lParam := Integer(PacketRec);
müsste wohl

Code:
LVItem.lParam := Integer([color=red]@[/color]PacketRec);
heissen.

Die genaue Deklaration von PacketRec wäre eventuell recht hilfreich.

Chewie 30. Jun 2003 21:03

Das bringt auch nix.

Ich hab mich etwas missverständlich ausgedrückt. Also hier die Deklaration:

Delphi-Quellcode:
type
  TPacketRec = packed record
    {...}
  end;
  PPacketRec = ^TPacketRec;

var
  PacketRec: PPacketRec;
PacketRec ist also schon ein Zeiger.

Christian Seehase 30. Jun 2003 21:56

Moin Chewie,

nur noch mal zum Verständnis:
Bei dieser Zeile bekommst Du eine AV

Delphi-Quellcode:
PacketRec := PPacketRec(LVItem.lParam);
:shock:

Chewie 1. Jul 2003 16:41

Nein, natürlich nicht :oops: :duck:
Natürlich erst, wenn ich auf ein Element des Records zugreife:

Delphi-Quellcode:
PacketRec := PPacketRec(LVItem.lParam);
                if PacketRec <> nil then
                begin
                  ShowErrorMsg(PacketRec.srcHost, 'Hinweis', hWnd);
                end
                else ShowErrorMsg('Keine Daten', 'Fehler', hWnd);
Sorry nochmal :angle:

[EDIT]: ShowErrorMsg ist eine Kapselung von MessageBox.[/EDIT]

Chewie 1. Jul 2003 18:58

Ach, verdammt, wieder so ein einfacher Fehler. Ich muss mich schämen. Der Fehler lag nicht an der Adresse, sondern daran, dass ich das Feld mit der Adresse gar nicht anfordere.

Folgendermaßen muss ich natürlich das Feld lParram holen:

Delphi-Quellcode:
    with PNMHdr(lParam)^ do
      begin
        //falls es das Listview war...
        if hWndFrom = hIncIPView then
        begin
          case code of
            //Item wurde ausgewählt
            LVN_ITEMACTIVATE:
            begin
              with PNMITEMACTIVATE(lParam)^ do
              begin
                LVItem.iItem := iItem;
                LVItem.iSubItem := 0;
                LVItem.mask := LVIF_PARAM; //<--
                ListView_GetItem(hIncIPView, LVItem);
                PacketRec := PPacketRec(LVItem.lParam);
              end;
            end;
          end;
        end;
      end;
Das markierte Stück hab ich natürlich vergessen. :wall: Jetzt klappt alles.

Mein Problem mit den Icons hab ich allerdings immer noch, falls also noch jemand zu diesem Thread eine Idee hat - ich wär glücklioch :D


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