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.