AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Laufzeitfehler mit eigenem Typ

Ein Thema von 64Jabor · begonnen am 6. Mai 2009 · letzter Beitrag vom 6. Mai 2009
Antwort Antwort
Seite 1 von 3  1 23      
64Jabor

Registriert seit: 9. Jan 2008
158 Beiträge
 
Delphi 7 Personal
 
#1

Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:09
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
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:16
Und wo erstellst du die Klasse?

// EDIT:
Nebenbei: Wie wäre es mit einer Integervariablen, in der du den Index speicherst?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
64Jabor

Registriert seit: 9. Jan 2008
158 Beiträge
 
Delphi 7 Personal
 
#3

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:18
In einer eingebunden Unit

//ja das macht Sinn Aber erstmal hat mir das STR+C drücken Spaß gemacht xD
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:19
Zitat von 64Jabor:
In einer eingebunden Unit
Warum hast du die entsprechende Zeile dann nicht mit gepostet?

Ok, wenn die Klasse erstellt ist, dann sollte das soweit korrekt sein.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
64Jabor

Registriert seit: 9. Jan 2008
158 Beiträge
 
Delphi 7 Personal
 
#5

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:21
Meinst du das

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
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:24
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:26
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:27
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
64Jabor

Registriert seit: 9. Jan 2008
158 Beiträge
 
Delphi 7 Personal
 
#9

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:31
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

//edit Wenn ich eine Instaz der Klasse vorher erstelle bleibt der Zugriffsfehler aus, super!
Sebastian
  Mit Zitat antworten Zitat
64Jabor

Registriert seit: 9. Jan 2008
158 Beiträge
 
Delphi 7 Personal
 
#10

Re: Laufzeitfehler mit eigenem Typ

  Alt 6. Mai 2009, 18:50
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
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19:46 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