AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

EInvalidPointer, warum?

Ein Thema von DualCoreCpu · begonnen am 6. Nov 2019 · letzter Beitrag vom 7. Nov 2019
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

EInvalidPointer, warum?

  Alt 6. Nov 2019, 20:09
Hallo,

ich habe i etwa folgenden Code:

Delphi-Quellcode:
type
  TMenuNameStr = array[0..31] of Ansichar;
  TProgNameStr = array[0..255] of AnsiChar;
  TDirNameStr = array[0..255] of AnsiChar;
  TCfgNameStr = array[0..29] of Ansichar;
  TOptionsStr = array[0..127] of Ansichar;
  TRegisteredCommand = class(TObject)
  private
    FMenuName: TMenuNameStr;
    FProgName: TProgNameStr;
    FDirName: TDirNameStr;
    FOptions: TOptionsStr;
    FCfgFile: TCfgNameStr;
    function GetCfgFile: ShortString;
    function GetDirName: ShortString;
    function GetMenuName: ShortString;
    function GetOptions: ShortString;
    function GetProgName: ShortString;
    procedure SetCfgFile(const Value: ShortString);
    procedure SetDirName(const Value: ShortString);
    procedure SetMenuName(const Value: ShortString);
    procedure SetOptions(const Value: ShortString);
    procedure SetProgName(const Value: ShortString);
  public
   {
    constructor Create;
    destructor Destroy; override;
   }

    constructor Create;
    property MenuName: ShortString read GetMenuName write SetMenuName;
    property ProgName: ShortString read GetProgName write SetProgName;
    property DirName: ShortString read GetDirName write SetDirName;
    property Options: ShortString read GetOptions write SetOptions;
    property CfgFile: ShortString read GetCfgFile write SetCfgFile;
  end;

  TCommandsList = class(TObjectList)
    property Command: TRegisteredCommand read GetCommand write SetCommand;
  end;
Im Hauptprogramm habe ich dann in der MainForm die Felder FCommands: TCommandsList und FCmd: TRegisteredCommand. Das erstere steht für die Kommandoliste, das zweite für ein einzenes Kommando.

Das aktuelle aufzurufende Kommando wähle ich aus einer Liste aus, die mir auf Menüauswahl von einem Dialog bereitgestellt wird. Dazu brauche ich dann mindestens den Zeiger FCmd. FCommands nimmt die gesamte Liste aller Kommandos auf.

Wenn ich nun im Hauptprogramm an FCmd ein Kommando vom dafür vorgesehenen Dialog zuweise und beim Beenden diesen Zeiger freigeben will, erhalte ich die ungültige Zeigeroperation ( EInvalidPointer ).

Den Konstruktor vorher aufrufen führt nicht zum Erfolg.

Im Hauptprogramm beende ich so:

Delphi-Quellcode:
    if (CmdChoose.Cmd <> NIL) and (CmdChoose.Cmd.MenuName <> '') then
    begin
      case CmdChoose.ItemIndex of
        0: begin
             if FCmd <> nil then
             begin
               FCmd.MenuName := CmdChoose.Compiler.MenuName;
               FCmd.DirName := CmdChoose.Compiler.DirName;
               FCmd.ProgName := CmdChoose.Compiler.ProgName;
               FCmd.CfgFile := CmdChoose.Compiler.CfgFile;
               FCmd.Options := CmdChoose.Compiler.Options;
             end
             else
             begin
               FCmd := TCmd.Create;
               FCmd.MenuName := CmdChoose.Compiler.MenuName;
               FCmd.DirName := CmdChoose.Compiler.DirName;
               FCmd.ProgName := CmdChoose.Compiler.ProgName;
               FCmd.CfgFile := CmdChoose.Compiler.CfgFile;
               FCmd.Options := CmdChoose.Compiler.Options;
             end;
             FCmd.OptionsDialog := TFirstCmdOptDlg.Create(self);
        end;
        1: begin
            FCmd := CmdChoose.Cmd;
            dlg := TSecondCmdOptDialog.Create(self);
            FCmd.OptionsDialog := dlg;
        end;
      end;
In einer FormDestroy Methode im Hauptprogramm gebe ich dann die Zeigerfelder FCommands und FCmd frei und da erhalte ich die ungültige Zeigeroperation ( EInvalidPointer ).

Warum?

Wenn ich kein Kommando auswähle, kann ich das Programm ohne Fehler beenden.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: EInvalidPointer, warum?

  Alt 6. Nov 2019, 20:52
Hallo,

Fall 1
FCmd := TCmd.Create;
FCmd wird erzeugt

Fall 2
FCmd := CmdChoose.Cmd;
FCmd wird nicht erzeugt!

gebe FCmd frei
Fall 2
CmdChoose wird doch auch freigegeben, oder ?
Damit zeigt FCmd auf einen bereits freigegebenen Pointer -> Puff
Heiko
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

AW: EInvalidPointer, warum?

  Alt 6. Nov 2019, 21:40
Juhuuuu, danke, das wer es. Ich hatte einne FormCloseQuery Methode, ich der ich die Zeiger frei gegeben habe, dann aber in FormDestroy nochmals. Bingo!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: EInvalidPointer, warum?

  Alt 7. Nov 2019, 08:36
Hallo,
kann man ja auch so machen,
indem man FreeAndNil benutzt.

var
p: Pointer;

FreeAndNil(P);

// dum di dum

FreeAndNil(P); // ergibt keine Fehler
Heiko
  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 23:30 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