Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Laufzeitfehler mit eigenem Typ (https://www.delphipraxis.net/133660-laufzeitfehler-mit-eigenem-typ.html)

64Jabor 6. Mai 2009 17:09


Laufzeitfehler mit eigenem Typ
 
Hallo DP,

ich möchte gerne zur Laufzeit meines Programmes eine eigene Klasse erstellen.
Diese Klasse soll einen Computer repräsentieren und zwei Label für den Namen und die IP-Adresse besitzen.

Delphi-Quellcode:
type
 TLCComputer = class
  public
   Name, IP: TLabel;
   Column, Row: integer;
 end;
So habe ich den Typ definiert und nun möchte ich gerne eine Instanz davon erzeugen, sodass die Labels auch sichtbar werden.

Mit Computers vom Typ "array of TLCComputers" versuche ich per

Delphi-Quellcode:
 SetLength(Computers, Length(Computers) + 1);

 Computers[Length(Computers)-1].Name := TLabel.Create(self);
 Computers[Length(Computers)-1].Name.Parent := FrmLC;
 Computers[Length(Computers)-1].Name.Left := Column * (cComputerWidth + cComputerSpaceV);
 Computers[Length(Computers)-1].Name.Top := Row *   (cComputerHeight + cComputerSpaceH);

 Computers[Length(Computers)-1].IP := TLabel.Create(self);
 Computers[Length(Computers)-1].IP.Parent := FrmLC;
 Computers[Length(Computers)-1].IP.Left := Column * (cComputerWidth + cComputerSpaceV);
 Computers[Length(Computers)-1].IP.Top := Row *   (cComputerHeight + cComputerSpaceH) + 10;
zur Laufzeit die Label zu erstellen und auf dem Formular "FrmLC" zu erschaffen.

Jedoch erhalte ich beim Start stets nur Zugriffsverletzungen...
Was mache ich falsch?

Schonmal danke für eure Hilfe!

greetZ 64Jabor

jaenicke 6. Mai 2009 17:16

Re: Laufzeitfehler mit eigenem Typ
 
Und wo erstellst du die Klasse? ;-)

// EDIT:
Nebenbei: Wie wäre es mit einer Integervariablen, in der du den Index speicherst? ;-)

64Jabor 6. Mai 2009 17:18

Re: Laufzeitfehler mit eigenem Typ
 
In einer eingebunden Unit

//ja das macht Sinn :D Aber erstmal hat mir das STR+C drücken Spaß gemacht xD

jaenicke 6. Mai 2009 17:19

Re: Laufzeitfehler mit eigenem Typ
 
Zitat:

Zitat von 64Jabor
In einer eingebunden Unit

Warum hast du die entsprechende Zeile dann nicht mit gepostet? :roll:

Ok, wenn die Klasse erstellt ist, dann sollte das soweit korrekt sein.

64Jabor 6. Mai 2009 17:21

Re: Laufzeitfehler mit eigenem Typ
 
Meinst du das

Delphi-Quellcode:
uses MyUnits;
oder die gesamte Unit?
Die Unit wäre:

Delphi-Quellcode:
unit uLC_Computer;

interface

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

type
 TLCComputer = class
  public
   Name, IP: TLabel;
   Column, Row: integer;
 end;

implementation

end.
Habe zur Sicherheit mal alles eingebunden xD

jaenicke 6. Mai 2009 17:24

Re: Laufzeitfehler mit eigenem Typ
 
Ja, aber irgendwo musst du doch die Klasse TLCComputer in deinem Array erstellen. Den entsprechenden Teil des Quelltextes hast du nicht gepostet oder du machst das gar nicht...
Delphi-Quellcode:
SetLength(Computers, Length(Computers) + 1);
Computers[High(Computers)] := TLCComputer.Create;
Freigeben darfst du am Ende natürlich nicht vergessen, wenn das Programm beendet wird.

Warum nimmst du eigentlich nicht einfach eine TObjectList statt des Arrays? OwnsObjects auf True und du musst dich um die Freigabe nicht mehr kümmern.

jfheins 6. Mai 2009 17:26

Re: Laufzeitfehler mit eigenem Typ
 
Die Klasse sollte die Labels selbst erstellen und nicht public zugänglich machen ;)

Also einen Konstruktor rein und am besten gleich von T(Win)Control ableiten, dann kann die Klasse die Labels auch direkt beinhalten.

So könnte man auch direkte 2 Arrays für die Labels nehmen. Das eigene Control hat noch den Vorteil, dass die Labels zueinander leichter ausgerichtet werden können ;)

himitsu 6. Mai 2009 17:27

Re: Laufzeitfehler mit eigenem Typ
 
er meint wo erstellst du diese Klasseninstanz?

> TLCComputer.Create

Delphi-Quellcode:
SetLength(Computers, Length(Computers) + 1);
Computers[High(Computers)] := TLCComputer.Create;
Computers[High(Computers)].Name := TLabel.Create(self);
...
und vergiß nicht deine Klasse auch wieder mit .Free freizugeben, wenn du sie löschts :!:

PS: warum eine Klasse?
so wie es jetzt ist, reicht ein Record auch aus und der muß nicht erst erstellt werden. :angel2:

64Jabor 6. Mai 2009 17:31

Re: Laufzeitfehler mit eigenem Typ
 
Uhm also ich gebe die "Computers" wieder frei in der OnClose.
Ich definiere das Array aus meiner Klasse in dem private-Teil des Formulares:

Delphi-Quellcode:
private
 { Private-Deklarationen }
 Computers: Array of TLCComputer;
Eine TObjectList? Das werde ich mir mal näher ansehen!

Oh man, ja ich hatte ja gar keine Instanz der Klasse erstellt -.-
Vielen Dank!

Nun ich möchte es recht einfach halten, wäre das dann mit record oder eher mit der ObjectList einfacher?
Ich kenne mich damit noch nicht so aus, ich hab vorher noch nie eine Klasse erstellt :coder:

//edit Wenn ich eine Instaz der Klasse vorher erstelle bleibt der Zugriffsfehler aus, super!

64Jabor 6. Mai 2009 17:50

Re: Laufzeitfehler mit eigenem Typ
 
Also ich habe die Klasse jetzt folgendermaßen abgeändert:

Delphi-Quellcode:
unit uLC_Computer;

interface

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

const
 cComputerWidth = 100;
 cComputerHeight = 100;
 cComputerSpaceV = 10;
 cComputerSpaceH = 10;

type
 TLCComputer = class(TWinControl)
  private
   Name, IP: TLabel;
   Column, Row: integer;

  public
   constructor Create(NName, NIP: string; Column, Row: integer);
 end;

implementation

constructor TLCComputer.Create(NName, NIP: string; Column, Row: integer);
begin
 Name := TLabel.Create(self);
 Name.Parent := self;
 Name.Caption := NName;
 Name.Left := Column * (cComputerWidth + cComputerSpaceV);
 Name.Top := Row   * (cComputerHeight + cComputerSpaceH);

 IP  := TLabel.Create(self);
 IP.Parent := self;
 IP.Caption := NIP;
 IP.Left  := Column * (cComputerWidth + cComputerSpaceV);
 IP.Top := Row   * (cComputerHeight + cComputerSpaceH) + 10;
end;

end.
Ich erstelle nun einen neuen Computer per

Delphi-Quellcode:
procedure TFrmLC.BtnAddComputerClick(Sender: TObject);
var
 Name, IP: string;
 Column, Row: integer;
begin
 Name := InputBox('Computername', 'Bitte geben Sie einen Computernamen an:', '');
 IP  := InputBox('IP-Adresse', 'Bitte geben Sie die IP-Adresse des Computers an:', '');
 
 SetLength(Computers, Length(Computers) + 1);
 Computers[Length(Computers)-1] := TLCComputer.Create(Name, IP, Column, Row);
end;
Dabei kommen zwar keine Fehler mehr auf, aber die Labels werden nicht sichtbar...
Muss ich die Parent-Eigenschaft der Labels etwa zwingend auf mein Formular setzen?

//edit: Sorry fürs Doppelpost :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.
Seite 1 von 3  1 23      

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