Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was mache ich falsch? (https://www.delphipraxis.net/3987-mache-ich-falsch.html)

[TP]Hawk274 10. Apr 2003 11:47


Was mache ich falsch?
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  ptrEmployment = ^TEmployment;
  TEmployment = record
    FWorkInstruction   : String; //ausgeführte Tätigkeit
    FDuration          : Double; //Dauer
    FDepartment        : String; //Abteilung pro Tätigkeit
  end;

  TTest = class
  private
    FEmployment: Array[0..4] of TEmployment;
    function GetWorkInstruction(nIndex: Integer): String;
  public
    property Taetigkeit[nIndex: Integer]: String read GetWorkInstruction;
    constructor Create;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Montag: TTest;
  end;

  var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TTest }

constructor TTest.Create;
var
  i: Integer;
begin
  for i := 0 to 4 do
  begin
    FEmployment[ i ].FWorkInstruction := '';
    FEmployment[ i ].FDuration := 0;
    FEmployment[ i ].FDepartment := '';
  end;
  FEmployment[ 0 ].FWorkInstruction := 'Test';
end;

function TTest.GetWorkInstruction(nIndex: Integer): String;
begin
  Result := FEmployment[ nIndex ].FWorkInstruction;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Montag.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Caption := Montag.Taetigkeit[ 0 ];
end;

end.
Wenn ich nun ein Objekt der Klasse TTest erzeuge und anschließend den Konstruktur aufrufe, dann kommt dauernt eine Access Violation. Aber warum? Ich versteh es nicht? Muss ich vielleicht vorher noch Speicher reservieren? Kann mir das vielleicht jemand mal erklären, steige nicht hinter den Fehler!
thx

Tom 10. Apr 2003 12:00

Zitat:

Zitat von [TP
Hawk274]
Delphi-Quellcode:
constructor TTest.Create;
var
  i: Integer;
begin
  for i := 0 to 4 do

Du hast nach dem Begin ein Inherited vergessen. Ist aber nicht die Ursache für den Fehler:

Zitat:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Montag.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Caption := Montag.Taetigkeit[ 0 ];
end;

1) Ich hoffe mal, dass Du nur zu Testzwecken den Anwender nötigst erst auf Button1 und dann auf Button2 zu klicken.
2) Montag musst Du erst einmal erstellen:
Delphi-Quellcode:
Montag.Create;
Montag gibt es nicht, also kannst Du auch nicht auf eine Methode von Montag zugreifen. Also:
Delphi-Quellcode:
Montag := TTest.Create;

sakura 10. Apr 2003 12:02

Zwei Änderungen:

Code:
constructor TTest.Create;
var
  i: Integer;
begin
  [color=#1100ff]// einfügen
  inherited;[/color]
  for i := 0 to 4 do
  begin
    FEmployment[ i ].FWorkInstruction := '';
    FEmployment[ i ].FDuration := 0;
    FEmployment[ i ].FDepartment := '';
  end;
  FEmployment[ 0 ].FWorkInstruction := 'Test';
end;


// und
// anstatt
Monatg.Create
// musst Du folgendes schreiben:
[color=#1100ff]Montag := TTest.Create;[/color]
...:cat:...

[TP]Hawk274 10. Apr 2003 16:11

Zitat:

1) Ich hoffe mal, dass Du nur zu Testzwecken den Anwender nötigst erst auf Button1 und dann auf Button2 zu klicken.
2) Montag musst Du erst einmal erstellen:
Das ist nur ein Programm zu Testzwecken. Dieses Programm werde nur ich bedienen. Ich werde immer erst auf Button1 und dann auf Button2 drücken. Soviel zum Ablauf.
Zitat:

Montag gibt es nicht, also kannst Du auch nicht auf eine Methode von Montag zugreifen.
Stimmt :hello: ... *KopfAufDieTastaturSchlag* ...
Zitat:

Du hast nach dem Begin ein Inherited vergessen.
Warum denn das? Ich leite doch meine Klasse von keiner ab?
Ist es eigentlich ratsam eine Klasse immer von TObject abzuleiten?

Tom 10. Apr 2003 23:02

Zitat:

Zitat von [TP
Hawk274]Warum denn das? Ich leite doch meine Klasse von keiner ab?

Nicht? Woher kommen dann schon Methoden wie Free etc? Aus der Delphi-Hilfe
Zitat:

Wird keine Vorfahrklasse angegeben, erbt die neue Klasse direkt vom vordefinierten Basistyp TObject.
Simsalabim ..., da ist ein Vorfahre ...

Zitat:

Ist es eigentlich ratsam eine Klasse immer von TObject abzuleiten?
Mindestens werden diese immer von TObject abgeleitet. Nachfolge-Klassen von TObjekt sind natürlich auch sinnvoll:
TObject > ... > TEdit > TMyEdit


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