AGB  ·  Datenschutz  ·  Impressum  







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

Eigenen Typ in Klasse

Ein Thema von zer00 · begonnen am 15. Jul 2006 · letzter Beitrag vom 9. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von zer00
zer00

Registriert seit: 7. Okt 2003
95 Beiträge
 
Delphi 2005 Professional
 
#1

Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:32
Hi all

Ich möchte in einer eigenen Klasse einen Record-Typ in einem Dynamischen Array speichern, nun sollte aber der Record-Typ auch von aussen sichtbar sein.
Der User der Klasse soll eine neue Variable des Record-Typs deklarieren können und diese dann an eine Methode der Klasse übergeben.
z.B. so:

Delphi-Quellcode:
var Foo: TRecord;
Klasse.Add(foo);
Leider habe ich keine Ahnung wie ich das in meiner Klasse implementieren muss.

grz zer00
sei kühn, sei immer kühn, sei nicht zu kühn
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#2

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:42
Deine add proc könnte so aussehen:
Delphi-Quellcode:
procedure tetc.add(foo: Tdeinrecord);
begin
  setlength(derarray, length(derarray)+1)
  derarray[length(derarray)]:= foo;
end;
(aus dem kopf)
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#3

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:44
So vielleicht:
Delphi-Quellcode:
TRecord = record
  Data: string;
  Data2: Integer;
end;

TTest = class(TObject)
private
  FData: TList;
public
  constructor Create;
  destructor Detroy; override;
  property: Data: TList read FData write FData;
  procedure Add(Data: TRecord);
end;

constructor TTest.Create;
begin
  inherited Create;
  FList := TList.Create;
end;

destructor TTest.Destroy;
begin
  FList.Free;
  inherited Destroy;
end;

procedure TTest.Add(Data: TRecord);
begin
  FData.Add(@Data);
end;
Quellcode ungetestet. Nur so runtergetippt. Auch die Speicherverwaltung der Records(new, dispose) fehlt noch. Sollte aber so ne Idee von dem geben, wie das aussehen könnte. BTW: Warum willst du eigentlich n Record nehmen? Warum nicht auch ne Klasse. Dann könntest du dir die Speicherverwaltung nämlich schenken(TObjectList, ggf. + Template).

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
chaoslion

Registriert seit: 1. Mär 2006
52 Beiträge
 
#4

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:46
mal ne Frage, ist es nicht "sicherer", alle Daten eines Records exakt zu übertragen, also

Delphi-Quellcode:
procedure add( foo: trec );
begin
 self.arrayoftrec[..].t1 := foo.t1;
 self.arrayoftrec.t2 := foo.t2;
end;
anstatt zu sagen:
Delphi-Quellcode:
...
 self.arrayoftrec[...] := foo;
...
??
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#5

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:55
Zitat von chaoslion:
mal ne Frage, ist es nicht "sicherer", alle Daten eines Records exakt zu übertragen?
Warum? Wenn du die selbe Record-Deklaration hast und alles andere wäre...ähm...komisch, dann is die andere Variante nur mehr Schreibarbeit und muss dazu noch jedes Mal, wenn sich der Record-Typ ändert, neu angepasst werden...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 12:59
Moin arbu man,

wobei man aus Performance Gründen nicht gerade immer um 1 erhöhen sollte.
Erst einmal auf die zu erwartende Grösse setzen, und beim Hinzufügen prüfen, ob noch Platz ist, dann ggf. um einen bestimmten Wert erhöhen.
Beim Vergrössern mittels SetLength wird jedesmal ein neues Array angelegt, und der Inhalt des alten dort hineinkopiert.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 13:05
Auf jeden Fall sollte man nur die gültigen Elemente des Arrays benutzen:

Delphi-Quellcode:
procedure tetc.add(foo: Tdeinrecord);
begin
  setlength(derarray, length(derarray)+1)
  derarray[High(derarray)]:= foo; // <-- High() statt Length()
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 20:55
Zitat von Hawkeye219:
Auf jeden Fall sollte man nur die gültigen Elemente des Arrays benutzen:

Delphi-Quellcode:
procedure tetc.add(foo: Tdeinrecord);
begin
  setlength(derarray, length(derarray)+1)
  derarray[High(derarray)]:= foo; // <-- High() statt Length()
end;
Hi,
noch viel besser ist es, hier einfach gar kein Array zu verwenden. Ein Array ist nun mal eine recht statische Struktur und
setLength(Array, length(Array) + 1); ist nicht wirklich empfehlenswert (kostet unnötig Zeit und wird vom Speichermanager nicht unbedingt optimal gelöst). Viel besser ist es, wenn du einfach eine TList verwendest, die ist genau dafür gedacht. An sich kannst du deine Records viel schöner als Pointer auf den Record übergeben (ist schneller) und diesen Pointer kannst du dann in deiner TList speichern. Wenn du lesend auf das Array zugreifst, dann kannst du hier ganz einfach eine Methode anlegen, die die TList in ein Array umwandelt. Schreibend kannst du auch Wahlfrei auf die TList zugreifen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#9

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 21:16
Zitat von Der_Unwissende:
Viel besser ist es, wenn du einfach eine TList verwendest, die ist genau dafür gedacht. An sich kannst du deine Records viel schöner als Pointer auf den Record übergeben (ist schneller) und diesen Pointer kannst du dann in deiner TList speichern. Wenn du lesend auf das Array zugreifst, dann kannst du hier ganz einfach eine Methode anlegen, die die TList in ein Array umwandelt. Schreibend kannst du auch Wahlfrei auf die TList zugreifen.
Den Vorschlag kenn ich doch irgendwo her...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von zer00
zer00

Registriert seit: 7. Okt 2003
95 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Eigenen Typ in Klasse

  Alt 15. Jul 2006, 23:16
Danke für die vielen Antworten!
Sehe ich das richtig, dass ich mein Problem am besten mit einer Verketteten Liste löse.
Da ich aber noch nie viel mit Pointern gearbeitet habe werde ich sicher noch ein paar Fragen an euch haben.
Bitte habt ein bisschen Geduld.

grz zer00
sei kühn, sei immer kühn, sei nicht zu kühn
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:44 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