AGB  ·  Datenschutz  ·  Impressum  







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

Komponente erweitern

Offene Frage von "Maiky"
Ein Thema von Maiky · begonnen am 14. Nov 2006 · letzter Beitrag vom 14. Nov 2006
Antwort Antwort
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#1

Komponente erweitern

  Alt 14. Nov 2006, 13:03
Hallo.

Ich arbeite normal mit dem CBuilder, habe jedoch eine Komponente die auf Pascal basiert und jetzt ein Modifikationsproblem, da ich mich mit Pascal noch nicht so gut auskenne.

Ich möchte der Komponente eine Funktionalität hinzufügen.

Ich möchte gern in diese Komponente zusätzlich Daten ablegen und zwar zusammengehörige: {Name, Anzahl, WertProStueck} und das ähnlich wie ein TStringList mit Add beliebig viele hinzufügen und mit Delete(index) löschen können.

DieKomponente.Daten.Add("Name1",2,5);
DieKomponente.Daten.Add("Name2",1,3);
DieKomponente.Daten.Add("Name3",4,2);
DieKomponente.Daten.Delete(2); // entfernt ("Name2",1,3)

Kennt jemand dafür vielleich ein Tutorial oder kann helfen?

So habe ich angefangen, komme aber irgendwie nicht weiter

Delphi-Quellcode:
Daten = Record
   Name: WideString;
   Anzahl: Integer;
   WertProStueck: Integer;
end;

DatenArray = class
private
   Datas: array of Daten;
public
   procedure Add(Name: WideString, Anzahl: Integer, WertProStueck: Integer);
   procedure Delete(Index: Integer);
end;

MeineKomponente = class
private
public
   property Items: DatenArray ????
end;

constructor DatenArray.Create;
begin
end;

destructor DatenArray.Destroy;
begin
end;

procedure DatenArray.Add(Name: WideString, Anzahl: Integer, WertProStueck: Integer);
begin
end;

procedure Delete(Index: Integer);
begin
end;
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#2

Re: Komponente erweitern

  Alt 14. Nov 2006, 15:52
Ich habe mich mal weiter dran probiert

Delphi-Quellcode:
Daten = Record
   Name: WideString;
   Anzahl: Integer;
   WertProStueck: Integer;
end;

DatenArray = class
private
   SList: TList;
public
   constructor Create;
   destructor Destroy; override;
   procedure Add(Name: WideString; Anzahl: Integer; WertProStueck: Integer);
   procedure Delete(Index: Integer);
end;


implementation {===============================================================}


constructor DatenArray.Create;
begin
   SList := TList.Create;
end;

destructor DatenArray.Destroy;
begin
   SList.Free;
end;

procedure DatenArray.Add(Name: WideString; Anzahl: Integer; WertProStueck: Integer);
begin
   
   ?????????

   datenx.Name := Name;
   datenx.Anzahl := Anzahl;
   datenx.WertProStueck := WertProStueck;
   SList.Add(datenx);
end;

procedure DatenArray.Delete(Index: Integer);
begin
   SList.Delete(Index);
end;
Mein Problem nun liegt in de Zeile "SList.Add(datenx);" bzw besser gesagt wie reserviere ich Speicher für das "Daten : Record", damit ich es in die SList eintragen kann??
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Komponente erweitern

  Alt 14. Nov 2006, 16:10
du musst dafür "Daten" (besser TDaten) einen Pointertyp anlegen
Delphi-Quellcode:
Daten = Record
   Name: WideString;
   Anzahl: Integer;
   WertProStueck: Integer;
end;
//neu
PDaten = ^Daten;
dann kannst du mit
Delphi-Quellcode:
var
  DatenVariable: PDaten;
begin
  new(DatenVariable);
speicher für PDaten anfordern und mit
DatenVariable^.Anzahl := ... Dinge zuweisen.
Da es sich dann um einen Pointertyp handelt kann dieser auch der TList hinzugefügt werden.
mit
Dispose(SList.Item[i]); kann dann der reservierte Speicher wieder frei gegeben werden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#4

Re: Komponente erweitern

  Alt 14. Nov 2006, 17:20
Danke für die Hilfe!! Ich dachte es wäre nun soweit, aber in CBuilder sagt er bei:
MeineKomponente->MyItems->Add("huhu,1,2) Speichererror

Vielleicht jemand der sieht warum?
Ich mach den Quelltext in Texteditor und compiliere per Commandline ~.~

Delphi-Quellcode:
PDaten = ^TDaten;
TDaten = Record
   Name: WideString;
   Anzahl: Integer;
   WertProStueck: Integer;
end;

TDatenArray = class
private
   SList: TList;
public
   constructor Create;
   destructor Destroy;
   function Read(Index: Integer) : PDaten;
   procedure Add(Name: WideString; Anzahl: Integer; WertProStueck: Integer);
   procedure Delete(Index: Integer);
   function Count : Integer;
end;



// MAIN KOMPONENTE
MeineKomponente = class(TComponent)
private
   FMyItems : TDatenArray;
published
   property MyItems: TDatenArray read FMyItems;
end;



constructor TDatenArray.Create;
begin
   SList := TList.Create;
end;

destructor TDatenArray.Destroy;
begin
   SList.Free;
end;

procedure TDatenArray.Add(Name: WideString; Anzahl: Integer; WertProStueck: Integer);
var
   DatenVariable: PDaten;
begin
   new(DatenVariable);
   DatenVariable^.Name := Name;
   DatenVariable^.Anzahl := Anzahl;
   DatenVariable^.WertProStueck := WertProStueck;
   SList.Add(DatenVariable);
end;

function TDatenArray.Read(Index: Integer) : PDaten;
begin
   Result := nil;
   if ((Index>=0) AND (Index<SList.Count)) then
   begin
   Result := SList.Items[Index];
   end;
end;

function TDatenArray.Count : Integer;
begin
   Result := SList.Count;
end;

procedure TDatenArray.Delete(Index: Integer);
var
   daten : PDaten;
begin
   if ((Index>=0) AND (Index<SList.Count)) then
   begin
      daten := SList.Items[Index];
      SList.Delete(Index);
      Dispose(daten);
   end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Komponente erweitern

  Alt 14. Nov 2006, 17:31
so wie es aussieht hast du nirgends die Instanz von "MyItems" erzeugt.
Somit ist
MeineKomponente->MyItems nil (NULL)

Also einfach für "MeineKomponente" noch einen Constructor und Destructor anlegen wo du "FMyItems" mit "TDatenArray.Create" erzeugst.

Was auch verwirrend ist. Deine Klasse heißt "MeineKomponente" und deine Instanzvariable heißt auch so. In Delphi ist es üblich einer Klasse ein "T" vorran zu stellen wie du es auch bei "TDatenArray" gemacht hast.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#6

Re: Komponente erweitern

  Alt 14. Nov 2006, 17:35
Argh, GENAU DAS WARS
Vielen Dank! Super Hilfe, geht jetzt alles

Das mit dem "T" Wird beherzigt, danke.
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#7

Re: Komponente erweitern

  Alt 14. Nov 2006, 18:08
Eine Frage hätte ich jetzt doch noch abschliessend (sorry, nächstes mal Edit)


Delphi-Quellcode:
TMeineKomponente = class(TComponent)
private
   FMyItems : TDatenArray;
published
   property MyItems: TDatenArray read FMyItems;
end;

Das funktioniert nun wo ich in Create es erstelle und Destroy wieder freigebe.
Mein letztes Problem nun ist, das ich eine Klasse habe die viele Klassen vereint.


Delphi-Quellcode:
TDocuemnt = class(TComponent)
private
   FKomp : TMeineKomponente;
public
   procedure SaveToTextFile(AFileName: string);
end;

Ist noch etwas komplexer, da TMeineKomponente noch vorher in einer weiteren Klasse liegt und erst diese in TDocument enthalten ist.

Die geniale Funktion SaveToTextFile speichert die "Komponente" als Textfile. Diese sieht dann aus wie eine DFM Datei, nur leider ist dort nirgends mein "MyItems" aus "TMeineKomponente" enthalten.

Wenn ich in "TMeineKomponente" ein weiteres Property wie Integer oder so einfüge, dann ist es im Textfile.

Woran könnte das liegen? Ist TDatenArray TDocument "unbekannt" oder wie muss ich das verstehen? (Falls mich hier überhaupt wer versteht )
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Komponente erweitern

  Alt 14. Nov 2006, 18:09
Ich würde aus dem Record eine Klasse machen.
Das lohnt sich sobald auf die Daten Funktionen angewendet werden
Delphi-Quellcode:
TDaten = class(TPersistent)
   public
   // die internen Variablen bleiben zunächst public
   // später können diese in Properties verpackt werden
   Name: WideString;
   Anzahl: Integer;
   WertProStueck: Integer;
   function GetGesamtwert:integer; // = Anzahl*WertProStueck
   procedure Clear;
   function AsFormatedString:Ansistring;
end;
Andreas
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#9

Re: Komponente erweitern

  Alt 14. Nov 2006, 18:24
Wie bekommst jetzt mehrere? Du hast lediglich eine Klasse mit 3 Variablen und willst auf die Counter machen? Sehe da jetzt irgendwie nicht wirklich den Sinn.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:47 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