Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer Problem (https://www.delphipraxis.net/141012-pointer-problem.html)

WorstNightmare 30. Sep 2009 15:09


Pointer Problem
 
Hallo,

die Pointer machen mir mal wieder zu schaffen:

Delphi-Quellcode:
procedure TformEinstellungen.UpdateMacroLV(Mac: TMacro);
var
  Cmd: TMacroCommand;
begin
  LVMacro.Items.BeginUpdate;
  try
    LVMacro.Clear;

    // Alles wieder rein
    for Cmd in Mac.Commands do
      with LVMacro.Items.Add do
      begin
        Caption := frmMacro.cbCmdType.Items[Byte(Cmd.CmdType)];
        SubItems.Add(ArrayToStr(Cmd.Parameters));

        Data := @Cmd;  // <--- ?
      end;
  finally
    LVMacro.Items.EndUpdate;
  end;
end;
So, schön und gut. Versuche ich später die Daten abzufragen
Delphi-Quellcode:
Cmd := TMacroCommand(LVMacro.Selected.Data^);
knallts.

Vorher wurde extra immer für ein PMacroCommand Speicher reserviert und die Werte dann eingetragen, allerdings ist jeder Command wie man sieht Teil einer TList<TMacroCommand> und .Remove funktioniert nicht, wenn es eben nicht genau das selbe Objekt ist (wer hätte das gedacht...).

Warum funktioniert denn das schon wieder nicht? Diese Pointer machen mich noch wahnsinnig...

Neutral General 30. Sep 2009 15:13

Re: Pointer Problem
 
Das @ vor dem cmd muss weg.

WorstNightmare 30. Sep 2009 15:14

Re: Pointer Problem
 
Das geht nicht, TMacroCommand ist ja kein Pointer, TListItem.Data aber schon.

Neutral General 30. Sep 2009 15:15

Re: Pointer Problem
 
Wenn TMacroCommand ne Klasse ist, dann schon. Bei nem Record würds stimmen (d.h. ein @ müsste davor)

Aber ich tippe darauf, dass das Problem ist, dass du einen Zeiger auf ne lokale Variable speicherst, der nach dieser Methode nichtmehr gültig ist.

WorstNightmare 30. Sep 2009 15:16

Re: Pointer Problem
 
Es ist ein Record.

Neutral General 30. Sep 2009 15:16

Re: Pointer Problem
 
Zitat:

Aber ich tippe darauf, dass das Problem ist, dass du einen Zeiger auf ne lokale Variable speicherst, der nach dieser Methode nichtmehr gültig ist.
Edit: Versuch mal testweise Cmd global zu definieren.

Edit: Ich glaube ich rede Müll

WorstNightmare 30. Sep 2009 15:20

Re: Pointer Problem
 
Aber wie kann ich das ändern? Direkt auf den Record in der Liste pointen kann ich ja auch nicht (Variable erwartet), und ich kann nicht irgendwie New() benutzen wie früher, da ich ja diesen Record will und nicht irgendeine Kopie (damit TList<>.Remove geht).

Neutral General 30. Sep 2009 15:20

Re: Pointer Problem
 
Ach ich würde es evtl mal so probieren (Weiß aber nich obs nen Unterschied macht):

Delphi-Quellcode:
type
  PMacroCommand = ^TMacroCommand;


Cmd := PMacroCommand(LVMacro.Selected.Data)^;

WorstNightmare 30. Sep 2009 15:23

Re: Pointer Problem
 
Ist glaube ich so ziemlich dasselbe, knallt immer noch :?

jfheins 30. Sep 2009 15:24

Re: Pointer Problem
 
Es sollte mit New() gehen.

Also nen Pointer auf den Record deklarieren, New() verwenden, befüllen eun in der Liste speichern.

Alternativ eine Klasse nehmen ;)


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