Einzelnen Beitrag anzeigen

Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Pointer aus SendMessage nicht dereferenzierbar?

  Alt 30. Aug 2011, 20:17
Delphi-Quellcode:
PTimeBinar = ^TTimeBinar;
TTimeBinar = record
  Stunden : array[1..5] of boolean;
  Minuten : array[1..6] of boolean;
  Sekunden : array[1..6] of boolean;
end;

PostMessage(Form1.Handle,WM_TIME_ANNOUNCING,1,Integer(@PTimeBinar));

procedure TForm1.OnTimeAnnounce(var Msg: TMessage);
var
  p : TTimeBinar;
begin
case Msg.WParam of
  1:
  begin
    p := PTimeBinar(Msg.LParam)^;
  end;
{..}

PTimeBinar(Msg.LParam)^ =
Interpretiere Msg.LParam als PTimeBinar - bei diesem Typ handelt es sich um nen Pointer, weswegen auch folgender Schritt möglich ist - und dereferenziere diesen nach p (heißt kopiere den Inhalt des Pointers in die lokale, nichtsaussagende Variable p)

Falls du keine Berechnungen damit durchführen musst bzw. wenn die Änderung auch die echten Daten betreffen darf, wäre es besser, direkt mit Pointern zu arbeiten - sprich du machst folgendes:
Delphi-Quellcode:
var
  p : PTimeBinar;
{..}
  p := PTimeBinar(Msg.LParam);
EDITH:
Übrigens, in Delphi gibts die Konvention, Typendeklarationen mit T zu beginnen wie korrigierterweise TTimeBinar.
Dasselbe gilt auch für Pointer zu den definierten Typen, die..
mit P wie in PTimeBinar begonnen werden und
direkt über die Typendeklaration ihren Platz zu suchen haben...

Warum ich dir das klar mache.. nun
  PostMessage(Form1.Handle,WM_TIME_ANNOUNCING,1,Integer(PTimeBinar)); Ne Variable, die nen Typnamen hat ("PTimeBinar"), ist verwirrend und irritierend =P

Edith, die Zweite; Potenzieller Bug:
Verwende keine Pointer auf lokale Variablen, da zur Laufzeit diese immer wieder überschrieben werden können (zB. durch ständiges aufrufen derselben Methode, wo sich die Daten, auf die gepointet wird, befinden)!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (30. Aug 2011 um 20:30 Uhr)
  Mit Zitat antworten Zitat