AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Integer als Adresse eines Records

Integer als Adresse eines Records

Ein Thema von Chewie · begonnen am 30. Jun 2003 · letzter Beitrag vom 1. Jul 2003
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Integer als Adresse eines Records

  Alt 30. Jun 2003, 20:36
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:
PacketRec := PPacketRec(LVItem.lParam); Leider bekomm ich hier eine AV. Kann mir jemand helfen?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 30. Jun 2003, 20:49
Moin Chewie,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 30. Jun 2003, 21:56
Moin Chewie,

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

PacketRec := PPacketRec(LVItem.lParam);
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 1. Jul 2003, 16:41
Nein, natürlich nicht
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

[EDIT]: ShowErrorMsg ist eine Kapselung von MessageBox.[/EDIT]
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 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. 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
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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